Repository: smartvpnbiz/smartvpn-billing Branch: master Commit: 44ac32aaf542 Files: 593 Total size: 1.2 MB Directory structure: gitextract_v37n_0v_/ ├── .dockerignore ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ └── feature_request.md │ └── PULL_REQUEST_TEMPLATE.md ├── .gitignore ├── .hound.yml ├── .irbrc ├── .rspec ├── .rubocop.yml ├── .travis.yml ├── Dockerfile ├── Dockerfile.dev ├── Gemfile ├── LICENSE ├── Procfile ├── README.md ├── Rakefile ├── Vagrantfile ├── app/ │ ├── assets/ │ │ ├── fonts/ │ │ │ └── FontAwesome.otf │ │ ├── images/ │ │ │ ├── README.txt │ │ │ └── invoice/ │ │ │ └── license.txt │ │ ├── javascripts/ │ │ │ ├── admin.js.coffee │ │ │ ├── application.js.coffee │ │ │ ├── main.js.coffee │ │ │ ├── options.js.coffee │ │ │ └── theme/ │ │ │ ├── bootstrap-affix.js │ │ │ ├── bootstrap-alert.js │ │ │ ├── bootstrap-button.js │ │ │ ├── bootstrap-carousel.js │ │ │ ├── bootstrap-collapse.js │ │ │ ├── bootstrap-dropdown.js │ │ │ ├── bootstrap-modal.js │ │ │ ├── bootstrap-popover.js │ │ │ ├── bootstrap-scrollspy.js │ │ │ ├── bootstrap-tab.js │ │ │ ├── bootstrap-tooltip.js │ │ │ ├── bootstrap-transition.js │ │ │ ├── bootstrap-typeahead.js │ │ │ ├── html5shim.js │ │ │ ├── jquery.flexslider-min.js │ │ │ ├── jquery.quicksand.js │ │ │ └── script.js │ │ └── stylesheets/ │ │ ├── admin.scss │ │ ├── application.scss │ │ ├── main-admin.scss │ │ ├── main.scss │ │ ├── shared.css.scss │ │ └── theme/ │ │ ├── bootstrap.css.scss │ │ ├── custom-colour.css │ │ ├── flexslider.css │ │ ├── responsive.css │ │ └── theme-style.css │ ├── cells/ │ │ └── web/ │ │ ├── admin/ │ │ │ └── change_locale_link_cell.rb │ │ └── base_cell.rb │ ├── controllers/ │ │ ├── admin/ │ │ │ ├── base_controller.rb │ │ │ ├── change_languages_controller.rb │ │ │ ├── connections_controller.rb │ │ │ ├── home_controller.rb │ │ │ ├── options_controller.rb │ │ │ ├── pay_systems_controller.rb │ │ │ ├── plans_controller.rb │ │ │ ├── profiles_controller.rb │ │ │ ├── promos_controller.rb │ │ │ ├── referrers_controller.rb │ │ │ ├── servers_controller.rb │ │ │ ├── traffic_reports_controller.rb │ │ │ ├── transactions_controller.rb │ │ │ └── users_controller.rb │ │ ├── admins/ │ │ │ └── sessions_controller.rb │ │ ├── api/ │ │ │ ├── authentication_controller.rb │ │ │ ├── base_controller.rb │ │ │ ├── connection_controller.rb │ │ │ └── servers_controller.rb │ │ ├── application_controller.rb │ │ ├── billing/ │ │ │ ├── base_controller.rb │ │ │ ├── home_controller.rb │ │ │ ├── merchant_controller.rb │ │ │ ├── options_controller.rb │ │ │ ├── payments_controller.rb │ │ │ ├── paypal_controller.rb │ │ │ ├── promotions_controller.rb │ │ │ ├── referrers_controller.rb │ │ │ ├── robokassa_controller.rb │ │ │ ├── servers_controller.rb │ │ │ └── webmoney_controller.rb │ │ ├── concerns/ │ │ │ └── .keep │ │ ├── main_controller.rb │ │ ├── referrers_controller.rb │ │ └── users/ │ │ ├── passwords_controller.rb │ │ ├── registrations_controller.rb │ │ └── sessions_controller.rb │ ├── decorators/ │ │ ├── admin/ │ │ │ └── options_decorator.rb │ │ ├── option_attribute_decorator.rb │ │ ├── pay_system_decorator.rb │ │ ├── promo_decorator.rb │ │ ├── transaction_decorator.rb │ │ └── user_decorator.rb │ ├── exceptions/ │ │ └── api_exception.rb │ ├── helpers/ │ │ ├── admin_helper.rb │ │ ├── application_helper.rb │ │ ├── main_helper.rb │ │ ├── options_helper.rb │ │ ├── promos_helper.rb │ │ └── servers_helper.rb │ ├── inputs/ │ │ └── datepicker_input.rb │ ├── mailers/ │ │ ├── user_connection_config_mailer.rb │ │ └── user_mailer.rb │ ├── models/ │ │ ├── ability.rb │ │ ├── admin.rb │ │ ├── authenticator.rb │ │ ├── concerns/ │ │ │ ├── .keep │ │ │ └── last_days_filterable.rb │ │ ├── connection.rb │ │ ├── connections/ │ │ │ ├── connect.rb │ │ │ └── disconnect.rb │ │ ├── connector.rb │ │ ├── option.rb │ │ ├── options/ │ │ │ ├── attributes/ │ │ │ │ └── proxy.rb │ │ │ └── hooks/ │ │ │ └── proxy.rb │ │ ├── pay_system.rb │ │ ├── payment.rb │ │ ├── plan.rb │ │ ├── plan_has_server.rb │ │ ├── promo.rb │ │ ├── promoter.rb │ │ ├── promoters/ │ │ │ └── discount_promoter.rb │ │ ├── promoters_repository.rb │ │ ├── promotion.rb │ │ ├── proxy/ │ │ │ ├── connect.rb │ │ │ └── node.rb │ │ ├── proxy.rb │ │ ├── referrer/ │ │ │ ├── account.rb │ │ │ └── reward.rb │ │ ├── referrer.rb │ │ ├── server/ │ │ │ └── signature.rb │ │ ├── server.rb │ │ ├── server_config.rb │ │ ├── test_period.rb │ │ ├── traffic_report.rb │ │ ├── traffic_reports/ │ │ │ ├── date_traffic_report.rb │ │ │ ├── server_traffic_report.rb │ │ │ └── user_traffic_report.rb │ │ ├── transaction.rb │ │ ├── user.rb │ │ ├── user_option.rb │ │ ├── withdrawal.rb │ │ └── withdrawal_prolongation.rb │ ├── operations/ │ │ └── ops/ │ │ └── admin/ │ │ └── user/ │ │ ├── base.rb │ │ └── create.rb │ ├── ransackers/ │ │ ├── base_ransacker.rb │ │ └── never_paid_users_ransacker.rb │ ├── serializers/ │ │ ├── admin/ │ │ │ └── users_serializer.rb │ │ └── api/ │ │ ├── connect_serializer.rb │ │ ├── connection_serializer.rb │ │ └── disconnect_serializer.rb │ ├── services/ │ │ ├── dto/ │ │ │ ├── admin/ │ │ │ │ ├── dashboard.rb │ │ │ │ ├── discrete_base.rb │ │ │ │ ├── discrete_customers_registrations.rb │ │ │ │ ├── discrete_payments.rb │ │ │ │ └── discrete_traffic.rb │ │ │ └── base.rb │ │ ├── forced_disconnect.rb │ │ ├── newsletter_manager.rb │ │ ├── option/ │ │ │ ├── activation_price_calc.rb │ │ │ ├── activator.rb │ │ │ └── deactivator.rb │ │ ├── proxy/ │ │ │ ├── fetchers/ │ │ │ │ ├── base.rb │ │ │ │ ├── free_proxy_list_net/ │ │ │ │ │ ├── row_parser.rb │ │ │ │ │ └── web_parser.rb │ │ │ │ └── free_proxy_lists/ │ │ │ │ ├── row_parser.rb │ │ │ │ └── web_parser.rb │ │ │ ├── proxy_dto.rb │ │ │ ├── rater.rb │ │ │ ├── repository.rb │ │ │ └── updater.rb │ │ ├── referrer/ │ │ │ ├── reward_calculator.rb │ │ │ └── rewarder.rb │ │ ├── server_config_builder.rb │ │ ├── unpaid_users_notificator.rb │ │ ├── withdrawal_amount_calculator.rb │ │ └── withdrawer.rb │ ├── uploaders/ │ │ └── config_uploader.rb │ ├── views/ │ │ ├── admin/ │ │ │ ├── connections/ │ │ │ │ ├── _filter.html.slim │ │ │ │ ├── active.html.slim │ │ │ │ ├── index.html.slim │ │ │ │ └── show.html.slim │ │ │ ├── home/ │ │ │ │ └── index.html.slim │ │ │ ├── options/ │ │ │ │ ├── _form.html.slim │ │ │ │ ├── edit.html.slim │ │ │ │ ├── index.html.slim │ │ │ │ └── new.html.slim │ │ │ ├── pay_systems/ │ │ │ │ ├── _form.html.slim │ │ │ │ ├── edit.html.slim │ │ │ │ ├── index.html.slim │ │ │ │ ├── new.html.slim │ │ │ │ └── show.html.slim │ │ │ ├── plans/ │ │ │ │ ├── _form.html.slim │ │ │ │ ├── edit.html.slim │ │ │ │ ├── index.html.slim │ │ │ │ └── new.html.slim │ │ │ ├── profiles/ │ │ │ │ └── edit.html.slim │ │ │ ├── promos/ │ │ │ │ ├── _form.html.slim │ │ │ │ ├── edit.html.slim │ │ │ │ ├── index.html.slim │ │ │ │ └── new.html.slim │ │ │ ├── referrers/ │ │ │ │ ├── _referrals.html.slim │ │ │ │ └── index.html.slim │ │ │ ├── servers/ │ │ │ │ ├── _form.html.slim │ │ │ │ ├── edit.html.slim │ │ │ │ ├── index.html.slim │ │ │ │ ├── new.html.slim │ │ │ │ └── show.html.slim │ │ │ ├── shared/ │ │ │ │ ├── _menu.html.slim │ │ │ │ └── _paginate.html.slim │ │ │ ├── traffic_reports/ │ │ │ │ ├── _filter.html.slim │ │ │ │ ├── _submenu.html.slim │ │ │ │ ├── date.html.slim │ │ │ │ ├── index.html.slim │ │ │ │ ├── servers.html.slim │ │ │ │ └── users.html.slim │ │ │ ├── transactions/ │ │ │ │ ├── index.html.slim │ │ │ │ ├── payments.html.slim │ │ │ │ └── withdrawals.html.slim │ │ │ └── users/ │ │ │ ├── _filter.html.slim │ │ │ ├── _payment.html.slim │ │ │ ├── _prolongation.html.slim │ │ │ ├── _submenu.html.slim │ │ │ ├── _table.html.slim │ │ │ ├── _test_period.html.slim │ │ │ ├── edit.html.slim │ │ │ ├── index.html.slim │ │ │ ├── new.html.slim │ │ │ ├── payers.html.slim │ │ │ ├── show.html.slim │ │ │ └── this_month_payers.html.slim │ │ ├── admins/ │ │ │ ├── confirmations/ │ │ │ │ └── new.html.erb │ │ │ ├── mailer/ │ │ │ │ ├── confirmation_instructions.html.erb │ │ │ │ ├── reset_password_instructions.html.erb │ │ │ │ └── unlock_instructions.html.erb │ │ │ ├── passwords/ │ │ │ │ ├── edit.html.erb │ │ │ │ └── new.html.erb │ │ │ ├── registrations/ │ │ │ │ ├── edit.html.erb │ │ │ │ └── new.html.erb │ │ │ ├── sessions/ │ │ │ │ └── new.html.slim │ │ │ ├── shared/ │ │ │ │ └── _links.erb │ │ │ └── unlocks/ │ │ │ └── new.html.erb │ │ ├── application/ │ │ │ └── _notifications.html.slim │ │ ├── billing/ │ │ │ ├── home/ │ │ │ │ ├── _account_info.html.slim │ │ │ │ ├── _current_connection.html.slim │ │ │ │ ├── _last_transactions.html.slim │ │ │ │ └── index.html.slim │ │ │ ├── options/ │ │ │ │ ├── _subscribed_options.html.slim │ │ │ │ ├── _unsubscribed_options.html.slim │ │ │ │ └── index.html.slim │ │ │ ├── payments/ │ │ │ │ ├── forms/ │ │ │ │ │ ├── _cc.html.slim │ │ │ │ │ ├── _paypal.html.erb │ │ │ │ │ ├── _wmr.html.slim │ │ │ │ │ ├── _wmz.html.slim │ │ │ │ │ └── _yandex.html.slim │ │ │ │ ├── index.html.slim │ │ │ │ ├── merchant.html.slim │ │ │ │ └── new.html.slim │ │ │ ├── referrers/ │ │ │ │ ├── _operations.html.slim │ │ │ │ ├── _referrals.html.slim │ │ │ │ └── index.html.slim │ │ │ └── servers/ │ │ │ └── index.html.slim │ │ ├── kaminari/ │ │ │ ├── _first_page.html.erb │ │ │ ├── _gap.html.erb │ │ │ ├── _last_page.html.erb │ │ │ ├── _next_page.html.erb │ │ │ ├── _page.html.erb │ │ │ ├── _paginator.html.erb │ │ │ └── _prev_page.html.erb │ │ ├── layouts/ │ │ │ ├── admin.html.slim │ │ │ ├── application.html.slim │ │ │ ├── billing.html.slim │ │ │ └── blank.html.slim │ │ ├── mailers/ │ │ │ ├── _signature.html.slim │ │ │ ├── user_connection_config_mailer/ │ │ │ │ └── notify.html.slim │ │ │ └── user_mailer/ │ │ │ ├── balance_withdrawal.html.slim │ │ │ ├── could_not_withdraw_funds.html.slim │ │ │ ├── funds_recieved.html.slim │ │ │ ├── test_period_enabled.html.slim │ │ │ └── unpaid_user_notification.html.slim │ │ ├── main/ │ │ │ ├── auth.html.slim │ │ │ └── index.html.slim │ │ ├── shared/ │ │ │ ├── _footer.html.slim │ │ │ ├── _rollbar_js.html.erb │ │ │ ├── _yandex_metrika.html.erb │ │ │ └── _zendesk.html.erb │ │ └── users/ │ │ ├── confirmations/ │ │ │ └── new.html.erb │ │ ├── mailer/ │ │ │ ├── confirmation_instructions.html.erb │ │ │ ├── reset_password_instructions.html.erb │ │ │ └── unlock_instructions.html.erb │ │ ├── passwords/ │ │ │ ├── edit.html.slim │ │ │ └── new.html.slim │ │ ├── registrations/ │ │ │ ├── _promo.html.slim │ │ │ ├── edit.html.slim │ │ │ └── new.html.slim │ │ ├── sessions/ │ │ │ └── new.html.slim │ │ ├── shared/ │ │ │ └── _links.erb │ │ └── unlocks/ │ │ └── new.html.erb │ └── workers/ │ ├── add_user_to_newsletter_worker.rb │ ├── can_not_withdraw_notification_worker.rb │ ├── create_user_mail_worker.rb │ ├── decrease_balance_mail_worker.rb │ ├── increase_balance_mail_worker.rb │ ├── refresh_proxy_list_worker.rb │ ├── unpaid_user_notification_worker.rb │ ├── update_courses_worker.rb │ └── withdrawals_worker.rb ├── bin/ │ ├── build-image │ ├── bundle │ ├── cop │ ├── rails │ ├── rake │ └── setup ├── config/ │ ├── application.rb │ ├── boot.rb │ ├── clock.rb │ ├── countries.json │ ├── database.yml.sample │ ├── environment.rb │ ├── environments/ │ │ ├── development.rb │ │ ├── production.rb │ │ └── test.rb │ ├── i18n-tasks.yml │ ├── initializers/ │ │ ├── active_merchant.rb │ │ ├── backtrace_silencers.rb │ │ ├── devise.rb │ │ ├── filter_parameter_logging.rb │ │ ├── inflections.rb │ │ ├── kaminari_config.rb │ │ ├── mime_types.rb │ │ ├── rails_config.rb │ │ ├── rollbar.rb │ │ ├── secret_token.rb │ │ ├── session_store.rb │ │ ├── show_for.rb │ │ ├── simple_form.rb │ │ ├── simple_form_bootstrap.rb │ │ └── wrap_parameters.rb │ ├── locales/ │ │ ├── admin/ │ │ │ ├── en.yml │ │ │ └── ru.yml │ │ ├── billing/ │ │ │ ├── en.yml │ │ │ └── ru.yml │ │ ├── devise.en.yml │ │ ├── devise.ru.yml │ │ ├── en.yml │ │ ├── kaminari.en.yml │ │ ├── kaminari.ru.yml │ │ ├── ru.yml │ │ ├── show_for.en.yml │ │ ├── show_for.ru.yml │ │ ├── simple_form.en.yml │ │ ├── simple_form.ru.yml │ │ └── site/ │ │ ├── en.yml │ │ └── ru.yml │ ├── newrelic.yml │ ├── routes.rb │ ├── sample.server.ovpn.erb │ ├── settings/ │ │ ├── development.yml │ │ ├── production.yml │ │ └── test.yml │ └── settings.yml ├── config.ru ├── db/ │ ├── migrate/ │ │ ├── 20130409190444_create_posts.rb │ │ ├── 20130421110154_devise_create_users.rb │ │ ├── 20130421110911_create_admins.rb │ │ ├── 20130501081828_add_fields_to_user.rb │ │ ├── 20130501083417_create_plans.rb │ │ ├── 20130504105921_create_payments.rb │ │ ├── 20130504144707_create_pay_systems.rb │ │ ├── 20130504150703_add_description_to_pay_system.rb │ │ ├── 20130505183444_create_withdrawals.rb │ │ ├── 20130810125453_create_servers.rb │ │ ├── 20130925101441_add_vpn_login_and_vpn_password_to_user.rb │ │ ├── 20131005133458_create_connections.rb │ │ ├── 20131013140201_add_state_to_user.rb │ │ ├── 20140105134117_add_special_and_disabled_to_plan.rb │ │ ├── 20140112113325_create_plan_has_servers.rb │ │ ├── 20140112123216_remove_plan_id_from_server.rb │ │ ├── 20140112180259_add_tunnelblick_bundle_and_ios_bundle_and_linux_bundle_to_server.rb │ │ ├── 20140116192804_add_cant_withdraw_counter_to_user.rb │ │ ├── 20140125084325_replace_configs_by_one_universal.rb │ │ ├── 20140202164317_create_promos.rb │ │ ├── 20140202164614_create_promotions.rb │ │ ├── 20140202175203_add_attributes_to_promo.rb │ │ ├── 20140203184711_add_state_to_promo.rb │ │ ├── 20140207114415_add_promo_id_user_id_uniqueness_index_to_promo.rb │ │ ├── 20140227113644_add_state_to_pay_system.rb │ │ ├── 20140301125212_add_currency_to_pay_system.rb │ │ ├── 20140301130258_add_usd_amount_to_payment.rb │ │ ├── 20140506135933_create_withdrawal_prolongations.rb │ │ ├── 20140507085918_add_manual_payment_to_payment.rb │ │ ├── 20140518132954_create_options.rb │ │ ├── 20140518133314_create_plan_option_table.rb │ │ ├── 20140518134712_add_state_to_option.rb │ │ ├── 20140525091015_add_option_prices_to_plan.rb │ │ ├── 20140525103921_create_options_users.rb │ │ ├── 20140727094748_add_reflink_to_user.rb │ │ ├── 20140728204118_add_referrer_id_to_user.rb │ │ ├── 20140801123341_create_referrer_rewards.rb │ │ ├── 20140805112916_generate_reflink_to_old_users.rb │ │ ├── 20140817131003_create_proxy_nodes.rb │ │ ├── 20140819160419_remove_options_users_table.rb │ │ ├── 20140819160716_create_user_options.rb │ │ ├── 20140823162252_create_proxy_connects.rb │ │ ├── 20140823164144_add_option_attributes_to_connect.rb │ │ ├── 20150104180714_add_state_to_user_option.rb │ │ ├── 20150109161843_add_protocol_to_server.rb │ │ ├── 20150109164839_add_port_to_server.rb │ │ ├── 20150110141211_add_country_code_to_server.rb │ │ ├── 20150125133216_add_test_period_enabled_to_user.rb │ │ ├── 20150125141501_add_test_period_started_at_to_user.rb │ │ ├── 20181014150549_add_default_user.rb │ │ └── 20190122184018_add_pki_to_server.rb │ ├── schema.rb │ ├── seeds/ │ │ ├── 01_options.rb │ │ ├── 02_plans.rb │ │ ├── 03_pay_systems.rb │ │ ├── 04_default_user.rb │ │ ├── 05_default_user_referrals.rb │ │ ├── 06_admin.rb │ │ ├── 07_servers.rb │ │ └── 08_default_user_connects.rb │ └── seeds.rb ├── docker-compose.development.yml ├── lib/ │ ├── assets/ │ │ └── .keep │ ├── bytes_converter.rb │ ├── currencies/ │ │ ├── course.rb │ │ └── course_converter.rb │ ├── exceptions/ │ │ ├── admin_access_denied_exception.rb │ │ ├── api_exception.rb │ │ ├── billing_exception.rb │ │ ├── dto_exception.rb │ │ ├── not_implemented_exception.rb │ │ ├── smartvpn_exception.rb │ │ ├── unauthorized_exception.rb │ │ └── withdrawer_exception.rb │ ├── random_string.rb │ ├── signer.rb │ ├── tasks/ │ │ ├── .keep │ │ ├── assets.rake │ │ └── seed_initial_data.rake │ └── templates/ │ └── erb/ │ └── scaffold/ │ ├── _form.html.erb │ └── show.html.erb ├── public/ │ ├── 404.html │ ├── 500.html │ ├── css/ │ │ ├── bootstrap.css │ │ ├── colour-blue.css │ │ ├── colour-red.css │ │ ├── custom-colour.css │ │ ├── custom-style.css │ │ ├── flexslider.css │ │ ├── font/ │ │ │ └── FontAwesome.otf │ │ ├── responsive.css │ │ └── theme-style.css │ ├── img/ │ │ └── README.txt │ └── index.html ├── spec/ │ ├── cells/ │ │ └── web/ │ │ └── admin/ │ │ └── change_locale_link_cell_spec.rb │ ├── config/ │ │ └── clock_spec.rb │ ├── controllers/ │ │ ├── admin/ │ │ │ ├── change_languages_controller_spec.rb │ │ │ ├── connections_controller_spec.rb │ │ │ ├── options_controller_spec.rb │ │ │ ├── pay_systems_controller_spec.rb │ │ │ ├── plans_controller_spec.rb │ │ │ ├── profiles_controller_spec.rb │ │ │ ├── promos_controller_spec.rb │ │ │ ├── referrers_controller_spec.rb │ │ │ ├── servers_controller_spec.rb │ │ │ ├── traffic_reports_controller_spec.rb │ │ │ ├── transactions_controller_spec.rb │ │ │ └── users_controller_spec.rb │ │ ├── api/ │ │ │ ├── authentication_controller_spec.rb │ │ │ ├── connection_controller_spec.rb │ │ │ └── servers_controller_spec.rb │ │ ├── application_controller_spec.rb │ │ ├── billing/ │ │ │ ├── options_controller_spec.rb │ │ │ ├── payments_controller_spec.rb │ │ │ ├── paypal_controller_spec.rb │ │ │ ├── promotions_controller_spec.rb │ │ │ ├── referrers_controller_spec.rb │ │ │ ├── robokassa_controller_spec.rb │ │ │ ├── servers_controller_spec.rb │ │ │ └── webmoney_controller_spec.rb │ │ ├── referrers_controller_spec.rb │ │ └── users/ │ │ └── registrations_controller_spec.rb │ ├── decorators/ │ │ ├── admin/ │ │ │ └── options_decorator_spec.rb │ │ ├── option_attribute_decorator_spec.rb │ │ ├── pay_system_decorator_spec.rb │ │ ├── promo_decorator_spec.rb │ │ ├── transaction_decorator_spec.rb │ │ └── user_decorator_spec.rb │ ├── factories.rb │ ├── features/ │ │ ├── admin/ │ │ │ ├── plans/ │ │ │ │ ├── plans_option_prices_spec.rb │ │ │ │ └── update_plan_servers_spec.rb │ │ │ ├── referrers/ │ │ │ │ └── referrals_list_toggle_spec.rb │ │ │ ├── servers/ │ │ │ │ └── update_server_plans_spec.rb │ │ │ └── users/ │ │ │ ├── manual_payment_spec.rb │ │ │ ├── user_profile_page_spec.rb │ │ │ └── withdrawal_prolongation_spec.rb │ │ └── billing/ │ │ ├── discount_promotion_applying_spec.rb │ │ ├── options_page_spec.rb │ │ ├── payments_page_spec.rb │ │ ├── referrers_page_spec.rb │ │ ├── servers_page_spec.rb │ │ ├── settings_page_spec.rb │ │ ├── test_period_at_user_dashboard_spec.rb │ │ ├── user_password_reset_spec.rb │ │ ├── user_sign_in_spec.rb │ │ └── user_sign_up_spec.rb │ ├── helpers/ │ │ ├── admin_helper_spec.rb │ │ └── application_helper_spec.rb │ ├── i18n_spec.rb │ ├── lib/ │ │ ├── bytes_converter_spec.rb │ │ ├── currencies/ │ │ │ ├── course_converter_spec.rb │ │ │ └── course_spec.rb │ │ ├── random_string_spec.rb │ │ └── signer_spec.rb │ ├── mailers/ │ │ └── user_connection_config_mailer_spec.rb │ ├── models/ │ │ ├── authenticator_spec.rb │ │ ├── connect_spec.rb │ │ ├── connection_spec.rb │ │ ├── connector_spec.rb │ │ ├── disconnect_spec.rb │ │ ├── option_spec.rb │ │ ├── options/ │ │ │ └── hooks/ │ │ │ └── proxy_spec.rb │ │ ├── pay_system_spec.rb │ │ ├── payment_spec.rb │ │ ├── plan_has_server_spec.rb │ │ ├── plan_spec.rb │ │ ├── promo_spec.rb │ │ ├── promoters/ │ │ │ └── discount_promoter_spec.rb │ │ ├── promoters_repository_spec.rb │ │ ├── promotion_spec.rb │ │ ├── proxy/ │ │ │ ├── connect_spec.rb │ │ │ └── node_spec.rb │ │ ├── referrer/ │ │ │ ├── account_spec.rb │ │ │ └── reward_spec.rb │ │ ├── server/ │ │ │ └── signature_spec.rb │ │ ├── server_config_spec.rb │ │ ├── server_spec.rb │ │ ├── test_period_spec.rb │ │ ├── traffic_report_spec.rb │ │ ├── traffic_reports/ │ │ │ ├── date_traffic_report_spec.rb │ │ │ ├── server_traffic_report_spec.rb │ │ │ └── user_traffic_report_spec.rb │ │ ├── transaction_spec.rb │ │ ├── user_option_spec.rb │ │ ├── user_spec.rb │ │ ├── withdrawal_prolongation_spec.rb │ │ └── withdrawal_spec.rb │ ├── operations/ │ │ └── ops/ │ │ └── admin/ │ │ └── user/ │ │ ├── base_spec.rb │ │ └── create_spec.rb │ ├── rails_helper.rb │ ├── serializers/ │ │ ├── admin/ │ │ │ └── users_serializer_spec.rb │ │ └── api/ │ │ └── connection_serializer_spec.rb │ ├── services/ │ │ ├── dto/ │ │ │ └── admin/ │ │ │ ├── dashboard_spec.rb │ │ │ └── discrete_base_spec.rb │ │ ├── forced_disconnect_spec.rb │ │ ├── newsletter_manager_spec.rb │ │ ├── option/ │ │ │ ├── activation_price_calc_spec.rb │ │ │ ├── activator_spec.rb │ │ │ └── deactivator_spec.rb │ │ ├── proxy/ │ │ │ ├── fetchers/ │ │ │ │ └── base_spec.rb │ │ │ ├── rater_spec.rb │ │ │ ├── repository_spec.rb │ │ │ └── updater_spec.rb │ │ ├── referrer/ │ │ │ ├── reward_calculator_spec.rb │ │ │ └── rewarder_spec.rb │ │ ├── server_config_builder_spec.rb │ │ ├── unpaid_users_notificator_spec.rb │ │ ├── withdrawal_amount_calculator_spec.rb │ │ └── withdrawer_spec.rb │ ├── shared_examples/ │ │ ├── admin_controller_access_spec_shared.rb │ │ ├── api_call_controller_validation_shared.rb │ │ ├── dashboard_total_statistics_shared.rb │ │ ├── has_success_and_fail_responders_shared.rb │ │ ├── last_days_filterable_shared.rb │ │ ├── payment_submit_spec_shared.rb │ │ └── validates_paysystem_enabled_shared.rb │ ├── spec_helper.rb │ ├── support/ │ │ ├── capybara_helper.rb │ │ ├── controller_macros.rb │ │ ├── json_helpers.rb │ │ └── matchers/ │ │ └── json_matchers.rb │ └── workers/ │ ├── create_user_mail_worker_spec.rb │ ├── refresh_proxy_list_worker_spec.rb │ ├── update_cources_worker_spec.rb │ └── withdrawals_worker_spec.rb └── vendor/ └── assets/ ├── javascripts/ │ └── .keep └── stylesheets/ └── .keep ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ .git config/database.yml .envrc .env ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve title: "[BUG]" labels: bug assignees: Mehonoshin --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Server (please complete the following information):** - OS: [e.g. iOS] - Browser [e.g. chrome, safari] - Version [e.g. 22] **Smartphone (please complete the following information):** - Device: [e.g. iPhone6] - OS: [e.g. iOS8.1] - Browser [e.g. stock browser, safari] - Version [e.g. 22] **Additional context** Add any other context about the problem here. ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project title: '' labels: enhancement assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ Issue #ID ### Description Explain what is the purpose of this PR ### Testing steps Explain how to test your PR manually * Step 1 * Step 2 * Step 3 ### Checklist Make sure that all steps a checked before the merge - [ ] RSpec tests are passing on CI - [ ] `bin/cop -a` does not return any warnings - [ ] Tested manually ### Screenshots Provide screenshots of implemented functionality ================================================ FILE: .gitignore ================================================ # See http://help.github.com/ignore-files/ for more about ignoring files. # # If you find yourself ignoring temporary files generated by your text editor # or operating system, you probably want to add a global ignore instead: # git config --global core.excludesfile '~/.gitignore_global' # Ignore bundler config. /.bundle # Ignore the default SQLite database. /db/*.sqlite3 /db/*.sqlite3-journal # Ignore all logfiles and tempfiles. /log/** /tmp/* .rvmrc .powrc .DS_Store coverage/* config/settings.local.yml config/settings/*.local.yml config/environments/*.local.yml .envrc public/uploads/* config/database.yml .ruby-version .ruby-gemset .vagrant/ sandi_meter/**/* .env .idea/ dump.rdb ================================================ FILE: .hound.yml ================================================ scss: enabled: false haml: enabled: false rubocop: config_file: .rubocop.yml ================================================ FILE: .irbrc ================================================ # frozen_string_literal: true require 'awesome_print' AwesomePrint.irb! ================================================ FILE: .rspec ================================================ --color /*--profile*/ ================================================ FILE: .rubocop.yml ================================================ # These are all the cops that are enabled in the default configuration. #################### Bundler ############################### AllCops: Exclude: - db/** Bundler/DuplicatedGem: Description: 'Checks for duplicate gem entries in Gemfile.' Enabled: true Include: - '**/*.gemfile' - '**/Gemfile' - '**/gems.rb' Bundler/InsecureProtocolSource: Description: >- The source `:gemcutter`, `:rubygems` and `:rubyforge` are deprecated because HTTP requests are insecure. Please change your source to 'https://rubygems.org' if possible, or 'http://rubygems.org' if not. Enabled: true Include: - '**/*.gemfile' - '**/Gemfile' - '**/gems.rb' Bundler/OrderedGems: Description: >- Gems within groups in the Gemfile should be alphabetically sorted. Enabled: true Include: - '**/*.gemfile' - '**/Gemfile' - '**/gems.rb' #################### Gemspec ############################### Gemspec/DuplicatedAssignment: Description: 'An attribute assignment method calls should be listed only once in a gemspec.' Enabled: true Include: - '**/*.gemspec' Gemspec/OrderedDependencies: Description: >- Dependencies in the gemspec should be alphabetically sorted. Enabled: true Include: - '**/*.gemspec' Gemspec/RequiredRubyVersion: Description: 'Checks that `required_ruby_version` of gemspec and `TargetRubyVersion` of .rubocop.yml are equal.' Enabled: true Include: - '**/*.gemspec' #################### Layout ############################### Layout/AccessModifierIndentation: Description: Check indentation of private/protected visibility modifiers. StyleGuide: '#indent-public-private-protected' Enabled: true Layout/AlignArray: Description: >- Align the elements of an array literal if they span more than one line. StyleGuide: '#align-multiline-arrays' Enabled: true Layout/AlignHash: Description: >- Align the elements of a hash literal if they span more than one line. Enabled: true Layout/AlignParameters: Description: >- Align the parameters of a method call if they span more than one line. StyleGuide: '#no-double-indent' Enabled: true Layout/BlockAlignment: Description: 'Align block ends correctly.' Enabled: true Layout/BlockEndNewline: Description: 'Put end statement of multiline block on its own line.' Enabled: true Layout/CaseIndentation: Description: 'Indentation of when in a case/when/[else/]end.' StyleGuide: '#indent-when-to-case' Enabled: true Layout/ClosingParenthesisIndentation: Description: 'Checks the indentation of hanging closing parentheses.' Enabled: true Layout/CommentIndentation: Description: 'Indentation of comments.' Enabled: true Layout/ConditionPosition: Description: >- Checks for condition placed in a confusing position relative to the keyword. StyleGuide: '#same-line-condition' Enabled: true Layout/DefEndAlignment: Description: 'Align ends corresponding to defs correctly.' Enabled: true Layout/DotPosition: Description: 'Checks the position of the dot in multi-line method calls.' StyleGuide: '#consistent-multi-line-chains' Enabled: true Layout/ElseAlignment: Description: 'Align elses and elsifs correctly.' Enabled: true Layout/EmptyComment: Description: 'Checks empty comment.' Enabled: true Layout/EmptyLineAfterMagicComment: Description: 'Add an empty line after magic comments to separate them from code.' StyleGuide: '#separate-magic-comments-from-code' Enabled: true Layout/EmptyLineBetweenDefs: Description: 'Use empty lines between defs.' StyleGuide: '#empty-lines-between-methods' Enabled: true Layout/EmptyLines: Description: "Don't use several empty lines in a row." StyleGuide: '#two-or-more-empty-lines' Enabled: true Layout/EmptyLinesAroundAccessModifier: Description: "Keep blank lines around access modifiers." StyleGuide: '#empty-lines-around-access-modifier' Enabled: true Layout/EmptyLinesAroundArguments: Description: "Keeps track of empty lines around method arguments." Enabled: true Layout/EmptyLinesAroundBeginBody: Description: "Keeps track of empty lines around begin-end bodies." StyleGuide: '#empty-lines-around-bodies' Enabled: true Layout/EmptyLinesAroundBlockBody: Description: "Keeps track of empty lines around block bodies." StyleGuide: '#empty-lines-around-bodies' Enabled: true Layout/EmptyLinesAroundClassBody: Description: "Keeps track of empty lines around class bodies." StyleGuide: '#empty-lines-around-bodies' Enabled: true Layout/EmptyLinesAroundExceptionHandlingKeywords: Description: "Keeps track of empty lines around exception handling keywords." StyleGuide: '#empty-lines-around-bodies' Enabled: true Layout/EmptyLinesAroundMethodBody: Description: "Keeps track of empty lines around method bodies." StyleGuide: '#empty-lines-around-bodies' Enabled: true Layout/EmptyLinesAroundModuleBody: Description: "Keeps track of empty lines around module bodies." StyleGuide: '#empty-lines-around-bodies' Enabled: true Layout/EndAlignment: Description: 'Align ends correctly.' Enabled: true Layout/EndOfLine: Description: 'Use Unix-style line endings.' StyleGuide: '#crlf' Enabled: true Layout/ExtraSpacing: Description: 'Do not use unnecessary spacing.' Enabled: true Layout/FirstParameterIndentation: Description: 'Checks the indentation of the first parameter in a method call.' Enabled: true Layout/IndentArray: Description: >- Checks the indentation of the first element in an array literal. Enabled: true Layout/IndentAssignment: Description: >- Checks the indentation of the first line of the right-hand-side of a multi-line assignment. Enabled: true Layout/IndentHash: Description: 'Checks the indentation of the first key in a hash literal.' Enabled: true Layout/IndentHeredoc: Description: 'This cops checks the indentation of the here document bodies.' StyleGuide: '#squiggly-heredocs' Enabled: true Layout/IndentationConsistency: Description: 'Keep indentation straight.' StyleGuide: '#spaces-indentation' Enabled: true Layout/IndentationWidth: Description: 'Use 2 spaces for indentation.' StyleGuide: '#spaces-indentation' Enabled: true Layout/InitialIndentation: Description: >- Checks the indentation of the first non-blank non-comment line in a file. Enabled: true Layout/LeadingCommentSpace: Description: 'Comments should start with a space.' StyleGuide: '#hash-space' Enabled: true Layout/MultilineArrayBraceLayout: Description: >- Checks that the closing brace in an array literal is either on the same line as the last array element, or a new line. Enabled: true Layout/MultilineBlockLayout: Description: 'Ensures newlines after multiline block do statements.' Enabled: true Layout/MultilineHashBraceLayout: Description: >- Checks that the closing brace in a hash literal is either on the same line as the last hash element, or a new line. Enabled: true Layout/MultilineMethodCallBraceLayout: Description: >- Checks that the closing brace in a method call is either on the same line as the last method argument, or a new line. Enabled: true Layout/MultilineMethodCallIndentation: Description: >- Checks indentation of method calls with the dot operator that span more than one line. Enabled: true Layout/MultilineMethodDefinitionBraceLayout: Description: >- Checks that the closing brace in a method definition is either on the same line as the last method parameter, or a new line. Enabled: true Layout/MultilineOperationIndentation: Description: >- Checks indentation of binary operations that span more than one line. Enabled: true Layout/RescueEnsureAlignment: Description: 'Align rescues and ensures correctly.' Enabled: true Layout/SpaceAfterColon: Description: 'Use spaces after colons.' StyleGuide: '#spaces-operators' Enabled: true Layout/SpaceAfterComma: Description: 'Use spaces after commas.' StyleGuide: '#spaces-operators' Enabled: true Layout/SpaceAfterMethodName: Description: >- Do not put a space between a method name and the opening parenthesis in a method definition. StyleGuide: '#parens-no-spaces' Enabled: true Layout/SpaceAfterNot: Description: Tracks redundant space after the ! operator. StyleGuide: '#no-space-bang' Enabled: true Layout/SpaceAfterSemicolon: Description: 'Use spaces after semicolons.' StyleGuide: '#spaces-operators' Enabled: true Layout/SpaceAroundBlockParameters: Description: 'Checks the spacing inside and after block parameters pipes.' Enabled: true Layout/SpaceAroundEqualsInParameterDefault: Description: >- Checks that the equals signs in parameter default assignments have or don't have surrounding space depending on configuration. StyleGuide: '#spaces-around-equals' Enabled: true Layout/SpaceAroundKeyword: Description: 'Use a space around keywords if appropriate.' Enabled: true Layout/SpaceAroundOperators: Description: 'Use a single space around operators.' StyleGuide: '#spaces-operators' Enabled: true Layout/SpaceBeforeBlockBraces: Description: >- Checks that the left block brace has or doesn't have space before it. Enabled: true Layout/SpaceBeforeComma: Description: 'No spaces before commas.' Enabled: true Layout/SpaceBeforeComment: Description: >- Checks for missing space between code and a comment on the same line. Enabled: true Layout/SpaceBeforeFirstArg: Description: >- Checks that exactly one space is used between a method name and the first argument for method calls without parentheses. Enabled: true Layout/SpaceBeforeSemicolon: Description: 'No spaces before semicolons.' Enabled: true Layout/SpaceInLambdaLiteral: Description: 'Checks for spaces in lambda literals.' Enabled: true Layout/SpaceInsideArrayLiteralBrackets: Description: 'Checks the spacing inside array literal brackets.' Enabled: true Layout/SpaceInsideArrayPercentLiteral: Description: 'No unnecessary additional spaces between elements in %i/%w literals.' Enabled: true Layout/SpaceInsideBlockBraces: Description: >- Checks that block braces have or don't have surrounding space. For blocks taking parameters, checks that the left brace has or doesn't have trailing space. Enabled: true Layout/SpaceInsideHashLiteralBraces: Description: "Use spaces inside hash literal braces - or don't." StyleGuide: '#spaces-operators' Enabled: true Layout/SpaceInsideParens: Description: 'No spaces after ( or before ).' StyleGuide: '#spaces-braces' Enabled: true Layout/SpaceInsidePercentLiteralDelimiters: Description: 'No unnecessary spaces inside delimiters of %i/%w/%x literals.' Enabled: true Layout/SpaceInsideRangeLiteral: Description: 'No spaces inside range literals.' StyleGuide: '#no-space-inside-range-literals' Enabled: true Layout/SpaceInsideReferenceBrackets: Description: 'Checks the spacing inside referential brackets.' Enabled: true Layout/SpaceInsideStringInterpolation: Description: 'Checks for padding/surrounding spaces inside string interpolation.' StyleGuide: '#string-interpolation' Enabled: true Layout/Tab: Description: 'No hard tabs.' StyleGuide: '#spaces-indentation' Enabled: true Layout/TrailingBlankLines: Description: 'Checks trailing blank lines and final newline.' StyleGuide: '#newline-eof' Enabled: true Layout/TrailingWhitespace: Description: 'Avoid trailing whitespace.' StyleGuide: '#no-trailing-whitespace' Enabled: true #################### Lint ################################## ### Warnings Lint/AmbiguousBlockAssociation: Description: >- Checks for ambiguous block association with method when param passed without parentheses. StyleGuide: '#syntax' Enabled: true Lint/AmbiguousOperator: Description: >- Checks for ambiguous operators in the first argument of a method invocation without parentheses. StyleGuide: '#method-invocation-parens' Enabled: true Lint/AmbiguousRegexpLiteral: Description: >- Checks for ambiguous regexp literals in the first argument of a method invocation without parentheses. Enabled: true Lint/AssignmentInCondition: Description: "Don't use assignment in conditions." StyleGuide: '#safe-assignment-in-condition' Enabled: true Lint/BigDecimalNew: Description: '`BigDecimal.new()` is deprecated. Use `BigDecimal()` instead.' Enabled: true Lint/BooleanSymbol: Description: 'Check for `:true` and `:false` symbols.' Enabled: true Lint/CircularArgumentReference: Description: "Default values in optional keyword arguments and optional ordinal arguments should not refer back to the name of the argument." Enabled: true Lint/Debugger: Description: 'Check for debugger calls.' Enabled: true Lint/DeprecatedClassMethods: Description: 'Check for deprecated class method calls.' Enabled: true Lint/DuplicateCaseCondition: Description: 'Do not repeat values in case conditionals.' Enabled: true Lint/DuplicateMethods: Description: 'Check for duplicate method definitions.' Enabled: true Lint/DuplicatedKey: Description: 'Check for duplicate keys in hash literals.' Enabled: true Lint/EachWithObjectArgument: Description: 'Check for immutable argument given to each_with_object.' Enabled: true Lint/ElseLayout: Description: 'Check for odd code arrangement in an else block.' Enabled: true Lint/EmptyEnsure: Description: 'Checks for empty ensure block.' Enabled: true AutoCorrect: false Lint/EmptyExpression: Description: 'Checks for empty expressions.' Enabled: true Lint/EmptyInterpolation: Description: 'Checks for empty string interpolation.' Enabled: true Lint/EmptyWhen: Description: 'Checks for `when` branches with empty bodies.' Enabled: true Lint/EndInMethod: Description: 'END blocks should not be placed inside method definitions.' Enabled: true Lint/EnsureReturn: Description: 'Do not use return in an ensure block.' StyleGuide: '#no-return-ensure' Enabled: true Lint/FloatOutOfRange: Description: >- Catches floating-point literals too large or small for Ruby to represent. Enabled: true Lint/FormatParameterMismatch: Description: 'The number of parameters to format/sprint must match the fields.' Enabled: true Lint/HandleExceptions: Description: "Don't suppress exception." StyleGuide: '#dont-hide-exceptions' Enabled: true Lint/ImplicitStringConcatenation: Description: >- Checks for adjacent string literals on the same line, which could better be represented as a single string literal. Enabled: true Lint/IneffectiveAccessModifier: Description: >- Checks for attempts to use `private` or `protected` to set the visibility of a class method, which does not work. Enabled: true Lint/InheritException: Description: 'Avoid inheriting from the `Exception` class.' Enabled: true Lint/InterpolationCheck: Description: 'Raise warning for interpolation in single q strs' Enabled: true Lint/LiteralAsCondition: Description: 'Checks of literals used in conditions.' Enabled: true Lint/LiteralInInterpolation: Description: 'Checks for literals used in interpolation.' Enabled: true Lint/Loop: Description: >- Use Kernel#loop with break rather than begin/end/until or begin/end/while for post-loop tests. StyleGuide: '#loop-with-break' Enabled: true Lint/MissingCopEnableDirective: Description: 'Checks for a `# rubocop:enable` after `# rubocop:disable`' Enabled: true Lint/MultipleCompare: Description: "Use `&&` operator to compare multiple value." Enabled: true Lint/NestedMethodDefinition: Description: 'Do not use nested method definitions.' StyleGuide: '#no-nested-methods' Enabled: true Lint/NestedPercentLiteral: Description: 'Checks for nested percent literals.' Enabled: true Lint/NextWithoutAccumulator: Description: >- Do not omit the accumulator when calling `next` in a `reduce`/`inject` block. Enabled: true Lint/NonLocalExitFromIterator: Description: 'Do not use return in iterator to cause non-local exit.' Enabled: true Lint/OrderedMagicComments: Description: 'Checks the proper ordering of magic comments and whether a magic comment is not placed before a shebang.' Enabled: true Lint/ParenthesesAsGroupedExpression: Description: >- Checks for method calls with a space before the opening parenthesis. StyleGuide: '#parens-no-spaces' Enabled: true Lint/PercentStringArray: Description: >- Checks for unwanted commas and quotes in %w/%W literals. Enabled: true Lint/PercentSymbolArray: Description: >- Checks for unwanted commas and colons in %i/%I literals. Enabled: true Lint/RandOne: Description: >- Checks for `rand(1)` calls. Such calls always return `0` and most likely a mistake. Enabled: true Lint/RedundantWithIndex: Description: 'Checks for redundant `with_index`.' Enabled: true Lint/RedundantWithObject: Description: 'Checks for redundant `with_object`.' Enabled: true Lint/RegexpAsCondition: Description: >- Do not use regexp literal as a condition. The regexp literal matches `$_` implicitly. Enabled: true Lint/RequireParentheses: Description: >- Use parentheses in the method call to avoid confusion about precedence. Enabled: true Lint/RescueException: Description: 'Avoid rescuing the Exception class.' StyleGuide: '#no-blind-rescues' Enabled: true Lint/RescueType: Description: 'Avoid rescuing from non constants that could result in a `TypeError`.' Enabled: true Lint/ReturnInVoidContext: Description: 'Checks for return in void context.' Enabled: true Lint/SafeNavigationChain: Description: 'Do not chain ordinary method call after safe navigation operator.' Enabled: true Lint/ScriptPermission: Description: 'Grant script file execute permission.' Enabled: true Lint/ShadowedArgument: Description: 'Avoid reassigning arguments before they were used.' Enabled: true Lint/ShadowedException: Description: >- Avoid rescuing a higher level exception before a lower level exception. Enabled: true Lint/ShadowingOuterLocalVariable: Description: >- Do not use the same name as outer local variable for block arguments or block local variables. Enabled: true Lint/StringConversionInInterpolation: Description: 'Checks for Object#to_s usage in string interpolation.' StyleGuide: '#no-to-s' Enabled: true Lint/Syntax: Description: 'Checks syntax error' Enabled: true Lint/UnderscorePrefixedVariableName: Description: 'Do not use prefix `_` for a variable that is used.' Enabled: true Lint/UnifiedInteger: Description: 'Use Integer instead of Fixnum or Bignum' Enabled: true Lint/UnneededCopDisableDirective: Description: >- Checks for rubocop:disable comments that can be removed. Note: this cop is not disabled when disabling all cops. It must be explicitly disabled. Enabled: true Lint/UnneededCopEnableDirective: Description: Checks for rubocop:enable comments that can be removed. Enabled: true Lint/UnneededRequireStatement: Description: 'Checks for unnecessary `require` statement.' Enabled: true Lint/UnneededSplatExpansion: Description: 'Checks for splat unnecessarily being called on literals' Enabled: true Lint/UnreachableCode: Description: 'Unreachable code.' Enabled: true Lint/UnusedBlockArgument: Description: 'Checks for unused block arguments.' StyleGuide: '#underscore-unused-vars' Enabled: true Lint/UnusedMethodArgument: Description: 'Checks for unused method arguments.' StyleGuide: '#underscore-unused-vars' Enabled: true Lint/UriEscapeUnescape: Description: >- `URI.escape` method is obsolete and should not be used. Instead, use `CGI.escape`, `URI.encode_www_form` or `URI.encode_www_form_component` depending on your specific use case. Also `URI.unescape` method is obsolete and should not be used. Instead, use `CGI.unescape`, `URI.decode_www_form` or `URI.decode_www_form_component` depending on your specific use case. Enabled: true Lint/UriRegexp: Description: 'Use `URI::DEFAULT_PARSER.make_regexp` instead of `URI.regexp`.' Enabled: true Lint/UselessAccessModifier: Description: 'Checks for useless access modifiers.' Enabled: true ContextCreatingMethods: [] MethodCreatingMethods: [] Lint/UselessAssignment: Description: 'Checks for useless assignment to a local variable.' StyleGuide: '#underscore-unused-vars' Enabled: true Lint/UselessComparison: Description: 'Checks for comparison of something with itself.' Enabled: true Lint/UselessElseWithoutRescue: Description: 'Checks for useless `else` in `begin..end` without `rescue`.' Enabled: true Lint/UselessSetterCall: Description: 'Checks for useless setter call to a local variable.' Enabled: true Lint/Void: Description: 'Possible use of operator/literal/variable in void context.' Enabled: true #################### Metrics ############################### Metrics/AbcSize: Description: >- A calculated magnitude based on number of assignments, branches, and conditions. Reference: 'http://c2.com/cgi/wiki?AbcMetric' Enabled: true Metrics/BlockLength: Description: 'Avoid long blocks with many lines.' Enabled: true Exclude: - '**/*_spec.rb' - 'db/schema.rb' - 'config/routes.rb' - 'spec/factories/**/*.rb' - 'config/initializers/*.rb' - 'config/environments/*.rb' - 'Vagrantfile' Metrics/BlockNesting: Description: 'Avoid excessive block nesting' StyleGuide: '#three-is-the-number-thou-shalt-count' Enabled: true Metrics/ClassLength: Description: 'Avoid classes longer than 100 lines of code.' Enabled: true Metrics/CyclomaticComplexity: Description: >- A complexity metric that is strongly correlated to the number of test cases needed to validate a method. Enabled: true Metrics/LineLength: Description: 'Limit lines to 80 characters.' StyleGuide: '#80-character-limits' Enabled: true Max: 120 Exclude: - 'db/seeds.rb' - 'config/initializers/*.rb' Metrics/MethodLength: Description: 'Avoid methods longer than 10 lines of code.' StyleGuide: '#short-methods' Enabled: true Metrics/ModuleLength: Description: 'Avoid modules longer than 100 lines of code.' Enabled: true Metrics/ParameterLists: Description: 'Avoid parameter lists longer than three or four parameters.' StyleGuide: '#too-many-params' Enabled: true Metrics/PerceivedComplexity: Description: >- A complexity metric geared towards measuring complexity for a human reader. Enabled: true #################### Naming ############################## Naming/AccessorMethodName: Description: Check the naming of accessor methods for get_/set_. StyleGuide: '#accessor_mutator_method_names' Enabled: true Naming/AsciiIdentifiers: Description: 'Use only ascii symbols in identifiers.' StyleGuide: '#english-identifiers' Enabled: true Naming/BinaryOperatorParameterName: Description: 'When defining binary operators, name the argument other.' StyleGuide: '#other-arg' Enabled: true Naming/ClassAndModuleCamelCase: Description: 'Use CamelCase for classes and modules.' StyleGuide: '#camelcase-classes' Enabled: true Naming/ConstantName: Description: 'Constants should use SCREAMING_SNAKE_CASE.' StyleGuide: '#screaming-snake-case' Enabled: true Naming/FileName: Description: 'Use snake_case for source file names.' StyleGuide: '#snake-case-files' Enabled: true Naming/HeredocDelimiterCase: Description: 'Use configured case for heredoc delimiters.' StyleGuide: '#heredoc-delimiters' Enabled: true Naming/HeredocDelimiterNaming: Description: 'Use descriptive heredoc delimiters.' StyleGuide: '#heredoc-delimiters' Enabled: true Naming/MemoizedInstanceVariableName: Description: >- Memoized method name should match memo instance variable name. Enabled: true Naming/MethodName: Description: 'Use the configured style when naming methods.' StyleGuide: '#snake-case-symbols-methods-vars' Enabled: true Naming/PredicateName: Description: 'Check the names of predicate methods.' StyleGuide: '#bool-methods-qmark' Enabled: true Naming/UncommunicativeBlockParamName: Description: >- Checks for block parameter names that contain capital letters, end in numbers, or do not meet a minimal length. Enabled: true Naming/UncommunicativeMethodParamName: Description: >- Checks for method parameter names that contain capital letters, end in numbers, or do not meet a minimal length. Enabled: true Naming/VariableName: Description: 'Use the configured style when naming variables.' StyleGuide: '#snake-case-symbols-methods-vars' Enabled: true Naming/VariableNumber: Description: 'Use the configured style when numbering variables.' Enabled: true #################### Performance ########################### Performance/Caller: Description: >- Use `caller(n..n)` instead of `caller`. Enabled: true Performance/CaseWhenSplat: Description: >- Place `when` conditions that use splat at the end of the list of `when` branches. Enabled: true Performance/Casecmp: Description: >- Use `casecmp` rather than `downcase ==`, `upcase ==`, `== downcase`, or `== upcase`.. Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringcasecmp-vs-stringdowncase---code' Enabled: true Performance/CompareWithBlock: Description: 'Use `sort_by(&:foo)` instead of `sort { |a, b| a.foo <=> b.foo }`.' Enabled: true Performance/Count: Description: >- Use `count` instead of `select...size`, `reject...size`, `select...count`, `reject...count`, `select...length`, and `reject...length`. # This cop has known compatibility issues with `ActiveRecord` and other # frameworks. ActiveRecord's `count` ignores the block that is passed to it. # For more information, see the documentation in the cop itself. # If you understand the known risk, you can disable `SafeMode`. SafeMode: true Enabled: true Performance/Detect: Description: >- Use `detect` instead of `select.first`, `find_all.first`, `select.last`, and `find_all.last`. Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerabledetect-vs-enumerableselectfirst-code' # This cop has known compatibility issues with `ActiveRecord` and other # frameworks. `ActiveRecord` does not implement a `detect` method and `find` # has its own meaning. Correcting `ActiveRecord` methods with this cop # should be considered unsafe. SafeMode: true Enabled: true Performance/DoubleStartEndWith: Description: >- Use `str.{start,end}_with?(x, ..., y, ...)` instead of `str.{start,end}_with?(x, ...) || str.{start,end}_with?(y, ...)`. Enabled: true Performance/EndWith: Description: 'Use `end_with?` instead of a regex match anchored to the end of a string.' Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringmatch-vs-stringstart_withstringend_with-code-start-code-end' # This will change to a new method call which isn't guaranteed to be on the # object. Switching these methods has to be done with knowledge of the types # of the variables which rubocop doesn't have. AutoCorrect: false Enabled: true Performance/FixedSize: Description: 'Do not compute the size of statically sized objects except in constants' Enabled: true Performance/FlatMap: Description: >- Use `Enumerable#flat_map` instead of `Enumerable#map...Array#flatten(1)` or `Enumberable#collect..Array#flatten(1)` Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablemaparrayflatten-vs-enumerableflat_map-code' Enabled: true EnabledForFlattenWithoutParams: false # If enabled, this cop will warn about usages of # `flatten` being called without any parameters. # This can be dangerous since `flat_map` will only flatten 1 level, and # `flatten` without any parameters can flatten multiple levels. Performance/LstripRstrip: Description: 'Use `strip` instead of `lstrip.rstrip`.' Enabled: true Performance/RangeInclude: Description: 'Use `Range#cover?` instead of `Range#include?`.' Reference: 'https://github.com/JuanitoFatas/fast-ruby#cover-vs-include-code' Enabled: true Performance/RedundantBlockCall: Description: 'Use `yield` instead of `block.call`.' Reference: 'https://github.com/JuanitoFatas/fast-ruby#proccall-and-block-arguments-vs-yieldcode' Enabled: true Performance/RedundantMatch: Description: >- Use `=~` instead of `String#match` or `Regexp#match` in a context where the returned `MatchData` is not needed. Enabled: true Performance/RedundantMerge: Description: 'Use Hash#[]=, rather than Hash#merge! with a single key-value pair.' Reference: 'https://github.com/JuanitoFatas/fast-ruby#hashmerge-vs-hash-code' Enabled: true Performance/RedundantSortBy: Description: 'Use `sort` instead of `sort_by { |x| x }`.' Enabled: true Performance/RegexpMatch: Description: >- Use `match?` instead of `Regexp#match`, `String#match`, `Symbol#match`, `Regexp#===`, or `=~` when `MatchData` is not used. Enabled: true Performance/ReverseEach: Description: 'Use `reverse_each` instead of `reverse.each`.' Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablereverseeach-vs-enumerablereverse_each-code' Enabled: true Performance/Sample: Description: >- Use `sample` instead of `shuffle.first`, `shuffle.last`, and `shuffle[Integer]`. Reference: 'https://github.com/JuanitoFatas/fast-ruby#arrayshufflefirst-vs-arraysample-code' Enabled: true Performance/Size: Description: >- Use `size` instead of `count` for counting the number of elements in `Array` and `Hash`. Reference: 'https://github.com/JuanitoFatas/fast-ruby#arraylength-vs-arraysize-vs-arraycount-code' Enabled: true Performance/StartWith: Description: 'Use `start_with?` instead of a regex match anchored to the beginning of a string.' Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringmatch-vs-stringstart_withstringend_with-code-start-code-end' # This will change to a new method call which isn't guaranteed to be on the # object. Switching these methods has to be done with knowledge of the types # of the variables which rubocop doesn't have. AutoCorrect: false Enabled: true Performance/StringReplacement: Description: >- Use `tr` instead of `gsub` when you are replacing the same number of characters. Use `delete` instead of `gsub` when you are deleting characters. Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringgsub-vs-stringtr-code' Enabled: true Performance/TimesMap: Description: 'Checks for .times.map calls.' AutoCorrect: false Enabled: true Performance/UnfreezeString: Description: 'Use unary plus to get an unfrozen string literal.' Enabled: true Performance/UriDefaultParser: Description: 'Use `URI::DEFAULT_PARSER` instead of `URI::Parser.new`.' Enabled: true #################### Rails ################################# Rails/ActionFilter: Description: 'Enforces consistent use of action filter methods.' Enabled: true Rails/ActiveRecordAliases: Description: >- Avoid Active Record aliases: Use `update` instead of `update_attributes`. Use `update!` instead of `update_attributes!`. Enabled: true Rails/ActiveSupportAliases: Description: >- Avoid ActiveSupport aliases of standard ruby methods: `String#starts_with?`, `String#ends_with?`, `Array#append`, `Array#prepend`. Enabled: true Rails/ApplicationJob: Description: 'Check that jobs subclass ApplicationJob.' Enabled: true Rails/ApplicationRecord: Description: 'Check that models subclass ApplicationRecord.' Enabled: true Rails/Blank: Description: 'Enforce using `blank?` and `present?`.' Enabled: true # Convert checks for `nil` or `empty?` to `blank?` NilOrEmpty: true # Convert usages of not `present?` to `blank?` NotPresent: true # Convert usages of `unless` `present?` to `if` `blank?` UnlessPresent: true Rails/CreateTableWithTimestamps: Description: >- Checks the migration for which timestamps are not included when creating a new table. Enabled: true Rails/Date: Description: >- Checks the correct usage of date aware methods, such as Date.today, Date.current etc. Enabled: true Rails/Delegate: Description: 'Prefer delegate method for delegations.' Enabled: true Rails/DelegateAllowBlank: Description: 'Do not use allow_blank as an option to delegate.' Enabled: true Rails/DynamicFindBy: Description: 'Use `find_by` instead of dynamic `find_by_*`.' StyleGuide: 'https://github.com/bbatsov/rails-style-guide#find_by' Enabled: true Rails/EnumUniqueness: Description: 'Avoid duplicate integers in hash-syntax `enum` declaration.' Enabled: true Rails/EnvironmentComparison: Description: "Favor `Rails.env.production?` over `Rails.env == 'production'`" Enabled: true Rails/Exit: Description: >- Favor `fail`, `break`, `return`, etc. over `exit` in application or library code outside of Rake files to avoid exits during unit testing or running in production. Enabled: true Rails/FilePath: Description: 'Use `Rails.root.join` for file path joining.' Enabled: true Rails/FindBy: Description: 'Prefer find_by over where.first.' StyleGuide: 'https://github.com/bbatsov/rails-style-guide#find_by' Enabled: true Rails/FindEach: Description: 'Prefer all.find_each over all.find.' StyleGuide: 'https://github.com/bbatsov/rails-style-guide#find-each' Enabled: true Rails/HasAndBelongsToMany: Description: 'Prefer has_many :through to has_and_belongs_to_many.' StyleGuide: 'https://github.com/bbatsov/rails-style-guide#has-many-through' Enabled: true Rails/HasManyOrHasOneDependent: Description: 'Define the dependent option to the has_many and has_one associations.' StyleGuide: 'https://github.com/bbatsov/rails-style-guide#has_many-has_one-dependent-option' Enabled: true Rails/HttpPositionalArguments: Description: 'Use keyword arguments instead of positional arguments in http method calls.' Enabled: true Include: - 'spec/**/*' - 'test/**/*' Rails/HttpStatus: Description: 'Enforces use of symbolic or numeric value to define HTTP status.' Enabled: true Rails/InverseOf: Description: 'Checks for associations where the inverse cannot be determined automatically.' Enabled: true Rails/LexicallyScopedActionFilter: Description: "Checks that methods specified in the filter's `only` or `except` options are explicitly defined in the controller." StyleGuide: 'https://github.com/bbatsov/rails-style-guide#lexically-scoped-action-filter' Enabled: true Rails/NotNullColumn: Description: 'Do not add a NOT NULL column without a default value' Enabled: true Rails/Output: Description: 'Checks for calls to puts, print, etc.' Enabled: true Rails/OutputSafety: Description: 'The use of `html_safe` or `raw` may be a security risk.' Enabled: true Rails/PluralizationGrammar: Description: 'Checks for incorrect grammar when using methods like `3.day.ago`.' Enabled: true Rails/Presence: Description: 'Checks code that can be written more easily using `Object#presence` defined by Active Support.' Enabled: true Rails/Present: Description: 'Enforce using `blank?` and `present?`.' Enabled: true NotNilAndNotEmpty: true # Convert checks for not `nil` and not `empty?` to `present?` NotBlank: true # Convert usages of not `blank?` to `present?` UnlessBlank: true # Convert usages of `unless` `blank?` to `if` `present?` Rails/ReadWriteAttribute: Description: >- Checks for read_attribute(:attr) and write_attribute(:attr, val). StyleGuide: 'https://github.com/bbatsov/rails-style-guide#read-attribute' Enabled: true Rails/RedundantReceiverInWithOptions: Description: 'Checks for redundant receiver in `with_options`.' Enabled: true Rails/RelativeDateConstant: Description: 'Do not assign relative date to constants.' Enabled: true Rails/RequestReferer: Description: 'Use consistent syntax for request.referer.' Enabled: true Rails/ReversibleMigration: Description: 'Checks whether the change method of the migration file is reversible.' StyleGuide: 'https://github.com/bbatsov/rails-style-guide#reversible-migration' Reference: 'http://api.rubyonrails.org/classes/ActiveRecord/Migration/CommandRecorder.html' Enabled: true Rails/SafeNavigation: Description: "Use Ruby's safe navigation operator (`&.`) instead of `try!`" Enabled: true Rails/ScopeArgs: Description: 'Checks the arguments of ActiveRecord scopes.' Enabled: true Rails/SkipsModelValidations: Description: >- Use methods that skips model validations with caution. See reference for more information. Reference: 'http://guides.rubyonrails.org/active_record_validations.html#skipping-validations' Enabled: true Rails/TimeZone: Description: 'Checks the correct usage of time zone aware methods.' StyleGuide: 'https://github.com/bbatsov/rails-style-guide#time' Reference: 'http://danilenko.org/2012/7/6/rails_timezones' Enabled: true Rails/UniqBeforePluck: Description: 'Prefer the use of uniq or distinct before pluck.' Enabled: true Rails/UnknownEnv: Description: 'Use correct environment name.' Enabled: true Rails/Validation: Description: 'Use validates :attribute, hash of validations.' Enabled: true #################### Security ############################## Security/Eval: Description: 'The use of eval represents a serious security risk.' Enabled: true Security/JSONLoad: Description: >- Prefer usage of `JSON.parse` over `JSON.load` due to potential security issues. See reference for more information. Reference: 'http://ruby-doc.org/stdlib-2.3.0/libdoc/json/rdoc/JSON.html#method-i-load' Enabled: true # Autocorrect here will change to a method that may cause crashes depending # on the value of the argument. AutoCorrect: false Security/MarshalLoad: Description: >- Avoid using of `Marshal.load` or `Marshal.restore` due to potential security issues. See reference for more information. Reference: 'http://ruby-doc.org/core-2.3.3/Marshal.html#module-Marshal-label-Security+considerations' Enabled: true Security/Open: Description: 'The use of Kernel#open represents a serious security risk.' Enabled: true Security/YAMLLoad: Description: >- Prefer usage of `YAML.safe_load` over `YAML.load` due to potential security issues. See reference for more information. Reference: 'https://ruby-doc.org/stdlib-2.3.3/libdoc/yaml/rdoc/YAML.html#module-YAML-label-Security' Enabled: true #################### Style ############################### Style/Alias: Description: 'Use alias instead of alias_method.' StyleGuide: '#alias-method' Enabled: true Style/AndOr: Description: 'Use &&/|| instead of and/or.' StyleGuide: '#no-and-or-or' Enabled: true Style/ArrayJoin: Description: 'Use Array#join instead of Array#*.' StyleGuide: '#array-join' Enabled: true Style/AsciiComments: Description: 'Use only ascii symbols in comments.' StyleGuide: '#english-comments' Enabled: true Style/Attr: Description: 'Checks for uses of Module#attr.' StyleGuide: '#attr' Enabled: true Style/BarePercentLiterals: Description: 'Checks if usage of %() or %Q() matches configuration.' StyleGuide: '#percent-q-shorthand' Enabled: true Style/BeginBlock: Description: 'Avoid the use of BEGIN blocks.' StyleGuide: '#no-BEGIN-blocks' Enabled: true Style/BlockComments: Description: 'Do not use block comments.' StyleGuide: '#no-block-comments' Enabled: true Style/BlockDelimiters: Description: >- Avoid using {...} for multi-line blocks (multiline chaining is always ugly). Prefer {...} over do...end for single-line blocks. StyleGuide: '#single-line-blocks' Enabled: true Style/BracesAroundHashParameters: Description: 'Enforce braces style around hash parameters.' Enabled: true Style/CaseEquality: Description: 'Avoid explicit use of the case equality operator(===).' StyleGuide: '#no-case-equality' Enabled: true Style/CharacterLiteral: Description: 'Checks for uses of character literals.' StyleGuide: '#no-character-literals' Enabled: true Style/ClassAndModuleChildren: Description: 'Checks style of children classes and modules.' StyleGuide: '#namespace-definition' # Moving from compact to nested children requires knowledge of whether the # outer parent is a module or a class. Moving from nested to compact requires # verification that the outer parent is defined elsewhere. Rubocop does not # have the knowledge to perform either operation safely and thus requires # manual oversight. AutoCorrect: false Enabled: true Style/ClassCheck: Description: 'Enforces consistent use of `Object#is_a?` or `Object#kind_of?`.' Enabled: true Style/ClassMethods: Description: 'Use self when defining module/class methods.' StyleGuide: '#def-self-class-methods' Enabled: true Style/ClassVars: Description: 'Avoid the use of class variables.' StyleGuide: '#no-class-vars' Enabled: true Style/ColonMethodCall: Description: 'Do not use :: for method call.' StyleGuide: '#double-colons' Enabled: true Style/ColonMethodDefinition: Description: 'Do not use :: for defining class methods.' StyleGuide: '#colon-method-definition' Enabled: true Style/CommandLiteral: Description: 'Use `` or %x around command literals.' StyleGuide: '#percent-x' Enabled: true Style/CommentAnnotation: Description: >- Checks formatting of special comments (TODO, FIXME, OPTIMIZE, HACK, REVIEW). StyleGuide: '#annotate-keywords' Enabled: true Style/CommentedKeyword: Description: 'Do not place comments on the same line as certain keywords.' Enabled: true Style/ConditionalAssignment: Description: >- Use the return value of `if` and `case` statements for assignment to a variable and variable comparison instead of assigning that variable inside of each branch. Enabled: true Style/DateTime: Description: 'Use Date or Time over DateTime.' StyleGuide: '#date--time' Enabled: true Style/DefWithParentheses: Description: 'Use def with parentheses when there are arguments.' StyleGuide: '#method-parens' Enabled: true Style/Dir: Description: >- Use the `__dir__` method to retrieve the canonicalized absolute path to the current file. Enabled: true Style/Documentation: Description: 'Document classes and non-namespace modules.' Enabled: false Exclude: - 'spec/**/*' - 'test/**/*' - 'db/**/*' - 'config/**/*' Style/DoubleNegation: Description: 'Checks for uses of double negation (!!).' StyleGuide: '#no-bang-bang' Enabled: true Style/EachForSimpleLoop: Description: >- Use `Integer#times` for a simple loop which iterates a fixed number of times. Enabled: true Style/EachWithObject: Description: 'Prefer `each_with_object` over `inject` or `reduce`.' Enabled: true Style/EmptyBlockParameter: Description: 'Omit pipes for empty block parameters.' Enabled: true Style/EmptyCaseCondition: Description: 'Avoid empty condition in case statements.' Enabled: true Style/EmptyElse: Description: 'Avoid empty else-clauses.' Enabled: true Style/EmptyLambdaParameter: Description: 'Omit parens for empty lambda parameters.' Enabled: true Style/EmptyLiteral: Description: 'Prefer literals to Array.new/Hash.new/String.new.' StyleGuide: '#literal-array-hash' Enabled: true Style/EmptyMethod: Description: 'Checks the formatting of empty method definitions.' StyleGuide: '#no-single-line-methods' Enabled: true Style/Encoding: Description: 'Use UTF-8 as the source file encoding.' StyleGuide: '#utf-8' Enabled: true Style/EndBlock: Description: 'Avoid the use of END blocks.' StyleGuide: '#no-END-blocks' Enabled: true Style/EvalWithLocation: Description: 'Pass `__FILE__` and `__LINE__` to `eval` method, as they are used by backtraces.' Enabled: true Style/EvenOdd: Description: 'Favor the use of Integer#even? && Integer#odd?' StyleGuide: '#predicate-methods' Enabled: true Style/ExpandPathArguments: Description: "Use `expand_path(__dir__)` instead of `expand_path('..', __FILE__)`." Enabled: true Style/FlipFlop: Description: 'Checks for flip flops' StyleGuide: '#no-flip-flops' Enabled: true Style/For: Description: 'Checks use of for or each in multiline loops.' StyleGuide: '#no-for-loops' Enabled: true Style/FormatString: Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.' StyleGuide: '#sprintf' Enabled: true Style/FormatStringToken: Description: 'Use a consistent style for format string tokens.' Enabled: true Style/FrozenStringLiteralComment: Description: >- Add the frozen_string_literal comment to the top of files to help transition from Ruby 2.3.0 to Ruby 3.0. Enabled: true Exclude: - 'db/**/*' Style/GlobalVars: Description: 'Do not introduce global variables.' StyleGuide: '#instance-vars' Reference: 'http://www.zenspider.com/Languages/Ruby/QuickRef.html' Enabled: true Style/GuardClause: Description: 'Check for conditionals that can be replaced with guard clauses' StyleGuide: '#no-nested-conditionals' Enabled: true Style/HashSyntax: Description: >- Prefer Ruby 1.9 hash syntax { a: 1, b: 2 } over 1.8 syntax { :a => 1, :b => 2 }. StyleGuide: '#hash-literals' Enabled: true Style/IdenticalConditionalBranches: Description: >- Checks that conditional statements do not have an identical line at the end of each branch, which can validly be moved out of the conditional. Enabled: true Style/IfInsideElse: Description: 'Finds if nodes inside else, which can be converted to elsif.' Enabled: true Style/IfUnlessModifier: Description: >- Favor modifier if/unless usage when you have a single-line body. StyleGuide: '#if-as-a-modifier' Enabled: true Style/IfUnlessModifierOfIfUnless: Description: >- Avoid modifier if/unless usage on conditionals. Enabled: true Style/IfWithSemicolon: Description: 'Do not use if x; .... Use the ternary operator instead.' StyleGuide: '#no-semicolon-ifs' Enabled: true Style/InfiniteLoop: Description: 'Use Kernel#loop for infinite loops.' StyleGuide: '#infinite-loop' Enabled: true Style/InverseMethods: Description: >- Use the inverse method instead of `!.method` if an inverse method is defined. Enabled: true Style/Lambda: Description: 'Use the new lambda literal syntax for single-line blocks.' StyleGuide: '#lambda-multi-line' Enabled: true Style/LambdaCall: Description: 'Use lambda.call(...) instead of lambda.(...).' StyleGuide: '#proc-call' Enabled: true Style/LineEndConcatenation: Description: >- Use \ instead of + or << to concatenate two string literals at line end. Enabled: true Style/MethodCallWithoutArgsParentheses: Description: 'Do not use parentheses for method calls with no arguments.' StyleGuide: '#method-invocation-parens' Enabled: true Style/MethodDefParentheses: Description: >- Checks if the method definitions have or don't have parentheses. StyleGuide: '#method-parens' Enabled: true Style/MethodMissingSuper: Description: 'Avoid using `method_missing`.' StyleGuide: '#no-method-missing' Enabled: true Style/MinMax: Description: >- Use `Enumerable#minmax` instead of `Enumerable#min` and `Enumerable#max` in conjunction.' Enabled: true Style/MixinGrouping: Description: 'Checks for grouping of mixins in `class` and `module` bodies.' StyleGuide: '#mixin-grouping' Enabled: true Style/MixinUsage: Description: 'Checks that `include`, `extend` and `prepend` exists at the top level.' Enabled: true Style/ModuleFunction: Description: 'Checks for usage of `extend self` in modules.' StyleGuide: '#module-function' Enabled: true Style/MultilineBlockChain: Description: 'Avoid multi-line chains of blocks.' StyleGuide: '#single-line-blocks' Enabled: true Style/MultilineIfModifier: Description: 'Only use if/unless modifiers on single line statements.' StyleGuide: '#no-multiline-if-modifiers' Enabled: true Style/MultilineIfThen: Description: 'Do not use then for multi-line if/unless.' StyleGuide: '#no-then' Enabled: true Style/MultilineMemoization: Description: 'Wrap multiline memoizations in a `begin` and `end` block.' Enabled: true Style/MultilineTernaryOperator: Description: >- Avoid multi-line ?: (the ternary operator); use if/unless instead. StyleGuide: '#no-multiline-ternary' Enabled: true Style/MultipleComparison: Description: >- Avoid comparing a variable with multiple items in a conditional, use Array#include? instead. Enabled: true Style/MutableConstant: Description: 'Do not assign mutable objects to constants.' Enabled: true Style/NegatedIf: Description: >- Favor unless over if for negative conditions (or control flow or). StyleGuide: '#unless-for-negatives' Enabled: true Style/NegatedWhile: Description: 'Favor until over while for negative conditions.' StyleGuide: '#until-for-negatives' Enabled: true Style/NestedModifier: Description: 'Avoid using nested modifiers.' StyleGuide: '#no-nested-modifiers' Enabled: true Style/NestedParenthesizedCalls: Description: >- Parenthesize method calls which are nested inside the argument list of another parenthesized method call. Enabled: true Style/NestedTernaryOperator: Description: 'Use one expression per branch in a ternary operator.' StyleGuide: '#no-nested-ternary' Enabled: true Style/Next: Description: 'Use `next` to skip iteration instead of a condition at the end.' StyleGuide: '#no-nested-conditionals' Enabled: true Style/NilComparison: Description: 'Prefer x.nil? to x == nil.' StyleGuide: '#predicate-methods' Enabled: true Style/NonNilCheck: Description: 'Checks for redundant nil checks.' StyleGuide: '#no-non-nil-checks' Enabled: true Style/Not: Description: 'Use ! instead of not.' StyleGuide: '#bang-not-not' Enabled: true Style/NumericLiteralPrefix: Description: 'Use smallcase prefixes for numeric literals.' StyleGuide: '#numeric-literal-prefixes' Enabled: true Style/NumericLiterals: Description: >- Add underscores to large numeric literals to improve their readability. StyleGuide: '#underscores-in-numerics' Enabled: true Exclude: - 'db/**/*' Style/NumericPredicate: Description: >- Checks for the use of predicate- or comparison methods for numeric comparisons. StyleGuide: '#predicate-methods' # This will change to a new method call which isn't guaranteed to be on the # object. Switching these methods has to be done with knowledge of the types # of the variables which rubocop doesn't have. AutoCorrect: false Enabled: true Style/OneLineConditional: Description: >- Favor the ternary operator(?:) over if/then/else/end constructs. StyleGuide: '#ternary-operator' Enabled: true Style/OptionalArguments: Description: >- Checks for optional arguments that do not appear at the end of the argument list StyleGuide: '#optional-arguments' Enabled: true Style/OrAssignment: Description: 'Recommend usage of double pipe equals (||=) where applicable.' StyleGuide: '#double-pipe-for-uninit' Enabled: true Style/ParallelAssignment: Description: >- Check for simple usages of parallel assignment. It will only warn when the number of variables matches on both sides of the assignment. StyleGuide: '#parallel-assignment' Enabled: true Style/ParenthesesAroundCondition: Description: >- Don't use parentheses around the condition of an if/unless/while. StyleGuide: '#no-parens-around-condition' Enabled: true Style/PercentLiteralDelimiters: Description: 'Use `%`-literal delimiters consistently' StyleGuide: '#percent-literal-braces' Enabled: true Style/PercentQLiterals: Description: 'Checks if uses of %Q/%q match the configured preference.' Enabled: true Style/PerlBackrefs: Description: 'Avoid Perl-style regex back references.' StyleGuide: '#no-perl-regexp-last-matchers' Enabled: true Style/PreferredHashMethods: Description: 'Checks use of `has_key?` and `has_value?` Hash methods.' StyleGuide: '#hash-key' Enabled: true Style/Proc: Description: 'Use proc instead of Proc.new.' StyleGuide: '#proc' Enabled: true Style/RaiseArgs: Description: 'Checks the arguments passed to raise/fail.' StyleGuide: '#exception-class-messages' Enabled: true Style/RandomWithOffset: Description: >- Prefer to use ranges when generating random numbers instead of integers with offsets. StyleGuide: '#random-numbers' Enabled: true Style/RedundantBegin: Description: "Don't use begin blocks when they are not needed." StyleGuide: '#begin-implicit' Enabled: true Style/RedundantConditional: Description: "Don't return true/false from a conditional." Enabled: true Style/RedundantException: Description: "Checks for an obsolete RuntimeException argument in raise/fail." StyleGuide: '#no-explicit-runtimeerror' Enabled: true Style/RedundantFreeze: Description: "Checks usages of Object#freeze on immutable objects." Enabled: true Style/RedundantParentheses: Description: "Checks for parentheses that seem not to serve any purpose." Enabled: true Style/RedundantReturn: Description: "Don't use return where it's not required." StyleGuide: '#no-explicit-return' Enabled: true Style/RedundantSelf: Description: "Don't use self where it's not needed." StyleGuide: '#no-self-unless-required' Enabled: true Style/RegexpLiteral: Description: 'Use / or %r around regular expressions.' StyleGuide: '#percent-r' Enabled: true Style/RescueModifier: Description: 'Avoid using rescue in its modifier form.' StyleGuide: '#no-rescue-modifiers' Enabled: true Style/RescueStandardError: Description: 'Avoid rescuing without specifying an error class.' Enabled: true Style/SafeNavigation: Description: >- This cop transforms usages of a method call safeguarded by a check for the existence of the object to safe navigation (`&.`). Enabled: true Style/SelfAssignment: Description: >- Checks for places where self-assignment shorthand should have been used. StyleGuide: '#self-assignment' Enabled: true Style/Semicolon: Description: "Don't use semicolons to terminate expressions." StyleGuide: '#no-semicolon' Enabled: true Style/SignalException: Description: 'Checks for proper usage of fail and raise.' StyleGuide: '#prefer-raise-over-fail' Enabled: true Style/SingleLineMethods: Description: 'Avoid single-line methods.' StyleGuide: '#no-single-line-methods' Enabled: true Style/SpecialGlobalVars: Description: 'Avoid Perl-style global variables.' StyleGuide: '#no-cryptic-perlisms' Enabled: true Style/StabbyLambdaParentheses: Description: 'Check for the usage of parentheses around stabby lambda arguments.' StyleGuide: '#stabby-lambda-with-args' Enabled: true Style/StderrPuts: Description: 'Use `warn` instead of `$stderr.puts`.' StyleGuide: '#warn' Enabled: true Style/StringLiterals: Description: 'Checks if uses of quotes match the configured preference.' StyleGuide: '#consistent-string-literals' Enabled: true Exclude: - "db/schema.rb" Style/StringLiteralsInInterpolation: Description: >- Checks if uses of quotes inside expressions in interpolated strings match the configured preference. Enabled: true Style/StructInheritance: Description: 'Checks for inheritance from Struct.new.' StyleGuide: '#no-extend-struct-new' Enabled: true Style/SymbolArray: Description: 'Use %i or %I for arrays of symbols.' StyleGuide: '#percent-i' Enabled: true Style/SymbolLiteral: Description: 'Use plain symbols instead of string symbols when possible.' Enabled: true Style/SymbolProc: Description: 'Use symbols as procs instead of blocks when possible.' Enabled: true Style/TernaryParentheses: Description: 'Checks for use of parentheses around ternary conditions.' Enabled: true Style/TrailingBodyOnClass: Description: 'Class body goes below class statement.' Enabled: true Style/TrailingBodyOnMethodDefinition: Description: 'Method body goes below definition.' Enabled: true Style/TrailingBodyOnModule: Description: 'Module body goes below module statement.' Enabled: true Style/TrailingCommaInArguments: Description: 'Checks for trailing comma in argument lists.' StyleGuide: '#no-trailing-params-comma' Enabled: true Style/TrailingCommaInArrayLiteral: Description: 'Checks for trailing comma in array literals.' StyleGuide: '#no-trailing-array-commas' Enabled: true Style/TrailingCommaInHashLiteral: Description: 'Checks for trailing comma in hash literals.' Enabled: true Style/TrailingMethodEndStatement: Description: 'Checks for trailing end statement on line of method body.' Enabled: true Style/TrailingUnderscoreVariable: Description: >- Checks for the usage of unneeded trailing underscores at the end of parallel variable assignment. AllowNamedUnderscoreVariables: true Enabled: true Style/TrivialAccessors: Description: 'Prefer attr_* methods to trivial readers/writers.' StyleGuide: '#attr_family' Enabled: true Style/UnlessElse: Description: >- Do not use unless with else. Rewrite these with the positive case first. StyleGuide: '#no-else-with-unless' Enabled: true Style/UnneededCapitalW: Description: 'Checks for %W when interpolation is not needed.' Enabled: true Style/UnneededInterpolation: Description: 'Checks for strings that are just an interpolated expression.' Enabled: true Style/UnneededPercentQ: Description: 'Checks for %q/%Q when single quotes or double quotes would do.' StyleGuide: '#percent-q' Enabled: true Style/UnpackFirst: Description: >- Checks for accessing the first element of `String#unpack` instead of using `unpack1` Enabled: true Style/VariableInterpolation: Description: >- Don't interpolate global, instance and class variables directly in strings. StyleGuide: '#curlies-interpolate' Enabled: true Style/WhenThen: Description: 'Use when x then ... for one-line cases.' StyleGuide: '#one-line-cases' Enabled: true Style/WhileUntilDo: Description: 'Checks for redundant do after while or until.' StyleGuide: '#no-multiline-while-do' Enabled: true Style/WhileUntilModifier: Description: >- Favor modifier while/until usage when you have a single-line body. StyleGuide: '#while-as-a-modifier' Enabled: true Style/WordArray: Description: 'Use %w or %W for arrays of words.' StyleGuide: '#percent-w' Enabled: true Style/YodaCondition: Description: 'Do not use literals as the first operand of a comparison.' Reference: 'https://en.wikipedia.org/wiki/Yoda_conditions' Enabled: true Style/ZeroLengthPredicate: Description: 'Use #empty? when testing for objects of length 0.' Enabled: true ================================================ FILE: .travis.yml ================================================ dist: xenial language: ruby sudo: true cache: bundler git: depth: 50 rvm: - 2.5.3 services: - postgresql - redis-server matrix: include: - rvm: 2.5.3 name: 'RuboCop (for changed files)' if: branch != master script: - echo "$(git --no-pager diff --name-only $TRAVIS_COMMIT_RANGE)" | xargs bundle exec rubocop "$@" - rvm: 2.5.3 name: 'Perform DB setup (with seeds)' before_script: - cp config/database.yml.sample config/database.yml script: - bundle exec rake db:setup - rvm: 2.5.3 name: 'Tests' addons: apt: sources: - google-chrome packages: - google-chrome-stable before_install: - sudo apt-get update - sudo apt-get install chromium-chromedriver before_script: - export PATH=$PATH:/usr/lib/chromium-browser/ - cp config/database.yml.sample config/database.yml - cp .env.test .env - bundle exec rake db:create - bundle exec rake db:schema:load script: - bundle exec rspec ================================================ FILE: Dockerfile ================================================ FROM ruby:2.5 LABEL Stanislav Mekhonoshin ARG secret_token RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - RUN apt-get update && apt-get install -y --no-install-recommends \ nodejs \ netcat WORKDIR /app COPY ./ . ENV RAILS_ENV production ENV SECRET_TOKEN=$secret_token RUN gem install foreman RUN bundle install RUN cp config/database.yml.sample config/database.yml RUN rake assets:precompile CMD rm -f /app/tmp/pids/server.pid && rails db:migrate && foreman start -f Procfile ================================================ FILE: Dockerfile.dev ================================================ FROM ruby:2.5 LABEL Stanislav Mekhonoshin ARG secret_token ENV SECRET_TOKEN=$secret_token RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - RUN apt-get update && apt-get install -y --no-install-recommends \ apt-utils \ xvfb \ libxi6 \ libgconf-2-4 \ netcat \ wget \ gcc \ g++ \ make \ unzip \ nodejs \ openjdk-8-jre-headless RUN curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add \ && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list \ && apt-get -y update \ && apt-get -y install google-chrome-stable \ && rm -rf /var/lib/apt/lists/* /var/cache/apt/* RUN wget -N http://chromedriver.storage.googleapis.com/$(curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE)/chromedriver_linux64.zip -P ~/ \ && unzip ~/chromedriver_linux64.zip -d ~/ \ && rm ~/chromedriver_linux64.zip \ && mv -f ~/chromedriver /usr/local/bin/chromedriver \ && chown root:root /usr/local/bin/chromedriver \ && chmod 0755 /usr/local/bin/chromedriver RUN wget -N http://selenium-release.storage.googleapis.com/3.9/selenium-server-standalone-3.9.0.jar -P ~/ \ && mv -f ~/selenium-server-standalone-3.9.0.jar /usr/local/bin/selenium-server-standalone.jar \ && chown root:root /usr/local/bin/selenium-server-standalone.jar \ && chmod 0755 /usr/local/bin/selenium-server-standalone.jar WORKDIR /app COPY ./ . RUN cp config/database.yml.sample config/database.yml RUN gem install foreman RUN bundle install -j 4 RUN rake assets:precompile ================================================ FILE: Gemfile ================================================ # frozen_string_literal: true source 'http://rubygems.org' # TODO: temporary disable http, until ruby upgrade with new openssl # source 'https://rubygems.org' gem 'rails', '4.2.11' gem 'pg', '~> 0.15.1' gem 'pghero' gem 'thin' gem 'chartkick' gem 'aasm' gem 'activemerchant', '~> 1.32.1' gem 'bootstrap', '~> 4.2.1' gem 'cancan' gem 'clockwork' gem 'devise', '4.5.0' gem 'devise-i18n', '~> 0.10.3' gem 'font-awesome-sass', '~> 5.6.1' gem 'kaminari' gem 'rails-i18n' gem 'simple_form' gem 'slim' # Temporary broken with rails 4.2 gem 'active_model_serializers' # , github: 'rails-api/active_model_serializers', branch: '0-9-stable' gem 'ransack', '1.5.1' # TODO: switch to stable version gem 'carrierwave' gem 'draper', '1.4.0' gem 'gibbon' gem 'mechanize' gem 'rails_config' gem 'russian_central_bank' gem 'show_for', github: 'plataformatec/show_for' gem 'whenever', '0.9.0', require: false gem 'sidekiq' gem 'sinatra', require: false gem 'rollbar' # TODO: make it optional via ENV flag gem 'newrelic_rpm' gem 'json', '~> 1.8' gem 'thread_safe', '0.3.6' group :assets do gem 'coffee-rails', '~> 4.1.0' gem 'sass-rails' gem 'uglifier' end gem 'jquery-rails' gem 'jquery-ui-rails' gem 'ffi', '>= 1.9.24' gem 'jbuilder', '~> 1.0.1' group :development do gem 'better_errors' gem 'foreman' gem 'letter_opener' gem 'migration_opener' gem 'rubocop', require: false gem 'sandi_meter', require: false gem 'web-console', '~> 2.0' end group :test, :development do gem 'capybara' gem 'database_cleaner', '1.0.0.RC1' gem 'dotenv-rails' gem 'factory_girl_rails', '~> 4.0' gem 'faker' gem 'i18n-tasks', '~> 0.9.28' gem 'pry-rails' gem 'rspec-its' gem 'rspec-rails', '~> 3.8' gem 'shoulda-matchers', '4.0.0.rc1' gem 'vcr' # TODO: switch to stable version gem 'selenium-webdriver' gem 'timecop' end group :test do gem 'simplecov', require: false # TODO: switch to webmock since fakeweb is not supported anymore gem 'capybara-email' gem 'clockwork-test' gem 'fakeweb', github: 'chrisk/fakeweb' gem 'zonebie' end ================================================ FILE: LICENSE ================================================ Copyright (c) 2015 SmartVPN.biz Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: Procfile ================================================ web: bundle exec rails s -p 3000 -b 0.0.0.0 worker: bundle exec sidekiq -q high -q default -q mailers clockwork: clockwork config/clock.rb ================================================ FILE: README.md ================================================ # SmartVPN Billing [![Build Status](https://travis-ci.org/Mehonoshin/smartvpn-billing.svg?branch=master)](https://travis-ci.org/Mehonoshin/smartvpn-billing) [![](https://images.microbadger.com/badges/version/mexx/smartvpn-billing.svg)](https://hub.docker.com/r/mexx/smartvpn-billing) [![Inline docs](http://inch-ci.org/github/Mehonoshin/smartvpn-billing.svg?branch=master)](http://inch-ci.org/github/Mehonoshin/smartvpn-billing) smartvpn-billing ## About This repo contains just billing system for SmartVPN project. All further documentation in this repo relates only to billing system. If you are looking for general documentation about the whole SmartVPN please visit [Mehonoshin/smartvpn](https://github.com/Mehonoshin/smartvpn) repo. ## Docker image The docker image is built automatically on every merge to master. You can always pull the latest version of the image from Docker Hub. ``` docker pull mexx/smartvpn-billing ``` For more information about the builds visit docker hub page [mexx/smartvpn-billing](https://hub.docker.com/r/mexx/smartvpn-billing) ## Contribution guidelines TBD ### Development setup #### Set Up and Running app locally 1. Clone repo `git clone git@github.com:Mehonoshin/smartvpn-billing.git` 2. `cd smartvpn-billing` 3. `cp config/database.yml.sample config/database.yml` and enter the username and password for access to your database. 4. `cp .env.sample .env` 5. The file `.env` contains all the env variables used in the application. 6. `bundle install` 7. `rake db:setup` 8. `rails server` #### Start Up and Developing with Docker 1. Clone repo `git clone git@github.com:Mehonoshin/smartvpn-billing.git` 2. `cd smartvpn-billing` 3. `docker-compose -f docker-compose.development.yml up` 4. `cp .env.sample .env` 5. Edit your `SECRET_TOKEN` in `.env` 6. Go to http://lvh.me:3000 *How to run usual RoR command into docker* 1. `docker-compose -f docker-compose.development.yml up` 2. `docker-compose exec app bash` - connect to running container as named app 3. `RAILS_ENV=test ./bin/rake db:setup` - setup test database 4. `./bin/rails console` - run rails console 5. `RAILS_ENV=test bundle exec rspec spec` - start rspec tests How it works :) https://www.youtube.com/watch?v=VFRKPO5LHDg ### Admin access * To get admin access you can go to [http://localhost:3000/admins/sign_in](http://localhost:3000/admins/sign_in) * Email: `admin@smartvpn.biz` * Password: `1234567` Other accounts created during seeding can be found at: * [Admins](https://github.com/Mehonoshin/smartvpn-billing/blob/master/db/seeds/06_admin.rb) * [Users](https://github.com/Mehonoshin/smartvpn-billing/blob/master/db/seeds/04_default_user.rb#L8) ================================================ FILE: Rakefile ================================================ # frozen_string_literal: true # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require File.expand_path('config/application', __dir__) Smartvpn::Application.load_tasks ================================================ FILE: Vagrantfile ================================================ # frozen_string_literal: true # -*- mode: ruby -*- # vi: set ft=ruby : require 'date' # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = '2' DEFAULT_BOX = 'Sgoettschkes/debian7' SUBNET = '192.168.33' Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = DEFAULT_BOX config.vm.define 'dev', primary: true do |dev| dev.vm.network :private_network, ip: "#{SUBNET}.10" dev.vm.network :forwarded_port, guest: 5432, host: 5432 # pq dev.vm.network :forwarded_port, guest: 6379, host: 6379 # redis script = <<~SCRIPT date --set #{DateTime.now.strftime('%Y-%m-%d')} date --set #{DateTime.now.strftime('%H:%M')} set -e DEBIAN_FRONTEND=noninteractive apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 9D6D8F6BC857C906 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010 apt-get -qqy update PG_PKG=postgresql PG_INSTALLED=$(dpkg -l | grep -q ${PG_PKG} || echo "NOT") if [ "x${PG_INSTALLED}" = "xNOT" ] ; then echo 'deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main' > /etc/apt/sources.list.d/pgdg.list wget https://www.postgresql.org/media/keys/ACCC4CF8.asc --no-check-certificate apt-key add ACCC4CF8.asc apt-get update echo 'Name: libraries/restart-without-asking Template: libraries/restart-without-asking Value: true Owners: libssl1.0.0 Flags: seen' >> /var/cache/debconf/config.dat apt-get -qyf install postgresql-10 postgresql-contrib-10 postgresql postgresql-contrib sed -i "s|#listen_addresses.*$|listen_addresses = '*' |g" /etc/postgresql/9.3/main/postgresql.conf echo "host all all all trust" > /etc/postgresql/9.3/main/pg_hba.conf /etc/init.d/postgresql restart fi REDIS_PKG=redis-server REDIS_INSTALLED=$(dpkg -l | grep -q ${REDIS_PKG} || echo "NOT") if [ "x${REDIS_INSTALLED}" = "xNOT" ] ; then apt-get -qy install $REDIS_PKG sed -i "s|bind 127.0.0.1|#bind = 127.0.0.1|g" /etc/redis/redis.conf /etc/init.d/redis-server restart fi echo DONE SCRIPT dev.vm.provision :shell, inline: script end config.vm.define 'stage' do |stage| stage.vm.network :private_network, ip: "#{SUBNET}.11" end config.vm.define 'node' do |node| node.vm.network :private_network, ip: "#{SUBNET}.12" end end ================================================ FILE: app/assets/images/README.txt ================================================ ---------------------------- IMAGE DIRECTORY (/img) ---------------------------- This directory should contain all images used throughout the site. Images within the root are used by css as background images. ---------------------------- SUB DIRECTORIES ---------------------------- All other images to within sub-directories related to the section of the site they appear in. Maintaining this structure is optionally but recommended. /blog - all blog related photos /customers - customer/client logos /features - app feature screenshots /slides - slide images used on homepage banner /team - team member photos used in the about section /misc - random images ---------------------------- IMAGE & PHOTO CREDITS ---------------------------- * Slideshow graphics: http://medialoot.com & http://www.premiumpixels.com/ * Team photos: http://www.flickr.com/photos/vectorportal/sets/72157622868867274/ * Blog photos: http://www.flickr.com/photos/xjrlokix/ (Ben Fredericson) * Patterns: http://subtlepatterns.com/ ================================================ FILE: app/assets/images/invoice/license.txt ================================================ These icons were gathered from: iconfinder.com ================================================ FILE: app/assets/javascripts/admin.js.coffee ================================================ #= require jquery #= require jquery_ujs #= require jquery3 #= require popper #= require bootstrap-sprockets #= require Chart.bundle #= require chartkick ================================================ FILE: app/assets/javascripts/application.js.coffee ================================================ #= require jquery #= require jquery_ujs #= require ./theme/bootstrap-transition #= require ./theme/bootstrap-alert #= require ./theme/bootstrap-affix #= require ./theme/bootstrap-modal #= require ./theme/bootstrap-dropdown #= require ./theme/bootstrap-scrollspy #= require ./theme/bootstrap-tab #= require ./theme/bootstrap-tooltip #= require ./theme/bootstrap-popover #= require ./theme/bootstrap-button #= require ./theme/bootstrap-collapse #= require ./theme/bootstrap-carousel #= require ./theme/bootstrap-typeahead #= require ./theme/jquery.quicksand #= require ./theme/jquery.flexslider-min #= require ./theme/script #= require jquery.ui.all #= require main #= require options #= require jquery3 #= require popper #= require bootstrap-sprockets ================================================ FILE: app/assets/javascripts/main.js.coffee ================================================ $ -> credentialsToggler = $('.collapsable-credentials .toggler') vpnCredentials = $('.collapsable-credentials .vpn-credential') credentialsToggler.click (e) -> e.preventDefault() vpnCredentials.toggle() $("input.datepicker").each (i) -> $(this).datepicker altFormat: "mm-dd-yy" dateFormat: "mm-dd-yy" altField: $(this).next() ================================================ FILE: app/assets/javascripts/options.js.coffee ================================================ class @Options constructor: (scope) -> @option = $(scope) @bind() bind: -> @option.find('select').on 'change', @update update: (ev) -> $(ev.target).closest('form').submit() $ -> $("tr.option").each -> new Options(this) ================================================ FILE: app/assets/javascripts/theme/bootstrap-affix.js ================================================ /* ========================================================== * bootstrap-affix.js v2.2.2 * http://twitter.github.com/bootstrap/javascript.html#affix * ========================================================== * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================== */ !function ($) { "use strict"; // jshint ;_; /* AFFIX CLASS DEFINITION * ====================== */ var Affix = function (element, options) { this.options = $.extend({}, $.fn.affix.defaults, options) this.$window = $(window) .on('scroll.affix.data-api', $.proxy(this.checkPosition, this)) .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this)) this.$element = $(element) this.checkPosition() } Affix.prototype.checkPosition = function () { if (!this.$element.is(':visible')) return var scrollHeight = $(document).height() , scrollTop = this.$window.scrollTop() , position = this.$element.offset() , offset = this.options.offset , offsetBottom = offset.bottom , offsetTop = offset.top , reset = 'affix affix-top affix-bottom' , affix if (typeof offset != 'object') offsetBottom = offsetTop = offset if (typeof offsetTop == 'function') offsetTop = offset.top() if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' : offsetTop != null && scrollTop <= offsetTop ? 'top' : false if (this.affixed === affix) return this.affixed = affix this.unpin = affix == 'bottom' ? position.top - scrollTop : null this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : '')) } /* AFFIX PLUGIN DEFINITION * ======================= */ var old = $.fn.affix $.fn.affix = function (option) { return this.each(function () { var $this = $(this) , data = $this.data('affix') , options = typeof option == 'object' && option if (!data) $this.data('affix', (data = new Affix(this, options))) if (typeof option == 'string') data[option]() }) } $.fn.affix.Constructor = Affix $.fn.affix.defaults = { offset: 0 } /* AFFIX NO CONFLICT * ================= */ $.fn.affix.noConflict = function () { $.fn.affix = old return this } /* AFFIX DATA-API * ============== */ $(window).on('load', function () { $('[data-spy="affix"]').each(function () { var $spy = $(this) , data = $spy.data() data.offset = data.offset || {} data.offsetBottom && (data.offset.bottom = data.offsetBottom) data.offsetTop && (data.offset.top = data.offsetTop) $spy.affix(data) }) }) }(window.jQuery); ================================================ FILE: app/assets/javascripts/theme/bootstrap-alert.js ================================================ /* ========================================================== * bootstrap-alert.js v2.2.2 * http://twitter.github.com/bootstrap/javascript.html#alerts * ========================================================== * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================== */ !function ($) { "use strict"; // jshint ;_; /* ALERT CLASS DEFINITION * ====================== */ var dismiss = '[data-dismiss="alert"]' , Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.prototype.close = function (e) { var $this = $(this) , selector = $this.attr('data-target') , $parent if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 } $parent = $(selector) e && e.preventDefault() $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) $parent.trigger(e = $.Event('close')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { $parent .trigger('closed') .remove() } $.support.transition && $parent.hasClass('fade') ? $parent.on($.support.transition.end, removeElement) : removeElement() } /* ALERT PLUGIN DEFINITION * ======================= */ var old = $.fn.alert $.fn.alert = function (option) { return this.each(function () { var $this = $(this) , data = $this.data('alert') if (!data) $this.data('alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } $.fn.alert.Constructor = Alert /* ALERT NO CONFLICT * ================= */ $.fn.alert.noConflict = function () { $.fn.alert = old return this } /* ALERT DATA-API * ============== */ $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) }(window.jQuery); ================================================ FILE: app/assets/javascripts/theme/bootstrap-button.js ================================================ /* ============================================================ * bootstrap-button.js v2.2.2 * http://twitter.github.com/bootstrap/javascript.html#buttons * ============================================================ * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================ */ !function ($) { "use strict"; // jshint ;_; /* BUTTON PUBLIC CLASS DEFINITION * ============================== */ var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, $.fn.button.defaults, options) } Button.prototype.setState = function (state) { var d = 'disabled' , $el = this.$element , data = $el.data() , val = $el.is('input') ? 'val' : 'html' state = state + 'Text' data.resetText || $el.data('resetText', $el[val]()) $el[val](data[state] || this.options[state]) // push to event loop to allow forms to submit setTimeout(function () { state == 'loadingText' ? $el.addClass(d).attr(d, d) : $el.removeClass(d).removeAttr(d) }, 0) } Button.prototype.toggle = function () { var $parent = this.$element.closest('[data-toggle="buttons-radio"]') $parent && $parent .find('.active') .removeClass('active') this.$element.toggleClass('active') } /* BUTTON PLUGIN DEFINITION * ======================== */ var old = $.fn.button $.fn.button = function (option) { return this.each(function () { var $this = $(this) , data = $this.data('button') , options = typeof option == 'object' && option if (!data) $this.data('button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } $.fn.button.defaults = { loadingText: 'loading...' } $.fn.button.Constructor = Button /* BUTTON NO CONFLICT * ================== */ $.fn.button.noConflict = function () { $.fn.button = old return this } /* BUTTON DATA-API * =============== */ $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { var $btn = $(e.target) if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') $btn.button('toggle') }) }(window.jQuery); ================================================ FILE: app/assets/javascripts/theme/bootstrap-carousel.js ================================================ /* ========================================================== * bootstrap-carousel.js v2.2.2 * http://twitter.github.com/bootstrap/javascript.html#carousel * ========================================================== * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================== */ !function ($) { "use strict"; // jshint ;_; /* CAROUSEL CLASS DEFINITION * ========================= */ var Carousel = function (element, options) { this.$element = $(element) this.options = options this.options.pause == 'hover' && this.$element .on('mouseenter', $.proxy(this.pause, this)) .on('mouseleave', $.proxy(this.cycle, this)) } Carousel.prototype = { cycle: function (e) { if (!e) this.paused = false this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } , to: function (pos) { var $active = this.$element.find('.item.active') , children = $active.parent().children() , activePos = children.index($active) , that = this if (pos > (children.length - 1) || pos < 0) return if (this.sliding) { return this.$element.one('slid', function () { that.to(pos) }) } if (activePos == pos) { return this.pause().cycle() } return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) } , pause: function (e) { if (!e) this.paused = true if (this.$element.find('.next, .prev').length && $.support.transition.end) { this.$element.trigger($.support.transition.end) this.cycle() } clearInterval(this.interval) this.interval = null return this } , next: function () { if (this.sliding) return return this.slide('next') } , prev: function () { if (this.sliding) return return this.slide('prev') } , slide: function (type, next) { var $active = this.$element.find('.item.active') , $next = next || $active[type]() , isCycling = this.interval , direction = type == 'next' ? 'left' : 'right' , fallback = type == 'next' ? 'first' : 'last' , that = this , e this.sliding = true isCycling && this.pause() $next = $next.length ? $next : this.$element.find('.item')[fallback]() e = $.Event('slide', { relatedTarget: $next[0] }) if ($next.hasClass('active')) return if ($.support.transition && this.$element.hasClass('slide')) { this.$element.trigger(e) if (e.isDefaultPrevented()) return $next.addClass(type) $next[0].offsetWidth // force reflow $active.addClass(direction) $next.addClass(direction) this.$element.one($.support.transition.end, function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger('slid') }, 0) }) } else { this.$element.trigger(e) if (e.isDefaultPrevented()) return $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger('slid') } isCycling && this.cycle() return this } } /* CAROUSEL PLUGIN DEFINITION * ========================== */ var old = $.fn.carousel $.fn.carousel = function (option) { return this.each(function () { var $this = $(this) , data = $this.data('carousel') , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) , action = typeof option == 'string' ? option : options.slide if (!data) $this.data('carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.cycle() }) } $.fn.carousel.defaults = { interval: 5000 , pause: 'hover' } $.fn.carousel.Constructor = Carousel /* CAROUSEL NO CONFLICT * ==================== */ $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } /* CAROUSEL DATA-API * ================= */ $(document).on('click.carousel.data-api', '[data-slide]', function (e) { var $this = $(this), href , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 , options = $.extend({}, $target.data(), $this.data()) $target.carousel(options) e.preventDefault() }) }(window.jQuery); ================================================ FILE: app/assets/javascripts/theme/bootstrap-collapse.js ================================================ /* ============================================================= * bootstrap-collapse.js v2.2.2 * http://twitter.github.com/bootstrap/javascript.html#collapse * ============================================================= * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================ */ !function ($) { "use strict"; // jshint ;_; /* COLLAPSE PUBLIC CLASS DEFINITION * ================================ */ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, $.fn.collapse.defaults, options) if (this.options.parent) { this.$parent = $(this.options.parent) } this.options.toggle && this.toggle() } Collapse.prototype = { constructor: Collapse , dimension: function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } , show: function () { var dimension , scroll , actives , hasData if (this.transitioning) return dimension = this.dimension() scroll = $.camelCase(['scroll', dimension].join('-')) actives = this.$parent && this.$parent.find('> .accordion-group > .in') if (actives && actives.length) { hasData = actives.data('collapse') if (hasData && hasData.transitioning) return actives.collapse('hide') hasData || actives.data('collapse', null) } this.$element[dimension](0) this.transition('addClass', $.Event('show'), 'shown') $.support.transition && this.$element[dimension](this.$element[0][scroll]) } , hide: function () { var dimension if (this.transitioning) return dimension = this.dimension() this.reset(this.$element[dimension]()) this.transition('removeClass', $.Event('hide'), 'hidden') this.$element[dimension](0) } , reset: function (size) { var dimension = this.dimension() this.$element .removeClass('collapse') [dimension](size || 'auto') [0].offsetWidth this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') return this } , transition: function (method, startEvent, completeEvent) { var that = this , complete = function () { if (startEvent.type == 'show') that.reset() that.transitioning = 0 that.$element.trigger(completeEvent) } this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return this.transitioning = 1 this.$element[method]('in') $.support.transition && this.$element.hasClass('collapse') ? this.$element.one($.support.transition.end, complete) : complete() } , toggle: function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } } /* COLLAPSE PLUGIN DEFINITION * ========================== */ var old = $.fn.collapse $.fn.collapse = function (option) { return this.each(function () { var $this = $(this) , data = $this.data('collapse') , options = typeof option == 'object' && option if (!data) $this.data('collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } $.fn.collapse.defaults = { toggle: true } $.fn.collapse.Constructor = Collapse /* COLLAPSE NO CONFLICT * ==================== */ $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } /* COLLAPSE DATA-API * ================= */ $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { var $this = $(this), href , target = $this.attr('data-target') || e.preventDefault() || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 , option = $(target).data('collapse') ? 'toggle' : $this.data() $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') $(target).collapse(option) }) }(window.jQuery); ================================================ FILE: app/assets/javascripts/theme/bootstrap-dropdown.js ================================================ /* ============================================================ * bootstrap-dropdown.js v2.2.2 * http://twitter.github.com/bootstrap/javascript.html#dropdowns * ============================================================ * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================ */ !function ($) { "use strict"; // jshint ;_; /* DROPDOWN CLASS DEFINITION * ========================= */ var toggle = '[data-toggle=dropdown]' , Dropdown = function (element) { var $el = $(element).on('click.dropdown.data-api', this.toggle) $('html').on('click.dropdown.data-api', function () { $el.parent().removeClass('open') }) } Dropdown.prototype = { constructor: Dropdown , toggle: function (e) { var $this = $(this) , $parent , isActive if ($this.is('.disabled, :disabled')) return $parent = getParent($this) isActive = $parent.hasClass('open') clearMenus() if (!isActive) { $parent.toggleClass('open') } $this.focus() return false } , keydown: function (e) { var $this , $items , $active , $parent , isActive , index if (!/(38|40|27)/.test(e.keyCode)) return $this = $(this) e.preventDefault() e.stopPropagation() if ($this.is('.disabled, :disabled')) return $parent = getParent($this) isActive = $parent.hasClass('open') if (!isActive || (isActive && e.keyCode == 27)) return $this.click() $items = $('[role=menu] li:not(.divider):visible a', $parent) if (!$items.length) return index = $items.index($items.filter(':focus')) if (e.keyCode == 38 && index > 0) index-- // up if (e.keyCode == 40 && index < $items.length - 1) index++ // down if (!~index) index = 0 $items .eq(index) .focus() } } function clearMenus() { $(toggle).each(function () { getParent($(this)).removeClass('open') }) } function getParent($this) { var selector = $this.attr('data-target') , $parent if (!selector) { selector = $this.attr('href') selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 } $parent = $(selector) $parent.length || ($parent = $this.parent()) return $parent } /* DROPDOWN PLUGIN DEFINITION * ========================== */ var old = $.fn.dropdown $.fn.dropdown = function (option) { return this.each(function () { var $this = $(this) , data = $this.data('dropdown') if (!data) $this.data('dropdown', (data = new Dropdown(this))) if (typeof option == 'string') data[option].call($this) }) } $.fn.dropdown.Constructor = Dropdown /* DROPDOWN NO CONFLICT * ==================== */ $.fn.dropdown.noConflict = function () { $.fn.dropdown = old return this } /* APPLY TO STANDARD DROPDOWN ELEMENTS * =================================== */ $(document) .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus) .on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('touchstart.dropdown.data-api', '.dropdown-menu', function (e) { e.stopPropagation() }) .on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle) .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) }(window.jQuery); ================================================ FILE: app/assets/javascripts/theme/bootstrap-modal.js ================================================ /* ========================================================= * bootstrap-modal.js v2.2.2 * http://twitter.github.com/bootstrap/javascript.html#modals * ========================================================= * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================= */ !function ($) { "use strict"; // jshint ;_; /* MODAL CLASS DEFINITION * ====================== */ var Modal = function (element, options) { this.options = options this.$element = $(element) .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) this.options.remote && this.$element.find('.modal-body').load(this.options.remote) } Modal.prototype = { constructor: Modal , toggle: function () { return this[!this.isShown ? 'show' : 'hide']() } , show: function () { var that = this , e = $.Event('show') this.$element.trigger(e) if (this.isShown || e.isDefaultPrevented()) return this.isShown = true this.escape() this.backdrop(function () { var transition = $.support.transition && that.$element.hasClass('fade') if (!that.$element.parent().length) { that.$element.appendTo(document.body) //don't move modals dom position } that.$element .show() if (transition) { that.$element[0].offsetWidth // force reflow } that.$element .addClass('in') .attr('aria-hidden', false) that.enforceFocus() transition ? that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : that.$element.focus().trigger('shown') }) } , hide: function (e) { e && e.preventDefault() var that = this e = $.Event('hide') this.$element.trigger(e) if (!this.isShown || e.isDefaultPrevented()) return this.isShown = false this.escape() $(document).off('focusin.modal') this.$element .removeClass('in') .attr('aria-hidden', true) $.support.transition && this.$element.hasClass('fade') ? this.hideWithTransition() : this.hideModal() } , enforceFocus: function () { var that = this $(document).on('focusin.modal', function (e) { if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { that.$element.focus() } }) } , escape: function () { var that = this if (this.isShown && this.options.keyboard) { this.$element.on('keyup.dismiss.modal', function ( e ) { e.which == 27 && that.hide() }) } else if (!this.isShown) { this.$element.off('keyup.dismiss.modal') } } , hideWithTransition: function () { var that = this , timeout = setTimeout(function () { that.$element.off($.support.transition.end) that.hideModal() }, 500) this.$element.one($.support.transition.end, function () { clearTimeout(timeout) that.hideModal() }) } , hideModal: function (that) { this.$element .hide() .trigger('hidden') this.backdrop() } , removeBackdrop: function () { this.$backdrop.remove() this.$backdrop = null } , backdrop: function (callback) { var that = this , animate = this.$element.hasClass('fade') ? 'fade' : '' if (this.isShown && this.options.backdrop) { var doAnimate = $.support.transition && animate this.$backdrop = $('