├── .browserslistrc ├── .github ├── labels.yml ├── main.workflow └── workflows │ ├── stop-hacktoberfest-spam.yml │ └── sync-labels.yml ├── .gitignore ├── .haml-lint.yml ├── .rubocop.yml ├── .ruby-version ├── .travis.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Capfile ├── Gemfile ├── Gemfile.lock ├── LICENCE ├── README.md ├── Rakefile ├── app ├── assets │ ├── config │ │ └── manifest.js │ ├── images │ │ ├── .keep │ │ ├── anonymous.png │ │ ├── background-overlay-1.png │ │ ├── background-overlay-2.png │ │ ├── become-a-mentor-chat.png │ │ ├── become-a-mentor-line.png │ │ ├── blank.png │ │ ├── code-background.png │ │ ├── code-sample-frame.png │ │ ├── company │ │ │ ├── about-header.jpg │ │ │ ├── header-rhs.png │ │ │ ├── photo-map.png │ │ │ ├── stats-background.jpg │ │ │ ├── stats-hex.png │ │ │ ├── strategy-header.jpg │ │ │ ├── supporter-header.jpg │ │ │ ├── supporters-header.jpg │ │ │ ├── supporters-icon.png │ │ │ └── team-header.jpg │ │ ├── favicon │ │ │ ├── apple-touch-icon-114x114.png │ │ │ ├── apple-touch-icon-120x120.png │ │ │ ├── apple-touch-icon-144x144.png │ │ │ ├── apple-touch-icon-152x152.png │ │ │ ├── apple-touch-icon-57x57.png │ │ │ ├── apple-touch-icon-72x72.png │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon.ico │ │ │ └── mstile-144x144.png │ │ ├── hex-background.png │ │ ├── how-step-1.png │ │ ├── how-step-2.png │ │ ├── how-step-3.png │ │ ├── how-step-4-exercises.png │ │ ├── how-step-4.png │ │ ├── how-step-5.png │ │ ├── icon.png │ │ ├── landing-page-background.png │ │ ├── laptop-people.png │ │ ├── lego-construction.jpg │ │ ├── li-tick.png │ │ ├── logo-green.png │ │ ├── logo-white.png │ │ ├── logo.png │ │ ├── mailers │ │ │ ├── footer-bar.png │ │ │ └── logo.png │ │ ├── mentor-bg.jpg │ │ ├── nav-divider.png │ │ ├── people │ │ │ ├── 1.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ ├── 5.png │ │ │ ├── 6.png │ │ │ ├── 7.png │ │ │ └── 8.png │ │ ├── pr-logos │ │ │ ├── changelog.png │ │ │ ├── code-newbie.png │ │ │ ├── codeship.png │ │ │ ├── linux.png │ │ │ ├── opensource.png │ │ │ ├── sd-times.png │ │ │ └── wired.png │ │ ├── profile-blanked-out.png │ │ ├── research-header.png │ │ ├── research-landing-page-background.png │ │ ├── research │ │ │ ├── background.jpg │ │ │ ├── chicago-logo.png │ │ │ ├── choose-icon.png │ │ │ ├── data-icon.png │ │ │ ├── funding-icon.png │ │ │ ├── gary-lupyan.jpg │ │ │ ├── james-evans.jpg │ │ │ ├── methodology-icon.png │ │ │ ├── research-icon.png │ │ │ ├── researcher-background.jpg │ │ │ ├── scope-icon.png │ │ │ ├── sloan-logo.png │ │ │ └── wisconsin-logo.png │ │ ├── speech-marks.png │ │ ├── supporter-logos │ │ │ ├── chicago.jpg │ │ │ ├── mozilla-black.png │ │ │ ├── mozilla-white.png │ │ │ ├── sloan-black.png │ │ │ ├── sloan-white.png │ │ │ ├── thalamus-black.png │ │ │ ├── thalamus-white.png │ │ │ └── wisconsin.png │ │ ├── team-default-avatar.png │ │ ├── tick-color-1.png │ │ ├── tick-white.png │ │ ├── tmp │ │ │ ├── exercise-icon-dark.png │ │ │ ├── exercise-icon-turquoise.png │ │ │ ├── exercise-icon-white.png │ │ │ └── exercise-icon.png │ │ ├── track-page-code-sample-frame.png │ │ ├── track-page-exercises.png │ │ ├── track-page-mentors.png │ │ ├── track-page-students.png │ │ ├── turquoise-hex.png │ │ └── well-done.png │ └── stylesheets │ │ ├── admin │ │ ├── analyses.scss │ │ ├── analysis.scss │ │ ├── test-runner-form.scss │ │ ├── test-runner.scss │ │ ├── test_runners.scss │ │ └── users.scss │ │ ├── announcement-bar.css.scss │ │ ├── application.css │ │ ├── changelog_admin │ │ ├── edit-entry.scss │ │ ├── entries.scss │ │ ├── entry.scss │ │ ├── form.scss │ │ ├── new-entry.scss │ │ └── page.scss │ │ ├── cli-walkthrough.scss │ │ ├── code-editor.scss │ │ ├── cta-footer.scss │ │ ├── defaults.scss │ │ ├── editable-text.scss │ │ ├── footer.scss │ │ ├── header.scss │ │ ├── layout.scss │ │ ├── libs │ │ ├── bootstrap-markdown.scss │ │ └── rangeslider.scss │ │ ├── logged-in-header.scss │ │ ├── logged-out-header.scss │ │ ├── mailer.scss │ │ ├── mixins.scss │ │ ├── modal.css.scss │ │ ├── nav-bar.scss │ │ ├── new-editable-text.scss │ │ ├── pages │ │ ├── about.scss │ │ ├── become-a-mentor.scss │ │ ├── blog-post.scss │ │ ├── blog-posts.scss │ │ ├── decide-allow-comments-modal.scss │ │ ├── devise-page.scss │ │ ├── edit-profile-avatar-section.scss │ │ ├── edit-profile.scss │ │ ├── exercise-page.scss │ │ ├── exercises-page.css.scss │ │ ├── generic-page.scss │ │ ├── introducing-research-modal.scss │ │ ├── js-ecma-migration-page.scss │ │ ├── landing-page.scss │ │ ├── log-in-page.scss │ │ ├── mentor-configure.scss │ │ ├── mentor-dashboard-welcome-modal.scss │ │ ├── mentor-dashboard.scss │ │ ├── mentor-exercise-notes.scss │ │ ├── mentor-solution.scss │ │ ├── my-notifications.scss │ │ ├── my-preferences.css.scss │ │ ├── my-settings.scss │ │ ├── my-solution-unlocked-page.scss │ │ ├── my-solution-walkthrough.scss │ │ ├── my-solution │ │ │ ├── show-finished-section.scss │ │ │ ├── show-rhs.scss │ │ │ └── show.scss │ │ ├── my-solutions.scss │ │ ├── my-stared-solutions.scss │ │ ├── my-track │ │ │ ├── danger-zone.scss │ │ │ ├── modals.scss │ │ │ ├── progress-section.scss │ │ │ └── show.scss │ │ ├── my-tracks.scss │ │ ├── new-mentor-registration.scss │ │ ├── new-profile.scss │ │ ├── not-published-solution.scss │ │ ├── onboarding.css.scss │ │ ├── organisation.scss │ │ ├── profile-page.scss │ │ ├── profiles-page.scss │ │ ├── solution-page.scss │ │ ├── solutions-page.scss │ │ ├── strategy.scss │ │ ├── supporter.scss │ │ ├── supporters.scss │ │ ├── team-page.scss │ │ ├── track-page.scss │ │ ├── tracks-page.css.scss │ │ ├── unsubscribe.css.scss │ │ └── v3-patience-modal.scss │ │ ├── pagination.scss │ │ ├── prism-modifications.scss │ │ ├── pure-modifications.scss │ │ ├── research.scss │ │ ├── research │ │ ├── code-editor.scss │ │ ├── experiment-solution-page.scss.erb │ │ ├── experiment-solution-page.theme │ │ ├── experiment.scss │ │ ├── experiments.scss │ │ ├── keyboard-shortcuts.scss │ │ ├── landing-page.scss │ │ ├── overlay.scss │ │ ├── post_exercise_survey.scss │ │ ├── submission-error.scss │ │ ├── submission-status.scss │ │ ├── survey.scss │ │ ├── user-experiment-language.scss │ │ ├── user-experiment.scss │ │ └── websocket-compatibility-message.scss │ │ ├── settings-bar.scss │ │ ├── tabs-and-panes.scss │ │ ├── teams-header.scss │ │ ├── teams.scss │ │ ├── teams │ │ ├── edit-team.scss │ │ ├── invitations.scss │ │ ├── join.scss │ │ ├── landing-page.scss │ │ ├── memberships.scss │ │ ├── my-solution-unlocked.scss │ │ ├── my-solutions.scss │ │ ├── new-solution.scss │ │ ├── new-team.scss │ │ ├── solution.scss │ │ ├── solutions.scss │ │ ├── team.scss │ │ ├── teams-table.scss │ │ └── teams.scss │ │ ├── unsubscribe.scss │ │ ├── variables.scss │ │ └── widgets │ │ ├── code-person.scss │ │ ├── code-snippet.scss │ │ ├── discussion-post.scss │ │ ├── file-selector.scss │ │ ├── filter.scss │ │ ├── iterations-nav.scss │ │ ├── maintainer.scss │ │ ├── mentor.scss │ │ ├── panels.scss │ │ ├── recaptcha.scss │ │ ├── side-exercise.scss │ │ └── solution-comment.scss ├── channels │ ├── application_cable │ │ ├── channel.rb │ │ └── connection.rb │ └── research_solution_channel.rb ├── controllers │ ├── admin │ │ ├── analyses_controller.rb │ │ ├── dashboard_controller.rb │ │ ├── data │ │ │ ├── exercises_controller.rb │ │ │ ├── experiments_controller.rb │ │ │ └── tracks_controller.rb │ │ ├── iterations_controller.rb │ │ ├── mentors_controller.rb │ │ ├── solutions_controller.rb │ │ ├── test_runner_version_samples_controller.rb │ │ ├── test_runner_versions_controller.rb │ │ ├── test_runners_controller.rb │ │ └── users_controller.rb │ ├── admin_controller.rb │ ├── api │ │ ├── base_controller.rb │ │ ├── cli_settings_controller.rb │ │ ├── errors_controller.rb │ │ ├── files_controller.rb │ │ ├── ping_controller.rb │ │ ├── solutions_controller.rb │ │ ├── tracks_controller.rb │ │ ├── validate_token_controller.rb │ │ ├── webhooks │ │ │ ├── analyzers_controller.rb │ │ │ ├── contributors_controller.rb │ │ │ └── repo_updates_controller.rb │ │ └── webhooks_controller.rb │ ├── application_controller.rb │ ├── blog_comments_controller.rb │ ├── blog_posts_controller.rb │ ├── changelog_admin │ │ ├── base_controller.rb │ │ ├── entries_controller.rb │ │ └── referenceables_controller.rb │ ├── changelog_entries_controller.rb │ ├── confirmations_controller.rb │ ├── exercises_controller.rb │ ├── git_api │ │ ├── base_controller.rb │ │ ├── concept_exercises_controller.rb │ │ └── tracks_controller.rb │ ├── legacy_routes_controller.rb │ ├── markdown_controller.rb │ ├── mentor │ │ ├── configure_controller.rb │ │ ├── dashboard_controller.rb │ │ ├── discussion_posts_controller.rb │ │ ├── exercise_notes_controller.rb │ │ ├── registrations_controller.rb │ │ └── solutions_controller.rb │ ├── mentor_controller.rb │ ├── my │ │ ├── dashboard_controller.rb │ │ ├── discussion_posts_controller.rb │ │ ├── iterations_controller.rb │ │ ├── notifications_controller.rb │ │ ├── preferences_controller.rb │ │ ├── profile_controller.rb │ │ ├── settings_controller.rb │ │ ├── side_exercises_controller.rb │ │ ├── solutions_controller.rb │ │ ├── starred_solutions_controller.rb │ │ ├── submissions_controller.rb │ │ ├── track_settings_controller.rb │ │ ├── tracks_controller.rb │ │ └── user_tracks_controller.rb │ ├── my_controller.rb │ ├── omniauth_callbacks_controller.rb │ ├── onboardings_controller.rb │ ├── pages_controller.rb │ ├── profiles_controller.rb │ ├── registrations_controller.rb │ ├── research │ │ ├── base_controller.rb │ │ ├── experiment_solutions_controller.rb │ │ ├── experiments_controller.rb │ │ ├── joins_controller.rb │ │ ├── omniauth_callbacks_controller.rb │ │ ├── pages_controller.rb │ │ ├── sessions_controller.rb │ │ ├── user_experiment_survey_controller.rb │ │ └── user_experiments_controller.rb │ ├── sessions_controller.rb │ ├── solution_comments_controller.rb │ ├── solutions_controller.rb │ ├── spi │ │ ├── base_controller.rb │ │ └── test_runner_controller.rb │ ├── team_pages_controller.rb │ ├── teams │ │ ├── base_controller.rb │ │ ├── dashboard_controller.rb │ │ ├── invitations_controller.rb │ │ ├── pages_controller.rb │ │ ├── teams │ │ │ ├── base_controller.rb │ │ │ ├── discussion_posts_controller.rb │ │ │ ├── invitations_controller.rb │ │ │ ├── joins_controller.rb │ │ │ ├── memberships_controller.rb │ │ │ ├── my_solutions_controller.rb │ │ │ └── solutions_controller.rb │ │ └── teams_controller.rb │ ├── track_pages_controller.rb │ ├── tracks_controller.rb │ └── unsubscribe_controller.rb ├── forms │ └── changelog_entry_form.rb ├── helpers │ ├── a11y_helper.rb │ ├── application_helper.rb │ ├── blog_comments_helper.rb │ ├── blog_posts_helper.rb │ ├── breadcrumb_helper.rb │ ├── changelog_entry_helper.rb │ ├── comments_helper.rb │ ├── communication_preferences_helper.rb │ ├── contributor_image_helper.rb │ ├── default_allow_comments_helper.rb │ ├── exercise_helper.rb │ ├── file_helper.rb │ ├── layout_helper.rb │ ├── mentor_feedback_request_helper.rb │ ├── mentor_helper.rb │ ├── metadata_helper.rb │ ├── notifications_helper.rb │ ├── options_helper.rb │ ├── panel_helper.rb │ ├── research_helper.rb │ ├── settings_helper.rb │ ├── solutions_helper.rb │ ├── teams_helper.rb │ ├── time_ago_in_words_helper.rb │ ├── track_pages_helper.rb │ ├── tracks_helper.rb │ ├── unsubscribe_helper.rb │ ├── user_helper.rb │ └── widgets_helper.rb ├── javascript │ ├── channels │ │ ├── consumer.js │ │ ├── index.js │ │ └── research_solution_channel.js │ ├── packs │ │ └── application.js │ ├── src │ │ ├── ace-editor-config.js │ │ ├── ace-editor.js │ │ ├── blog_post.js │ │ ├── buttons.js │ │ ├── changelog_admin │ │ │ └── referenceable_search.js │ │ ├── code-block.js │ │ ├── code-editor-manager.js │ │ ├── code-editor.js │ │ ├── code_snippet.js │ │ ├── collapse.js │ │ ├── editable-text.js │ │ ├── editor-preference.js │ │ ├── experiment-solution.js │ │ ├── file.js │ │ ├── image-preview.js │ │ ├── info_panel.js │ │ ├── keyboard_shortcuts.js │ │ ├── landing-page.js │ │ ├── libs │ │ │ └── bootstrap-markdown.js │ │ ├── modal.js │ │ ├── my-track-mentored.js │ │ ├── new-editable-text.js │ │ ├── options.js │ │ ├── page_theme_select.js │ │ ├── selectize.js │ │ ├── selects.js │ │ ├── solution.js │ │ ├── submission.js │ │ ├── submission_status_view.js │ │ ├── submit_button.js │ │ ├── tabs.js │ │ ├── timeout_timer.js │ │ ├── walkthrough.js │ │ └── websockets_compatibility_message.js │ └── tests │ │ ├── ace-editor-config.test.js │ │ ├── ace-editor.test.js │ │ ├── collapse.test.js │ │ ├── editor-preference.test.js │ │ ├── experiment-solution.test.js │ │ ├── keyboard-shortcuts.test.js │ │ ├── page-theme-select.test.js │ │ └── setup.js ├── jobs │ ├── application_job.rb │ ├── broadcast_solution_job.rb │ ├── broadcast_submission_job.rb │ ├── changelog_entry_tweet_job.rb │ ├── fetch_repo_update_job.rb │ ├── process_new_iteration_job.rb │ └── sync_repo_update_job.rb ├── listeners │ └── listen_for_analyzed_iterations.rb ├── mailers │ ├── application_mailer.rb │ ├── devise_mailer.rb │ ├── heartbeat_mailer.rb │ ├── mentor_notifications_mailer.rb │ ├── newsletter_mailer.rb │ ├── solution_comments_mailer.rb │ ├── team_invite_mailer.rb │ └── user_notifications_mailer.rb ├── models │ ├── api │ │ └── solution_responder.rb │ ├── application_record.rb │ ├── auth_token.rb │ ├── blog_comment.rb │ ├── blog_post.rb │ ├── changelog_entry.rb │ ├── changelog_entry │ │ ├── general_referenceable.rb │ │ ├── referenceable.rb │ │ ├── referenceable_exercise.rb │ │ └── referenceable_track.rb │ ├── changelog_entry_tweet.rb │ ├── cluster_config.rb │ ├── communication_preferences.rb │ ├── concerns │ │ ├── .keep │ │ └── solution_base.rb │ ├── contributor.rb │ ├── discussion_post.rb │ ├── exercise.rb │ ├── exercise_map.rb │ ├── exercise_map_node.rb │ ├── exercise_topic.rb │ ├── git │ │ ├── blog_repository.rb │ │ ├── exercise.rb │ │ ├── exercise_config.rb │ │ ├── exercise_reader.rb │ │ ├── exercism_repo.rb │ │ ├── github_profile.rb │ │ ├── null_github_profile.rb │ │ ├── problem_specifications.rb │ │ ├── repo_base.rb │ │ ├── state_db.rb │ │ ├── tests_info.rb │ │ └── website_content.rb │ ├── guest.rb │ ├── ignored_solution_mentorship.rb │ ├── infrastructure.rb │ ├── infrastructure │ │ ├── test_runner.rb │ │ └── test_runner_version.rb │ ├── iteration.rb │ ├── iteration_analysis.rb │ ├── iteration_file.rb │ ├── maintainer.rb │ ├── mentor.rb │ ├── mentor_feedback_request.rb │ ├── notification.rb │ ├── null_track.rb │ ├── null_user.rb │ ├── profile.rb │ ├── repo_update.rb │ ├── repo_update_fetch.rb │ ├── research.rb │ ├── research │ │ ├── exercise_slug.rb │ │ ├── experiment.rb │ │ ├── experiment_solution.rb │ │ └── user_experiment.rb │ ├── solution.rb │ ├── solution_comment.rb │ ├── solution_lock.rb │ ├── solution_mentorship.rb │ ├── solution_star.rb │ ├── submission.rb │ ├── submission_ops_status.rb │ ├── submission_test_run.rb │ ├── submission_test_run_result.rb │ ├── team.rb │ ├── team_invitation.rb │ ├── team_membership.rb │ ├── team_solution.rb │ ├── terminal_output.rb │ ├── testimonial.rb │ ├── topic.rb │ ├── track.rb │ ├── track_mentorship.rb │ ├── twitter_account.rb │ ├── user.rb │ ├── user_email_log.rb │ └── user_track.rb ├── policies │ ├── allowed_to_comment_policy.rb │ ├── allowed_to_mentor_policy.rb │ └── changelog_admin │ │ ├── allowed_to_access_policy.rb │ │ ├── allowed_to_delete_entry_policy.rb │ │ ├── allowed_to_edit_entry_policy.rb │ │ ├── allowed_to_publish_entry_policy.rb │ │ └── allowed_to_unpublish_entry_policy.rb ├── presenters │ ├── changelog_entry_presenter.rb │ └── profile_presenter.rb ├── queries │ └── mentored_solutions_query.rb ├── serializers │ └── twitter_account_serializer.rb ├── services │ ├── abandon_overdue_solution_mentorships.rb │ ├── abandon_solution_mentorship.rb │ ├── analysis_services │ │ ├── approve.rb │ │ ├── build_comment.rb │ │ ├── build_comment_commentary.rb │ │ ├── build_comments.rb │ │ ├── post_comments.rb │ │ ├── process_analysis.rb │ │ └── unlock_solution.rb │ ├── approve_solution.rb │ ├── authenticate_user_from_omniauth.rb │ ├── bootstrap_user.rb │ ├── cache_solution_num_mentors.rb │ ├── cancel_mentoring_request_for_solution.rb │ ├── changelog_entry_services │ │ └── tweet.rb │ ├── clear_notifications.rb │ ├── complete_solution.rb │ ├── create_blog_comment.rb │ ├── create_iteration.rb │ ├── create_notification.rb │ ├── create_profile.rb │ ├── create_solution.rb │ ├── create_solution_comment.rb │ ├── create_solution_mentorship.rb │ ├── create_solution_star.rb │ ├── create_system_discussion_post.rb │ ├── create_team.rb │ ├── create_team_discussion_post.rb │ ├── create_team_invitation.rb │ ├── create_team_membership.rb │ ├── create_team_solution.rb │ ├── create_track.rb │ ├── creates_discussion_post.rb │ ├── creates_mentor_discussion_post.rb │ ├── creates_user_discussion_post.rb │ ├── deliver_email.rb │ ├── exercise_services │ │ └── update_median_wait_time.rb │ ├── export_experiment_data.rb │ ├── export_solutions_data.rb │ ├── filters_solutions_by_status.rb │ ├── fix_unlocking_in_user_track.rb │ ├── generate_mentor_heartbeats.rb │ ├── generate_team_activity_feed.rb │ ├── git │ │ ├── fetch_repo.rb │ │ ├── fetch_repos.rb │ │ ├── fetch_updated_repos.rb │ │ ├── seed_track.rb │ │ ├── seed_tracks.rb │ │ ├── sync_blog_posts.rb │ │ ├── sync_maintainers.rb │ │ ├── sync_mentors.rb │ │ ├── sync_track.rb │ │ ├── sync_tracks.rb │ │ ├── sync_updated_repos.rb │ │ ├── sync_website_copy.rb │ │ └── update_repos.rb │ ├── html_generation_helpers.rb │ ├── infrastructure_services │ │ ├── update_built_test_runner_versions.rb │ │ └── update_deployed_test_runner_versions.rb │ ├── join_track.rb │ ├── lock_solution.rb │ ├── make_user_a_mentor.rb │ ├── parse_markdown.rb │ ├── pause_user_track.rb │ ├── pub_sub │ │ ├── publish_message.rb │ │ └── publish_new_iteration.rb │ ├── publish_solution.rb │ ├── remind_about_solution.rb │ ├── remind_overdue_solution_mentorships.rb │ ├── remind_solution_mentorship.rb │ ├── render_user_walkthrough.rb │ ├── request_mentoring_on_solution.rb │ ├── research │ │ ├── create_solution.rb │ │ └── create_user_experiment.rb │ ├── retrieve_mentor_exercise_notes.rb │ ├── retrieve_solutions_for_mentor.rb │ ├── review_solution_mentoring.rb │ ├── select_suggested_solutions_for_mentor.rb │ ├── set_prism_languages_for_tracks.rb │ ├── solutions_to_be_mentored.rb │ ├── submission_services │ │ ├── create.rb │ │ ├── download_files.rb │ │ ├── process_test_run.rb │ │ ├── run_tests.rb │ │ ├── upload_to_s3_for_storage.rb │ │ └── upload_to_s3_for_testing.rb │ ├── switch_track_to_independent_mode.rb │ ├── switch_track_to_mentored_mode.rb │ ├── sync_contributors.rb │ ├── track_services │ │ └── update_median_wait_time.rb │ ├── unlock_core_exercise.rb │ ├── unlock_next_core_exercise.rb │ ├── unpause_user_track.rb │ ├── upload_iteration_to_s3.rb │ ├── user_services │ │ └── delete.rb │ └── zip_directory_recursively.rb ├── support │ ├── site_context.rb │ └── sql_snippets.rb ├── tasks │ └── temporary │ │ └── delete_stale_notifications_task.rb ├── validators │ └── handle_validator.rb ├── views │ ├── admin │ │ ├── analyses │ │ │ ├── index.html.haml │ │ │ └── show.html.haml │ │ ├── dashboard │ │ │ └── show.html.haml │ │ ├── data │ │ │ └── tracks │ │ │ │ ├── index.html.haml │ │ │ │ └── show.html.haml │ │ ├── mentors │ │ │ └── index.html.haml │ │ ├── solutions │ │ │ └── show.html.haml │ │ ├── test_runner_version_samples │ │ │ ├── new.html.haml │ │ │ └── show.html.haml │ │ ├── test_runner_versions │ │ │ ├── new.html.haml │ │ │ └── show.html.haml │ │ ├── test_runners │ │ │ ├── edit.html.haml │ │ │ ├── index.html.haml │ │ │ ├── new.html.haml │ │ │ └── show.html.haml │ │ └── users │ │ │ └── show.html.haml │ ├── blog_comments │ │ ├── _comment.html.haml │ │ ├── create.js.haml │ │ ├── destroy.js.haml │ │ └── update.js.haml │ ├── blog_posts │ │ ├── _comments.html.haml │ │ ├── _new_comment.html.haml │ │ ├── index.html.haml │ │ ├── index.rss.haml │ │ └── show.html.haml │ ├── changelog_admin │ │ └── entries │ │ │ ├── _actions.html.haml │ │ │ ├── _form.html.haml │ │ │ ├── _markdown_field.html.haml │ │ │ ├── edit.html.haml │ │ │ ├── index.html.haml │ │ │ ├── new.html.haml │ │ │ └── show.html.haml │ ├── changelog_entries │ │ ├── _entry.html.haml │ │ ├── index.html.haml │ │ └── show.html.haml │ ├── devise │ │ ├── confirmations │ │ │ ├── new.html.haml │ │ │ └── required.html.haml │ │ ├── mailer │ │ │ ├── confirmation_instructions.html.haml │ │ │ ├── confirmation_instructions.text.erb │ │ │ ├── email_changed.html.haml │ │ │ ├── password_change.html.haml │ │ │ ├── reset_password_instructions.html.haml │ │ │ └── unlock_instructions.html.haml │ │ ├── passwords │ │ │ ├── edit.html.haml │ │ │ └── new.html.haml │ │ ├── registrations │ │ │ ├── edit.html.haml │ │ │ └── new.html.haml │ │ ├── sessions │ │ │ └── new.html.haml │ │ ├── shared │ │ │ └── _links.html.haml │ │ └── unlocks │ │ │ └── new.html.haml │ ├── exercises │ │ ├── index.html.haml │ │ └── show.html.haml │ ├── heartbeat_mailer │ │ ├── mentor_heartbeat.html.haml │ │ └── mentor_heartbeat.text.haml │ ├── layouts │ │ ├── _announcement_bar.html.haml │ │ ├── _cta_footer.html.haml │ │ ├── _footer.html.haml │ │ ├── _head.html.haml │ │ ├── _javascript.html.haml │ │ ├── _logged_in_header.html.haml │ │ ├── _logged_in_research_header.html.haml │ │ ├── _logged_in_teams_header.html.haml │ │ ├── _logged_out_header.html.haml │ │ ├── _logged_out_research_header.html.haml │ │ ├── _logged_out_teams_header.html.haml │ │ ├── _meta_tags.html.haml │ │ ├── _modal.html.haml │ │ ├── _prismjs.html.haml │ │ ├── _settings_bar.html.haml │ │ ├── application.html.haml │ │ ├── changelog_admin.html.haml │ │ ├── mailer.html.haml │ │ ├── mailer.text.erb │ │ ├── research.html.haml │ │ └── teams.html.haml │ ├── mentor │ │ ├── configure │ │ │ └── show.html.haml │ │ ├── dashboard │ │ │ ├── _next_solutions.html.haml │ │ │ ├── _next_solutions_section.html.haml │ │ │ ├── _no_solutions_section.html.haml │ │ │ ├── _solution.html.haml │ │ │ ├── _testimonials.html.haml │ │ │ ├── _welcome_modal.html.haml │ │ │ ├── _your_solutions.html.haml │ │ │ ├── _your_solutions_filters.html.haml │ │ │ ├── _your_solutions_section.html.haml │ │ │ ├── next_solutions.html.haml │ │ │ ├── next_solutions.js.haml │ │ │ ├── testimonials.html.haml │ │ │ ├── your_solutions.html.haml │ │ │ └── your_solutions.js.haml │ │ ├── discussion_posts │ │ │ └── create.js.haml │ │ ├── exercise_notes │ │ │ ├── _notes.html.haml │ │ │ ├── modal.html.haml │ │ │ └── show.html.haml │ │ ├── registrations │ │ │ ├── landing.html.haml │ │ │ └── new.html.haml │ │ └── solutions │ │ │ ├── _analysis.html.haml │ │ │ ├── _claim-section.html.haml │ │ │ ├── _discussion.html.haml │ │ │ ├── _download-section.html.haml │ │ │ ├── _new_discussion_post.html.haml │ │ │ ├── analysis │ │ │ └── _javascript_resistor_color_duo_experiment.html.haml │ │ │ ├── approve.js.haml │ │ │ ├── lock.js.haml │ │ │ └── show.html.haml │ ├── mentor_notifications_mailer │ │ ├── new_discussion_post.html.haml │ │ ├── new_discussion_post.text.haml │ │ ├── new_iteration.html.haml │ │ ├── new_iteration.text.haml │ │ ├── remind.html.haml │ │ └── remind.text.haml │ ├── my │ │ ├── dashboard │ │ │ └── show.html.haml │ │ ├── discussion_posts │ │ │ ├── create.js.haml │ │ │ ├── destroy.js.haml │ │ │ └── update.js.haml │ │ ├── notifications │ │ │ ├── _notification.html.haml │ │ │ ├── all.html.haml │ │ │ └── index.html.haml │ │ ├── preferences │ │ │ ├── _communication_preferences.html.haml │ │ │ └── edit.html.haml │ │ ├── profile │ │ │ ├── _avatar_edit.html.haml │ │ │ ├── _edit_modal.html.haml │ │ │ ├── _new.html.haml │ │ │ ├── edit.html.haml │ │ │ └── new.html.haml │ │ ├── settings │ │ │ ├── _decide_allow_comments.html.haml │ │ │ ├── _introducing_research_modal.html.haml │ │ │ ├── _v3_patience_modal.html.haml │ │ │ ├── confirm_delete_account.html.haml │ │ │ └── show.html.haml │ │ ├── side_exercises │ │ │ ├── _exercise.html.haml │ │ │ ├── _exercises.html.haml │ │ │ └── index.js.haml │ │ ├── solutions │ │ │ ├── _auto_approved.html.haml │ │ │ ├── _discussion.html.haml │ │ │ ├── _information_bar.html.haml │ │ │ ├── _nav_and_header.html.haml │ │ │ ├── _next_steps.html.haml │ │ │ ├── _show_approved.html.haml │ │ │ ├── _show_finished_independent.html.haml │ │ │ ├── _show_finished_mentored.html.haml │ │ │ ├── _show_finished_side.html.haml │ │ │ ├── _show_legacy.html.haml │ │ │ ├── _show_legacy_discussion.html.haml │ │ │ ├── _show_rhs.html.haml │ │ │ ├── _solution.html.haml │ │ │ ├── _solutions.html.haml │ │ │ ├── complete.html.haml │ │ │ ├── confirm_unapproved_completion.html.haml │ │ │ ├── index.html.haml │ │ │ ├── index.js.haml │ │ │ ├── mentor_feedback_request │ │ │ │ ├── _oversubscribed.html.haml │ │ │ │ ├── independent │ │ │ │ │ ├── _mentoring_slots_remaining.html.haml │ │ │ │ │ ├── _mentoring_slots_used.html.haml │ │ │ │ │ └── _oversubscribed.html.haml │ │ │ │ ├── legacy │ │ │ │ │ ├── _mentoring_slots_remaining.html.haml │ │ │ │ │ ├── _mentoring_slots_used.html.haml │ │ │ │ │ └── _oversubscribed.html.haml │ │ │ │ └── mentored │ │ │ │ │ ├── _mentoring_slots_remaining.html.haml │ │ │ │ │ ├── _mentoring_slots_used.html.haml │ │ │ │ │ ├── _oversubscribed.html.haml │ │ │ │ │ └── _promoted_to_core.html.haml │ │ │ ├── mentor_feedback_request_notification │ │ │ │ ├── _mentoring_slots_remaining.html.haml │ │ │ │ ├── _mentoring_slots_used.html.haml │ │ │ │ └── _oversubscribed.html.haml │ │ │ ├── mentor_ratings.html.haml │ │ │ ├── reflection.html.haml │ │ │ ├── show.html.haml │ │ │ ├── show_unlocked.html.haml │ │ │ ├── toggle.js.haml │ │ │ ├── unlocked.html.haml │ │ │ ├── walkthrough.html.haml │ │ │ ├── walkthrough_modal.html.haml │ │ │ └── widgets │ │ │ │ ├── _community_solutions.html.haml │ │ │ │ ├── _complete_prompt.html.haml │ │ │ │ ├── _publish_prompt.html.haml │ │ │ │ └── _published.html.haml │ │ ├── starred_solutions │ │ │ ├── _star_button.html.haml │ │ │ ├── create.js.haml │ │ │ └── index.html.haml │ │ ├── track_settings │ │ │ └── edit.html.haml │ │ └── tracks │ │ │ ├── _change_to_independent_mode_modal.html.haml │ │ │ ├── _change_to_mentored_mode_modal.html.haml │ │ │ ├── _core_exercises.html.haml │ │ │ ├── _finished_modal.html.haml │ │ │ ├── _leave_track_modal.html.haml │ │ │ ├── _pause_track_modal.html.haml │ │ │ ├── _paused_modal.html.haml │ │ │ ├── _show_independent_mode.html.haml │ │ │ ├── _show_mentored_mode.html.haml │ │ │ ├── _show_side_exercises.html.haml │ │ │ ├── _started_modal.html.haml │ │ │ ├── _topic_percentages.html.haml │ │ │ ├── _track.html.haml │ │ │ ├── _tracks.html.haml │ │ │ ├── _unlocked_exercises.html.haml │ │ │ ├── _v1_migration_modal.html.haml │ │ │ ├── index.html.haml │ │ │ ├── index.js.haml │ │ │ ├── js_ecma_migration.html.haml │ │ │ ├── show.html.haml │ │ │ └── show_not_joined.html.haml │ ├── newsletter_mailer │ │ ├── mentor_changes_1.html.haml │ │ ├── mentor_changes_1.text.erb │ │ ├── mentor_jan_2019.html.haml │ │ ├── mentor_jan_2019.text.haml │ │ ├── mentor_thanks_2018.html.haml │ │ ├── side_exercise_changes.html.haml │ │ ├── side_exercise_changes.text.erb │ │ ├── testimonials_launch.html.haml │ │ └── testimonials_launch.text.haml │ ├── onboardings │ │ ├── _general.html.haml │ │ ├── migrate_to_v2.html.haml │ │ └── show.html.haml │ ├── pages │ │ ├── _announcement.html.haml │ │ ├── _organisation_menu.html.haml │ │ ├── _tracks_display.html.haml │ │ ├── about.html.haml │ │ ├── cli_walkthrough.html.haml │ │ ├── contributors.js.haml │ │ ├── generic.html.haml │ │ ├── index.html.haml │ │ ├── strategy.html.haml │ │ ├── supporter.html.haml │ │ └── supporters.html.haml │ ├── profiles │ │ ├── _page.html.haml │ │ ├── _solutions.html.haml │ │ ├── index.html.haml │ │ ├── show.html.haml │ │ └── solutions.js.haml │ ├── research │ │ ├── experiment_solutions │ │ │ ├── _coding.html.haml │ │ │ ├── _info.html.haml │ │ │ ├── _top.html.haml │ │ │ ├── post_exercise_survey.html.haml │ │ │ └── show.html.haml │ │ ├── experiments │ │ │ ├── index.html.haml │ │ │ └── show.html.haml │ │ ├── joins │ │ │ └── show.html.haml │ │ ├── pages │ │ │ └── index.html.haml │ │ ├── submission_ops_status │ │ │ ├── _error.html.haml │ │ │ ├── _fail.html.haml │ │ │ ├── _pass.html.haml │ │ │ └── _queued.html.haml │ │ ├── submission_test_run_results │ │ │ ├── _error.html.haml │ │ │ ├── _fail.html.haml │ │ │ └── _pass.html.haml │ │ ├── submission_test_runs │ │ │ ├── _error.html.haml │ │ │ ├── _fail.html.haml │ │ │ ├── _no_results.html.haml │ │ │ └── _pass.html.haml │ │ ├── submissions │ │ │ └── _submission.html.haml │ │ ├── user_experiment_survey │ │ │ ├── demographics.html.haml │ │ │ ├── history.html.haml │ │ │ ├── languages.html.haml │ │ │ ├── languages_2.html.haml │ │ │ ├── show.html.haml │ │ │ └── thanks.html.haml │ │ └── user_experiments │ │ │ ├── _language_part.html.haml │ │ │ ├── language.html.haml │ │ │ └── show.html.haml │ ├── solution_comments │ │ ├── create.js.haml │ │ ├── destroy.js.haml │ │ └── update.js.haml │ ├── solution_comments_mailer │ │ ├── new_comment_for_other_commenter.html.haml │ │ ├── new_comment_for_other_commenter.text.haml │ │ ├── new_comment_for_solution_user.html.haml │ │ └── new_comment_for_solution_user.text.haml │ ├── solutions │ │ ├── _comments.html.haml │ │ ├── _comments_disabled.html.haml │ │ ├── _new_comment.html.haml │ │ ├── _new_comment_form.html.haml │ │ ├── _next_solutions_section.html.haml │ │ ├── _panes.html.haml │ │ ├── _solution.html.haml │ │ ├── index.html.haml │ │ ├── not_found.html.haml │ │ ├── not_published.html.haml │ │ └── show.html.haml │ ├── team_invite_mailer │ │ ├── existing_user.html.haml │ │ ├── existing_user.text.haml │ │ ├── new_user.html.haml │ │ └── new_user.text.haml │ ├── team_pages │ │ ├── _header.html.haml │ │ ├── contributors.html.haml │ │ ├── maintainers.html.haml │ │ ├── mentors.html.haml │ │ ├── show.html.haml │ │ └── staff.html.haml │ ├── teams │ │ ├── _header.html.haml │ │ ├── dashboard │ │ │ └── index.html.haml │ │ ├── invitations │ │ │ └── show.html.haml │ │ ├── pages │ │ │ ├── generic.html.haml │ │ │ └── index.html.haml │ │ └── teams │ │ │ ├── _activity_discussion_post.html.haml │ │ │ ├── _activity_iteration.html.haml │ │ │ ├── _activity_team_membership.html.haml │ │ │ ├── _activity_team_solution.html.haml │ │ │ ├── discussion_posts │ │ │ └── _post.html.haml │ │ │ ├── edit.html.haml │ │ │ ├── index.html.haml │ │ │ ├── invitations │ │ │ └── new.html.haml │ │ │ ├── joins │ │ │ └── show.html.haml │ │ │ ├── memberships │ │ │ ├── _settings.html.haml │ │ │ ├── index.html.haml │ │ │ └── settings │ │ │ │ ├── _form.html.haml │ │ │ │ └── _join_url.html.haml │ │ │ ├── my_solutions │ │ │ ├── _possible_exercises.html.haml │ │ │ ├── _solution_header.html.haml │ │ │ ├── _solutions.html.haml │ │ │ ├── index.html.haml │ │ │ ├── index.js.haml │ │ │ ├── new.html.haml │ │ │ ├── possible_exercises.js.haml │ │ │ ├── show.html.haml │ │ │ └── show_unlocked.html.haml │ │ │ ├── new.html.haml │ │ │ ├── show.html.haml │ │ │ └── solutions │ │ │ ├── _solution.html.haml │ │ │ ├── _solutions.html.haml │ │ │ ├── index.html.haml │ │ │ ├── index.js.haml │ │ │ └── show.html.haml │ ├── track_pages │ │ ├── _links.html.haml │ │ └── show.html.haml │ ├── tracks │ │ ├── _about.html.haml │ │ ├── _exercises.html.haml │ │ ├── _header.html.haml │ │ ├── _maintainers.html.haml │ │ ├── _mentors.html.haml │ │ ├── _overview.html.haml │ │ ├── _testimonial.html.haml │ │ ├── index.html.haml │ │ ├── maintainers.html.haml │ │ ├── mentors.html.haml │ │ └── show.html.haml │ ├── unsubscribe │ │ └── show.html.haml │ ├── user_notifications_mailer │ │ ├── new_discussion_post.html.haml │ │ ├── new_discussion_post.text.haml │ │ ├── remind_about_solution.html.haml │ │ ├── remind_about_solution.text.haml │ │ ├── solution_approved.html.haml │ │ └── solution_approved.text.erb │ └── widgets │ │ ├── _banner.html.haml │ │ ├── _code_snippet.html.haml │ │ ├── _contributor.html.haml │ │ ├── _discussion_post.html.haml │ │ ├── _iteration_nav.html.haml │ │ ├── _maintainer.html.haml │ │ ├── _mentor.html.haml │ │ ├── _other_role_menu.html.haml │ │ ├── _solution_comment.html.haml │ │ └── _system_discussion_post.html.haml └── widgets │ ├── changelog_admin │ └── changelog_entry_action_widget.rb │ └── font_awesome_icon_widget.rb ├── babel.config.js ├── bin ├── bundle ├── cap ├── capify ├── delayed_job ├── puma ├── pumactl ├── rails ├── rake ├── setup ├── spring ├── update ├── webpack ├── webpack-dev-server └── yarn ├── config.ru ├── config ├── application.rb ├── boot.rb ├── cable.yml ├── cluster.yml ├── database.yml ├── deploy.rb ├── deploy │ ├── production.rb │ └── staging.rb ├── environment.rb ├── environments │ ├── development.rb │ ├── production.rb │ ├── staging.rb │ └── test.rb ├── initializers │ ├── ace.rb │ ├── active_storage.rb │ ├── analyzers.rb │ ├── application_controller_renderer.rb │ ├── assets.rb │ ├── backtrace_silencers.rb │ ├── bugsnag.rb │ ├── cluster_config.rb │ ├── content_security_policy.rb │ ├── cookies_serializer.rb │ ├── cors.rb │ ├── devise.rb │ ├── enumerable.rb │ ├── exercism.rb │ ├── filter_parameter_logging.rb │ ├── flipper.rb │ ├── friendly_id.rb │ ├── inflections.rb │ ├── mime_types.rb │ ├── new_framework_defaults_5_2.rb │ ├── new_framework_defaults_6_0.rb │ ├── prism.rb │ ├── propono.rb │ ├── random_people_images.rb │ ├── recaptcha.rb │ ├── routing_constraints.rb │ ├── session_store.rb │ ├── warden_hooks.rb │ └── wrap_parameters.rb ├── locales │ ├── devise.en.yml │ └── en.yml ├── puma.rb ├── recaptcha.yml ├── repos.yml ├── routes.rb ├── secrets.yml.example ├── selenium.yml ├── sidekiq.yml ├── skylight.yml ├── spring.rb ├── storage.yml ├── twitter_accounts.yml ├── webpack │ ├── development.js │ ├── environment.js │ ├── production.js │ └── test.js └── webpacker.yml ├── db ├── migrate │ ├── 20170516141546_devise_create_users.rb │ ├── 20170516141616_create_tracks.rb │ ├── 20170516141631_create_exercises.rb │ ├── 20170516141647_create_user_tracks.rb │ ├── 20170516141759_create_solutions.rb │ ├── 20170516141813_create_iterations.rb │ ├── 20170516141837_create_discussion_posts.rb │ ├── 20170630181249_create_auth_tokens.rb │ ├── 20170702134612_create_track_mentorships.rb │ ├── 20170702140156_create_notifications.rb │ ├── 20170702161436_create_communication_preferences.rb │ ├── 20170710110046_create_profiles.rb │ ├── 20170713140848_create_solution_mentorships.rb │ ├── 20170717120459_create_topics.rb │ ├── 20170717120507_create_exercise_topics.rb │ ├── 20170718140722_create_maintainers.rb │ ├── 20170718155236_create_friendly_id_slugs.rb │ ├── 20170718170234_create_reactions.rb │ ├── 20170803095548_create_iteration_files.rb │ ├── 20170806133728_create_testimonials.rb │ ├── 20170813141158_create_contributors.rb │ ├── 20170823065541_create_repo_update.rb │ ├── 20170823075632_create_repo_update_fetches.rb │ ├── 20170825173701_create_ignored_solution_mentorships.rb │ ├── 20170922081639_add_alumnus_to_maintainers.rb │ ├── 20170922081759_populate_alummus_strings.rb │ ├── 20170922082233_drop_column_active_from_maintainers.rb │ ├── 20170923144117_fix_maintainers_with_alumnus_false.rb │ ├── 20170923211039_set_default_num_contributions_on_contributors.rb │ ├── 20170923211552_add_github_id_to_contributors.rb │ ├── 20170923230700_disallow_null_github_ids_for_contributors.rb │ ├── 20171107030936_add_independent_mode_to_user_tracks.rb │ ├── 20171107042340_add_mentoring_enabled_to_solutions.rb │ ├── 20171230121412_create_teams.rb │ ├── 20171230121413_create_team_solutions.rb │ ├── 20171230122241_create_team_memberships.rb │ ├── 20171230155853_create_team_invitations.rb │ ├── 20171230161700_make_iterations_polymorphic.rb │ ├── 20171231162945_add_active_column_to_tracks.rb │ ├── 20180508121234_add_description_to_teams.rb │ ├── 20180613065104_add_token_to_team.rb │ ├── 20180613065447_generate_tokens_for_teams.rb │ ├── 20180613065754_add_constraints_for_token_column.rb │ ├── 20180613074446_add_url_join_allowed_to_teams.rb │ ├── 20180617190428_constraint_one_solution_per_exercise_per_user.rb │ ├── 20180619065407_create_mentors.rb │ ├── 20180621150555_remove_about_from_tracks.rb │ ├── 20180707132112_add_archived_at_to_user_tracks.rb │ ├── 20180707133648_add_email_flags_for_users.rb │ ├── 20180709140439_allow_no_users_for_discussion_posts.rb │ ├── 20180710112642_create_active_storage_tables.active_storage.rb │ ├── 20180711154145_persist_legacy_uuid_in_iterations.rb │ ├── 20180713095823_add_uniq_constraint_for_track_mentors.rb │ ├── 20180713164812_add_index_to_solutions_uuid.rb │ ├── 20180722190707_add_email_on_solution_approved_to_users.rb │ ├── 20180723201554_add_edited_to_discussion_post.rb │ ├── 20180723202243_add_previous_content_for_discussion_post.rb │ ├── 20180724000822_add_deleted_to_discussion_posts.rb │ ├── 20180725105216_add_indepdendent_mode_to_solutions.rb │ ├── 20180725105321_populate_independent_mode_on_solutions.rb │ ├── 20180725115010_add_extra_solutions_indexes.rb │ ├── 20180726141241_cache_track_independent_mode_on_solutions.rb │ ├── 20180726143058_add_mentor_selection_idx_2.rb │ ├── 20180726143155_cache_track_in_independent_mode.rb │ ├── 20180805111033_create_solution_locks.rb │ ├── 20180905191521_add_dark_code_theme_to_user.rb │ ├── 20181001152012_rename_solution_mentoring_column.rb │ ├── 20181003205938_remove_old_mentoring_enabled_flag.rb │ ├── 20181008220354_add_mentor_flag_to_users.rb │ ├── 20181009215319_ensure_that_mentors_remain_mentors.rb │ ├── 20181010155830_pause_user_tracks.rb │ ├── 20181101054326_add_active_to_auth_token.rb │ ├── 20181122150334_add_token_to_team_invitations.rb │ ├── 20181122154003_add_uniq_index_to_team_memberships.rb │ ├── 20181124155843_add_on_profile_and_allow_comments_to_solutions.rb │ ├── 20181217150935_change_requires_action_to_be_datetime.rb │ ├── 20190110171100_create_blog_posts.rb │ ├── 20190111203839_create_blog_comments.rb │ ├── 20190118215101_add_mentor_reminder_sent_at_to_solution_mentorships.rb │ ├── 20190118221754_add_email_on_remind_mentor_to_communication_preferences.rb │ ├── 20190122210914_create_solution_comments.rb │ ├── 20190125193618_add_default_allow_comments_to_users.rb │ ├── 20190126004534_create_solution_stars.rb │ ├── 20190126005649_add_solution_counters.rb │ ├── 20190126005747_migrate_reactions_into_comments.rb │ ├── 20190126005925_clear_up_legacy.rb │ ├── 20190201050321_add_communication_preferences_for_solution_comments.rb │ ├── 20190212000818_add_image_url_to_blog_posts.rb │ ├── 20190218004803_create_user_email_logs.rb │ ├── 20190226131553_add_mentoring_indexes.rb │ ├── 20190302212514_add_email_on_mentor_heartbeat_to_communication_preferences.rb │ ├── 20190302222704_add_token_to_communication_preferences.rb │ ├── 20190322130729_create_delayed_jobs.rb │ ├── 20190404193450_add_reminder_sent_at_to_solutions.rb │ ├── 20190404195320_add_email_on_remind_about_solution_to_communication_preferences.rb │ ├── 20190404201717_add_solution_reminder_sent_at_to_user_email_logs.rb │ ├── 20190520120439_create_iteration_analyses.rb │ ├── 20190626175744_add_type_to_discussion_posts.rb │ ├── 20190627052503_add_median_wait_time_to_exercises.rb │ ├── 20190628060134_add_median_wait_time_to_tracks.rb │ ├── 20190703133313_add_website_error_to_iteration_analyses.rb │ ├── 20190724042815_add_deleted_at_to_user.rb │ ├── 20190729064621_add_full_width_code_panes_to_user.rb │ ├── 20190904023937_increase_size_of_previous_content.rb │ ├── 20190914171152_rename_analyses_status.rb │ ├── 20190914172312_add_analysis_status_to_analyses.rb │ ├── 20190914172448_migrate_analysis_statuses.rb │ ├── 20190914180921_create_submissions.rb │ ├── 20190915142500_create_submission_test_results.rb │ ├── 20190916094557_create_flipper_tables.rb │ ├── 20190917050728_create_changelog_entries.rb │ ├── 20190923044907_add_may_edit_changelog_to_users.rb │ ├── 20190923102032_add_published_at_to_changelog_entries.rb │ ├── 20190926082203_add_details_html_to_changelog_entries.rb │ ├── 20190926090258_add_referenceable_key_to_changelog_entries.rb │ ├── 20190930041955_add_tweet_copy_to_changelog_entries.rb │ ├── 20191010005342_create_changelog_entry_tweet.rb │ ├── 20191010015553_remove_tweet_copy_from_changelog_entry.rb │ ├── 20191010023224_add_status_to_changelog_entry_tweet.rb │ ├── 20191122044056_add_uuid_to_submissions.rb │ ├── 20191122044354_add_index_to_submissions_uuid.rb │ ├── 20191122045517_add_filenames_to_submissions.rb │ ├── 20191128025739_make_submission_solution_polymorphic.rb │ ├── 20191128032457_add_index_for_polymorphic_submission_solution.rb │ ├── 20191129041124_create_research_experiments.rb │ ├── 20191129041125_create_research_user_experiments.rb │ ├── 20191129041126_create_research_experiment_solutions.rb │ ├── 20191129055832_add_initial_experiment.rb │ ├── 20191129061641_add_joined_research_to_user.rb │ ├── 20191129083917_change_joined_research_to_datetime.rb │ ├── 20191129093109_make_research_experiment_solutions_uniq.rb │ ├── 20191205051247_increase_test_results_message_size.rb │ ├── 20191205062448_add_ops_message_to_test_results.rb │ ├── 20191205063716_rename_test_results_to_test_run.rb │ ├── 20191218152623_create_infrastructure_test_runners.rb │ ├── 20191220131420_create_infrastructure_test_runner_versions.rb │ ├── 20191220152641_allow_test_runner_version_slug_to_be_null.rb │ ├── 20200219150933_add_survey_fields_to_experiment_solutions.rb │ ├── 20200225110803_rename_syntax_highlighter_language.rb │ ├── 20200227005918_add_null_check_to_syntax_highlighter_column.rb │ ├── 20200318194204_add_survey_to_user_experiments.rb │ ├── 20200420144100_add_show_v3_patience_modal_to_users.rb │ └── 20200721124114_add_show_introducing_research_modal.rb ├── schema.rb └── seeds.rb ├── docs └── API-v1.md ├── lib ├── assets │ └── .keep ├── haml_lint │ └── linter │ │ └── accessible_icons.rb ├── open_source.rb ├── open_source │ └── contribution.rb ├── prism_js.rb ├── prism_js │ ├── component.rb │ ├── plugin.rb │ └── theme.rb ├── rubocop │ └── cop │ │ └── custom │ │ └── accessible_images.rb └── tasks │ ├── .keep │ ├── contributors.rake │ ├── exercises.rake │ ├── exercism.rake │ ├── git.rake │ ├── listeners.rake │ ├── mailers.rake │ ├── mentors.rake │ ├── temporary │ ├── bootstrap_users.rake │ └── delete_stale_notifications.rake │ └── tracks.rake ├── log └── .keep ├── package.json ├── postcss.config.js ├── public ├── 404.html ├── 422.html ├── 500.html ├── apple-touch-icon-precomposed.png ├── apple-touch-icon.png ├── favicon.ico ├── robots.txt └── sad-icon.png ├── test ├── application_system_test_case.rb ├── controllers │ ├── .keep │ ├── admin │ │ ├── dashboard_controller_test.rb │ │ └── mentors_controller_test.rb │ ├── api │ │ ├── cli_settings_controller_test.rb │ │ ├── files_controller_test.rb │ │ ├── ping_controller_test.rb │ │ ├── solutions_controller_test.rb │ │ ├── test_base.rb │ │ ├── tracks_controller_test.rb │ │ ├── unknown_route_test.rb │ │ ├── validate_token_test.rb │ │ └── webhooks │ │ │ ├── analyzers_controller_test.rb │ │ │ ├── contributors_controller_test.rb │ │ │ └── repo_updates_controller_test.rb │ ├── blog_comments_controller_test.rb │ ├── blog_posts_controller_test.rb │ ├── changelog_admin │ │ ├── authorization_test_helpers.rb │ │ ├── entries_controller_test.rb │ │ └── referenceables_controller_test.rb │ ├── changelog_entries_controller_test.rb │ ├── exercises_controller_test.rb │ ├── legacy_routes_controller_test.rb │ ├── mentor │ │ ├── analyses_controller_test.rb │ │ ├── dashboard_controller_test.rb │ │ ├── discussion_posts_controller_test.rb │ │ └── solutions_controller_test.rb │ ├── my │ │ ├── iterations_controller_test.rb │ │ ├── notifications_controller_test.rb │ │ ├── settings_controller_test.rb │ │ ├── solutions_controller_test.rb │ │ ├── starred_solutions_controller_test.rb │ │ ├── tracks_controller_test.rb │ │ └── user_tracks_controller_test.rb │ ├── pages_controller_test.rb │ ├── profiles_controller_test.rb │ ├── research │ │ ├── joins_controller_test.rb │ │ └── user_experiments_test.rb │ ├── solution_comments_controller_test.rb │ ├── solutions_controller_test.rb │ ├── spi │ │ ├── test_base.rb │ │ └── test_runner_controller_test.rb │ ├── team_pages_controller_test.rb │ ├── teams │ │ ├── invitations_controller_test.rb │ │ ├── joins_controller_test.rb │ │ ├── memberships_controller_test.rb │ │ ├── team_memberships_controller_test.rb │ │ └── teams_controller_test.rb │ ├── tracks_controller_test.rb │ └── unsubscribe_controller_test.rb ├── factories.rb ├── fixtures │ ├── analyzers │ │ ├── foobar_v2.4.json │ │ └── ruby_v2.4.json │ ├── contributions │ │ ├── push_event.to_default_master.json │ │ ├── push_event.to_non_default_branch.json │ │ ├── push_event.to_non_default_master.json │ │ └── push_event.to_non_standard_default.json │ ├── github │ │ └── push_event.json │ ├── problem-specifications │ │ ├── HEAD │ │ ├── config │ │ ├── description │ │ ├── hooks │ │ │ ├── applypatch-msg.sample │ │ │ ├── commit-msg.sample │ │ │ ├── post-update.sample │ │ │ ├── pre-applypatch.sample │ │ │ ├── pre-commit.sample │ │ │ ├── pre-push.sample │ │ │ ├── pre-rebase.sample │ │ │ ├── pre-receive.sample │ │ │ ├── prepare-commit-msg.sample │ │ │ └── update.sample │ │ ├── info │ │ │ └── exclude │ │ ├── objects │ │ │ ├── 71 │ │ │ │ └── 4c3bb08b80d545a5b3149ed3c19a924d29f545 │ │ │ ├── 78 │ │ │ │ └── 155c5e96f8c7fe2234be3677987ac0f055451f │ │ │ ├── 98 │ │ │ │ └── eb07d7c4c27caab7a84c6b1d72c462cad5798e │ │ │ ├── 09 │ │ │ │ └── 0a4790033153a078b6bea2ba3ea9145d13f6e2 │ │ │ ├── 0e │ │ │ │ └── 97b9e845f08c1745e418170c40f09ce1c0d5e6 │ │ │ ├── 1b │ │ │ │ └── f7bc1973c0f2934bd7f9a99f5f7043618b0c45 │ │ │ ├── 6e │ │ │ │ └── 921a663380b3f00a00156fc29894fa523898d4 │ │ │ ├── a2 │ │ │ │ └── bde10d4b877ee56033d93348c490f9a5e1d0fc │ │ │ ├── bf │ │ │ │ └── a591caae207edae854b96a591c3946677a6e1d │ │ │ ├── c2 │ │ │ │ └── 609c8c36f90325a0ff08803101ed76fa13bbbc │ │ │ ├── d5 │ │ │ │ └── 64d0bc3dd917926892c55e3706cc116d5b165e │ │ │ ├── e2 │ │ │ │ └── ee3db913459632537d11aea11167f94f550c16 │ │ │ ├── e6 │ │ │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 │ │ │ ├── f2 │ │ │ │ ├── 843dc648280c17a8daae027e47eea4f0a6adda │ │ │ │ └── d5818bf6922c9b50793588550db3de3e074e16 │ │ │ ├── fa │ │ │ │ ├── 09267aa3c80b33ef2a786575af39ec2f61ae78 │ │ │ │ └── d7bb86acc81a4ef04bb9d5f2a9565f8a1bf113 │ │ │ └── fd │ │ │ │ └── 36b65fcd1e02269ed6377ab9b034e31d81d51b │ │ └── refs │ │ │ └── heads │ │ │ └── master │ ├── research-track │ │ ├── HEAD │ │ ├── config │ │ ├── description │ │ ├── hooks │ │ │ ├── applypatch-msg.sample │ │ │ ├── commit-msg.sample │ │ │ ├── fsmonitor-watchman.sample │ │ │ ├── post-update.sample │ │ │ ├── pre-applypatch.sample │ │ │ ├── pre-commit.sample │ │ │ ├── pre-push.sample │ │ │ ├── pre-rebase.sample │ │ │ ├── pre-receive.sample │ │ │ ├── prepare-commit-msg.sample │ │ │ └── update.sample │ │ ├── info │ │ │ └── exclude │ │ ├── objects │ │ │ ├── 13 │ │ │ │ ├── 19246fd3a92f7234ace86687502aa813b413ca │ │ │ │ └── 33ed77b7e1ed056329cae96075dc558158ee69 │ │ │ ├── 15 │ │ │ │ └── 9d345077fa41615b903e2ce5db6a86d3ddaed3 │ │ │ ├── 20 │ │ │ │ └── eac05f8afee875c326234570004a21416e8f4b │ │ │ ├── 22 │ │ │ │ └── 94899ab057a543669863a0625a9582504e8ad9 │ │ │ ├── 25 │ │ │ │ └── f91e9d7c7cdb65b3168db30546a622188fff72 │ │ │ ├── 32 │ │ │ │ └── fd7cce6bd2c140208eb8278f0e7cad5d8084bb │ │ │ ├── 41 │ │ │ │ └── 1d5412d0f3767dc09aff49a2b89d8706f96bc0 │ │ │ ├── 64 │ │ │ │ └── 1d08dbfe5e25912218fde2b7764083ec2872d1 │ │ │ ├── 65 │ │ │ │ ├── 54aa52f55101cb6849016ba29539ddd95db669 │ │ │ │ └── 9bcbc2ccc66a326b643905ea6cea1582a6d16b │ │ │ ├── 66 │ │ │ │ └── d04cb0578a440b5f4cd518239f0ab1949c9331 │ │ │ ├── 69 │ │ │ │ └── 9889275a70f6d09c9b868f17a05f12493f3b10 │ │ │ ├── 91 │ │ │ │ └── 5d66ad937403bb5a8fa6ef113a05ea0bacf223 │ │ │ ├── 95 │ │ │ │ ├── 3983a70f2e108b125d00266c1e8b4862877afb │ │ │ │ └── 6700420cca2b9fe0e9d7564639b5acdc3e566a │ │ │ ├── 99 │ │ │ │ ├── 423cfd31c4c2de76a6344280f755a6850c09a1 │ │ │ │ └── 77bea9bfe7f75d31503f0fc8b3223ad70770da │ │ │ ├── 0f │ │ │ │ └── 0ac527af1401781fb20dc334515c4c5c20fc0f │ │ │ ├── 1c │ │ │ │ └── c9af4414b6525f349a984f53373953ccde1010 │ │ │ ├── 2b │ │ │ │ └── df5a37d9807b59d39fb803fb05f92ad9b0e572 │ │ │ ├── 3a │ │ │ │ └── 547cbd2b4b4ca4420546ed282230e415091f6b │ │ │ ├── 4b │ │ │ │ └── b588a0e159ca543e82ac556ed94fd21bbfb6c0 │ │ │ ├── 6d │ │ │ │ └── 9323c9254d319bfe82715b40a70fd4fa0e5343 │ │ │ ├── 7a │ │ │ │ └── 368780cd482227f702880bf9c6aad3e4488721 │ │ │ ├── 7d │ │ │ │ └── 93c2c33242b65d5fa9182fe5af42bb8941562f │ │ │ ├── 7e │ │ │ │ └── af19783ebe51fa0d810e0d54a249372c558a37 │ │ │ ├── 7f │ │ │ │ └── 2f0a5c4c0e63f3bc948de589e97b4f817f5346 │ │ │ ├── 8c │ │ │ │ └── 5717073982bfecfcebb031b3bac8851e905d09 │ │ │ ├── 8e │ │ │ │ └── 868a999c4924e0bef83c2aec45bf67a5948136 │ │ │ ├── 8f │ │ │ │ └── 7af03f11f75c52a37479f13d4deec7273d3e33 │ │ │ ├── 9a │ │ │ │ └── cb9af602f6a16e7f715047daa00fce517f95ec │ │ │ ├── a0 │ │ │ │ └── f039bc7d39539cdbeb798139a444141e343f1a │ │ │ ├── a3 │ │ │ │ └── 29c6c3fc6c9b218aa466f17759b0211b475465 │ │ │ ├── a5 │ │ │ │ └── e97da82a17ac85547b1a4ca6ae9fba9de205b5 │ │ │ ├── ab │ │ │ │ └── 2b5848c4a4e6b9331546be4afe5acdaee18ec4 │ │ │ ├── ac │ │ │ │ └── bab3178201eaa8ce1bc34f9041713ec12f883b │ │ │ ├── ae │ │ │ │ └── 1ffb2e51c36a4551731fa2733b5e3f2aa99eb7 │ │ │ ├── af │ │ │ │ └── 5fb6e1ffdb8602e103ea61674888c4403bb438 │ │ │ ├── be │ │ │ │ └── a97d998dff0f1d1ab0aa06ffe5a68b504ac243 │ │ │ ├── c1 │ │ │ │ └── 9f18f95894129cb52f1aaf8907aaca1e71f956 │ │ │ ├── ce │ │ │ │ └── f9845501401a3d4475c0f1d083e79f818953a2 │ │ │ ├── d7 │ │ │ │ └── 8ad0693ec743d32c31964cfb2790923424d951 │ │ │ ├── da │ │ │ │ └── 7f865198c466cae50d6201e28a2564e1b90815 │ │ │ ├── db │ │ │ │ ├── 2f4a7ba542d35402beebb77f8858a62cdbef3e │ │ │ │ └── eb3af6e8b250a92d22cea6224a2e87f083349d │ │ │ ├── e0 │ │ │ │ ├── 6ec23f916c8d0497bdd360caff4001caaa486d │ │ │ │ └── 6eebd05787d64ebba88077653c76a2a374fe93 │ │ │ ├── e2 │ │ │ │ └── 9dc5dddba8fd645141b96122d5d0c3a3be097a │ │ │ ├── e3 │ │ │ │ └── 6a5ddfd6cfff8a2ddacf2cebf5252d33f4e258 │ │ │ ├── e6 │ │ │ │ └── 73f7a13294e53fedc5f0d7c234cd471a096151 │ │ │ ├── ea │ │ │ │ └── ca01e5d345f51f6cf7f9410c09fc1396789c52 │ │ │ ├── ee │ │ │ │ └── a482b537f780fd6addd28478362c1784bc2907 │ │ │ ├── f7 │ │ │ │ ├── 3045954a50158de096d69934615a926907f367 │ │ │ │ └── 30668aea082c5003b9e9b75487a74c9aa15327 │ │ │ └── fa │ │ │ │ └── b92db89261a514db4d3b9137e0c6d564b10603 │ │ └── refs │ │ │ └── heads │ │ │ └── master │ ├── server_identity │ ├── test.png │ ├── test.svg │ ├── track │ │ ├── HEAD │ │ ├── config │ │ ├── description │ │ ├── hooks │ │ │ ├── applypatch-msg.sample │ │ │ ├── commit-msg.sample │ │ │ ├── post-update.sample │ │ │ ├── pre-applypatch.sample │ │ │ ├── pre-commit.sample │ │ │ ├── pre-push.sample │ │ │ ├── pre-rebase.sample │ │ │ ├── pre-receive.sample │ │ │ ├── prepare-commit-msg.sample │ │ │ └── update.sample │ │ ├── info │ │ │ └── exclude │ │ ├── objects │ │ │ ├── 17 │ │ │ │ └── 711ac0560ae94d3271ab88fd0d57defd18c6b7 │ │ │ ├── 21 │ │ │ │ └── 5f0497d8e607afeccc4ef4b511df67af399b9b │ │ │ ├── 25 │ │ │ │ └── 46d82a9b2ba395ff64410ed57415557e00931d │ │ │ ├── 41 │ │ │ │ └── 262ce35ab285460ea4f8ff6d9be143bfefeed9 │ │ │ ├── 42 │ │ │ │ └── be0be3de17aed32f7f369960231d9640ae67cb │ │ │ ├── 43 │ │ │ │ └── 4de04ba21321dd8a2c388dde70fb20221693c3 │ │ │ ├── 75 │ │ │ │ └── f8f77e2260daf8686bfff76f40ff60201d5f5a │ │ │ ├── 78 │ │ │ │ └── d65301e3521173e960b14d7fc27055cd68bad2 │ │ │ ├── 87 │ │ │ │ └── fdefed34c1b1d36c696f02ccb35ea783f83407 │ │ │ ├── 90 │ │ │ │ └── 86a80a54f7622cdb930d2d4cc2f0cc8ed189b8 │ │ │ ├── 93 │ │ │ │ └── 067d84fbaa10220f5a74a7fa52aa339242aecc │ │ │ ├── 96 │ │ │ │ └── 841d9f86d637de92c8acd35a876ff18612c9c4 │ │ │ ├── 02 │ │ │ │ └── 9028a44de8c25f923fdd76367143e05d43ba60 │ │ │ ├── 1b │ │ │ │ └── 74a96e731f6cbdb6b8d4c0821384e3f8531e4f │ │ │ ├── 2d │ │ │ │ └── 1669aef9b1cf2160c22dce6511dc6f050c8250 │ │ │ ├── 3b │ │ │ │ └── 717d0e320c11707f3d7706233a6669452f2019 │ │ │ ├── 3f │ │ │ │ └── 58c5bc62a3c4b99c304e6d53a122fffc531314 │ │ │ ├── 5c │ │ │ │ └── 7d3794cfc33780708627c270ee9f83bb36da77 │ │ │ ├── 6b │ │ │ │ └── bb9d919d0ebe9be038f4252643ece5878528e1 │ │ │ ├── a4 │ │ │ │ └── 39f1e2c9c8ef43130de7a3224a27a6b6ea2fd3 │ │ │ ├── ac │ │ │ │ └── 87374ecf316b07e8b647b6dffe5782bddb62a8 │ │ │ ├── ba │ │ │ │ └── 2a9feafa09bb9cacd82e7c9df6cf46c21f25df │ │ │ ├── bd │ │ │ │ └── ad7fe59b3d85259099123b463ec9cb76442951 │ │ │ ├── c9 │ │ │ │ └── b4c44d2933ad5b59830fd0e7f5e025445371b0 │ │ │ ├── cc │ │ │ │ └── 0be1e56dcbe29142bf4b97265a19afa1698e44 │ │ │ ├── d3 │ │ │ │ └── 04d7e335f23acf9fd2cf310e37d690d075b0c7 │ │ │ ├── d9 │ │ │ │ └── 1e0d4545afeb6a91308e7411715adda4916b2f │ │ │ ├── e0 │ │ │ │ └── cdc18e0f05b62ef0c97aeac22043a63b218a08 │ │ │ ├── e3 │ │ │ │ └── fd03446ed0c0cdb3c1819bf584857fb956dcaf │ │ │ ├── f4 │ │ │ │ └── 63de15b377a50b04c1f209dd36d51d7b687c00 │ │ │ └── f8 │ │ │ │ └── 5e2790fa105d9a34150c0fb07d17c1e1bc8e2c │ │ └── refs │ │ │ └── heads │ │ │ └── master │ └── website-copy │ │ ├── HEAD │ │ ├── config │ │ ├── description │ │ ├── hooks │ │ ├── applypatch-msg.sample │ │ ├── commit-msg.sample │ │ ├── post-update.sample │ │ ├── pre-applypatch.sample │ │ ├── pre-commit.sample │ │ ├── pre-push.sample │ │ ├── pre-rebase.sample │ │ ├── pre-receive.sample │ │ ├── prepare-commit-msg.sample │ │ └── update.sample │ │ ├── info │ │ └── exclude │ │ ├── objects │ │ ├── 13 │ │ │ └── 715fb160dbaa535979af0297eb64ae6b49ae50 │ │ ├── 19 │ │ │ └── e2ff5f93714f7e8ff445acc6ef8805e30aab15 │ │ ├── 33 │ │ │ └── b387436631db10d904485f3af0274a253c7dd2 │ │ ├── 41 │ │ │ └── 323c97e6e885dacc061b1cdea05e938f8cef3f │ │ ├── 50 │ │ │ └── 3e898a14ff4b69ae78a7ab55cc1e5d271c8434 │ │ ├── 59 │ │ │ └── e7b1500e43d3050384ab45842b1d259df81aa5 │ │ ├── 61 │ │ │ └── 8044deebb8b559ce3d48e8b19d4cc4080a1f59 │ │ ├── 72 │ │ │ └── 6e4ba0e43d1558fe7515cb05f51a1371f6f32f │ │ ├── 74 │ │ │ └── 6c2f0e586e09b63a90807d2d33ecb2dcd294b8 │ │ ├── 78 │ │ │ └── e5903790b4c699fb4c4d040f27a612f598d371 │ │ ├── 85 │ │ │ └── dfe788aa9d1f2c143f1186fd2c4073398e45a9 │ │ ├── 88 │ │ │ └── 8bd3bf4a79ecbf587372dda690872d8bc8a99f │ │ ├── 94 │ │ │ └── 75d54bb0b39a7a5ac15bda1598ba3698a80809 │ │ ├── 0b │ │ │ └── 67b61278c12c6dc4c80994e3f9791352cf86ad │ │ ├── 1b │ │ │ └── f44e8d16a4cbb0eefa5c732b69cfeb5d53ce46 │ │ ├── 2a │ │ │ └── 534a44cb4190eaaeba9079b6b642d6ed7180f9 │ │ ├── 5f │ │ │ ├── 91ca5c7038e36c139d450f3ae51cd146a56d00 │ │ │ └── e6064048e56be449b2e09715fa8ece14c5da77 │ │ ├── 7d │ │ │ └── f00f09ef207fd129c33c637fa8f4de1d62653c │ │ ├── 8a │ │ │ └── d671855e0dea6607f7110c7c475b7437e740c2 │ │ ├── a5 │ │ │ └── c41adacb01fe3a82c969611c00508de42f4d16 │ │ ├── ab │ │ │ └── b95bbcb689bce0fdfc6f3a25a8e5c6918f57af │ │ ├── b5 │ │ │ └── 31940c492affe90459f9b63cadcb1bed482e68 │ │ ├── c9 │ │ │ └── 2d392ab82379839bf651d5371ad4c9f03e1d07 │ │ ├── ca │ │ │ └── 50ddd6ccc492ab5c8badcb9cc87edc5398bd50 │ │ ├── d0 │ │ │ └── 083ddd5bee0ae084dcf82c429987fb320bb47f │ │ ├── d5 │ │ │ └── 11ee6a8f2e52f85e623d5182afbabc7ff9816e │ │ ├── e1 │ │ │ └── ed69e8c38e1b02020549d4234f484012bcc513 │ │ ├── e3 │ │ │ └── 8f3a007ecb56138e584fceca4166be22ff10e9 │ │ ├── e5 │ │ │ └── ffb5760706ad3683af685eed70d6325c005ed0 │ │ ├── e6 │ │ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 │ │ ├── ea │ │ │ └── f4faab44d3ee8394fa3ceb5d5ac5916913f3a7 │ │ ├── fb │ │ │ └── 6709bff97485c35bf8d8aff23b0fd09b9cfff8 │ │ └── fc │ │ │ └── 917b42c88bc1ede5b2e96d5daaaab8e7722468 │ │ └── refs │ │ └── heads │ │ └── master ├── forms │ └── changelog_entry_form_test.rb ├── helpers │ ├── .keep │ ├── a11y_helper_test.rb │ ├── application_helper.rb │ ├── changelog_entry_helper_test.rb │ ├── file_helper_test.rb │ ├── mentor_feedback_request_helper_test.rb │ ├── notifications_helper_test.rb │ ├── options_helper_test.rb │ ├── panel_helper_test.rb │ ├── time_ago_in_words_helper_test.rb │ └── user_helper_test.rb ├── initalizers │ └── enumerable_test.rb ├── integration │ ├── .keep │ ├── auth_flows_test.rb │ └── onboarding_flows_test.rb ├── jobs │ ├── fetch_repo_update_job_test.rb │ ├── process_new_iteration_job_test.rb │ └── sync_repo_update_job_test.rb ├── lib │ └── open_source │ │ └── contribution_test.rb ├── listeners │ └── listen_for_analyzed_iterations_test.rb ├── mailers │ ├── .keep │ ├── application_mailer_test.rb │ ├── heartbeat_mailer_test.rb │ ├── mentor_notifications_mailer_test.rb │ ├── previews │ │ ├── devise_mailer_preview.rb │ │ ├── heartbeat_mailer_preview.rb │ │ ├── mentor_notifications_mailer_preview.rb │ │ ├── newsletter_mailer_preview.rb │ │ ├── solution_comments_mailer_preview.rb │ │ ├── team_invite_mailer_preview.rb │ │ └── user_notifications_mailer_preview.rb │ ├── solution_comments_mailer_test.rb │ ├── team_invite_mailer_test.rb │ └── user_notifications_mailer_test.rb ├── models │ ├── .keep │ ├── api │ │ └── solution_responder_test.rb │ ├── blog_comment_test.rb │ ├── blog_post_test.rb │ ├── changelog_entry │ │ ├── general_referenceable_test.rb │ │ ├── referenceable_exercise_test.rb │ │ └── referenceable_track_test.rb │ ├── changelog_entry_test.rb │ ├── changelog_entry_tweet_test.rb │ ├── cluster_config_test.rb │ ├── communication_preferences_test.rb │ ├── contributor_test.rb │ ├── discussion_post_test.rb │ ├── exercise_map_node_test.rb │ ├── exercise_map_test.rb │ ├── exercise_test.rb │ ├── factories_test.rb │ ├── git │ │ ├── blog_repository_test.rb │ │ ├── exercise_config_test.rb │ │ ├── exercise_reader_test.rb │ │ ├── exercise_test.rb │ │ ├── exercism_repo_test.rb │ │ ├── github_profile_test.rb │ │ ├── null_github_profile_test.rb │ │ ├── problem_specifications │ │ │ └── exercise_test.rb │ │ ├── problem_specifications_test.rb │ │ ├── state_db_test.rb │ │ ├── tests_info_test.rb │ │ └── website_content_test.rb │ ├── infrastructure │ │ ├── test_runner_test.rb │ │ └── test_runner_version_test.rb │ ├── iteration_analysis_test.rb │ ├── iteration_test.rb │ ├── maintainer_test.rb │ ├── mentor_feedback_request_test.rb │ ├── notification_test.rb │ ├── null_track_test.rb │ ├── null_user_test.rb │ ├── profile_test.rb │ ├── repo_update_fetch_test.rb │ ├── repo_update_test.rb │ ├── research │ │ ├── experiment_solution_test.rb │ │ └── user_experiment_test.rb │ ├── solution_comment_test.rb │ ├── solution_mentorship_test.rb │ ├── solution_star_test.rb │ ├── solution_test.rb │ ├── submission_ops_status_test.rb │ ├── submission_test.rb │ ├── submission_test_run_result_test.rb │ ├── submission_test_run_test.rb │ ├── team_membership_test.rb │ ├── team_test.rb │ ├── terminal_output_test.rb │ ├── topic_test.rb │ ├── track_test.rb │ ├── twitter_account_test.rb │ ├── user_email_log_test.rb │ ├── user_test.rb │ └── user_track_test.rb ├── policies │ └── changelog_admin │ │ ├── allowed_to_delete_entry_policy_test.rb │ │ ├── allowed_to_edit_entry_policy_test.rb │ │ ├── allowed_to_publish_entry_policy_test.rb │ │ └── allowed_to_unpublish_entry_policy_test.rb ├── presenters │ ├── changelog_entry_presenter_test.rb │ └── profile_presenter_test.rb ├── queries │ └── mentored_solutions_query_test.rb ├── scripts │ ├── remove_incorrect_mentors_test.rb │ └── set_solutions_independent_mode_test.rb ├── services │ ├── abandon_overdue_solution_mentorships_test.rb │ ├── abandon_solution_mentorship_test.rb │ ├── analysis_services │ │ ├── approve_test.rb │ │ ├── build_comment_commentary_test.rb │ │ ├── build_comment_test.rb │ │ ├── build_comments_test.rb │ │ ├── post_comments_test.rb │ │ ├── process_analysis_test.rb │ │ └── unlock_solution_test.rb │ ├── approve_solution_test.rb │ ├── authenticate_user_from_omniauth_test.rb │ ├── bootstrap_user_test.rb │ ├── cache_solution_num_mentors_test.rb │ ├── cancel_mentoring_request_for_solution_test.rb │ ├── changelog_entry_services │ │ └── tweet_test.rb │ ├── check_mentoring_flow.rb │ ├── clear_notifications_test.rb │ ├── complete_solution_test.rb │ ├── create_blog_comment_test.rb │ ├── create_iteration_test.rb │ ├── create_notification_test.rb │ ├── create_solution_comment_test.rb │ ├── create_solution_mentorship_test.rb │ ├── create_solution_star_test.rb │ ├── create_solution_test.rb │ ├── create_team_discussion_post_test.rb │ ├── create_team_invitation_test.rb │ ├── create_team_membership_test.rb │ ├── create_team_solution_test.rb │ ├── creates_mentor_discussion_post_test.rb │ ├── creates_track_test.rb │ ├── creates_user_discussion_post_test.rb │ ├── deliver_email_test.rb │ ├── exercise_services │ │ └── update_median_wait_time_test.rb │ ├── filters_solutions_by_status_test.rb │ ├── fix_unlocking_in_user_track_test.rb │ ├── generate_mentor_heartbeats_test.rb │ ├── generate_team_activity_feed_test.rb │ ├── git │ │ ├── fetch_repo_test.rb │ │ ├── fetch_repos_test.rb │ │ ├── fetch_updated_repos_test.rb │ │ ├── seeds_tracks_test.rb │ │ ├── sync_blog_posts_test.rb │ │ ├── sync_maintainers_test.rb │ │ ├── sync_mentors_test.rb │ │ ├── sync_track_test.rb │ │ ├── sync_tracks_test.rb │ │ ├── sync_updated_repos_test.rb │ │ ├── sync_website_copy_test.rb │ │ └── update_repos_test.rb │ ├── join_track_test.rb │ ├── lock_solution_test.rb │ ├── make_user_a_mentor_test.rb │ ├── parse_markdown_test.rb │ ├── pause_user_track_test.rb │ ├── pub_sub │ │ ├── publish_message_test.rb │ │ └── publish_new_iteration_test.rb │ ├── publish_solution_test.rb │ ├── remind_about_solution_test.rb │ ├── remind_overdue_solution_mentorships_test.rb │ ├── remind_solution_mentorship_test.rb │ ├── render_user_walkthrough_test.rb │ ├── request_mentoring_on_solution_test.rb │ ├── research │ │ ├── create_solution_test.rb │ │ └── create_user_experiment_test.rb │ ├── retrieve_mentor_exercise_notes_test.rb │ ├── retrieve_solutions_for_mentor_test.rb │ ├── review_solution_mentoring_test.rb │ ├── select_suggested_solutions_for_mentor_test.rb │ ├── solutions_to_be_mentored_test.rb │ ├── submission_services │ │ ├── create_test.rb │ │ ├── download_files_test.rb │ │ ├── process_test_run_test.rb │ │ ├── run_tests_test.rb │ │ ├── upload_to_s3_for_storage_test.rb │ │ └── upload_to_s3_for_testing_test.rb │ ├── switch_track_to_independent_mode_test.rb │ ├── switch_track_to_mentored_mode_test.rb │ ├── track_services │ │ └── update_median_wait_time_test.rb │ ├── unlock_core_exercise_test.rb │ ├── unlock_next_core_exercise_test.rb │ ├── unpause_user_track_test.rb │ ├── upload_iteration_to_s3_test.rb │ └── user_services │ │ └── delete_test.rb ├── support │ ├── bullet_helpers.rb │ ├── selectize_helpers.rb │ ├── selenium_helpers.rb │ └── webmock.rb ├── system │ ├── .keep │ ├── blog_comments_test.rb │ ├── buttons_test.rb │ ├── changelog_admin │ │ ├── create_changelog_entry_test.rb │ │ ├── delete_changelog_entry_test.rb │ │ ├── edit_changelog_entry_test.rb │ │ ├── publish_changelog_entry_test.rb │ │ ├── unpublish_changelog_entry_test.rb │ │ └── view_all_changelog_entries_test.rb │ ├── complete_exercise_test.rb │ ├── complete_solution_test.rb │ ├── decide_allow_comments_test.rb │ ├── discussion_posts_test.rb │ ├── exercise_solutions_test.rb │ ├── exercises_test.rb │ ├── generate_team_join_url_test.rb │ ├── guest_views_changelog_test.rb │ ├── join_track_system_test.rb │ ├── leave_track_system_test.rb │ ├── mentor │ │ ├── configure_test.rb │ │ ├── dashboard_test.rb │ │ ├── discussion_posts_test.rb │ │ ├── filter_solutions_test.rb │ │ ├── registration_test.rb │ │ ├── solution_buttons_test.rb │ │ ├── solution_ignore_require_action_test.rb │ │ ├── solution_locks_test.rb │ │ └── solution_test.rb │ ├── menu_test.rb │ ├── my │ │ ├── core_exercises_test.rb │ │ ├── pause_user_tracks_test.rb │ │ ├── preferences_test.rb │ │ ├── request_mentor_feedback_test.rb │ │ ├── settings_test.rb │ │ ├── side_exercise_hover_test.rb │ │ ├── side_exercises_test.rb │ │ ├── solution_discussion_section_test.rb │ │ ├── solution_test.rb │ │ ├── solutions_information_bar_test.rb │ │ ├── track_settings_test.rb │ │ ├── track_test.rb │ │ └── tracks_test.rb │ ├── omniauth_callbacks_test.rb │ ├── onboarding_test.rb │ ├── profile_solutions_test.rb │ ├── profiles_test.rb │ ├── research │ │ ├── join_experiment_flow_test.rb │ │ ├── test_case.rb │ │ ├── user_joins_research_test.rb │ │ ├── user_logs_in_to_join_test.rb │ │ ├── user_signs_up_to_join_test.rb │ │ ├── user_solves_solution_test.rb │ │ ├── user_submits_solution_test.rb │ │ └── user_updates_theme_test.rb │ ├── signout_test.rb │ ├── solution_comments_test.rb │ ├── solutions_test.rb │ ├── teams │ │ ├── accept_invite_test.rb │ │ ├── join_team_via_url_test.rb │ │ ├── onboarding_test.rb │ │ ├── reject_invite_test.rb │ │ ├── remove_invite_test.rb │ │ ├── remove_member_test.rb │ │ ├── solution_discussion_test.rb │ │ ├── test_case.rb │ │ └── view_walkthrough_test.rb │ ├── track_alumnus_test.rb │ ├── track_system_test.rb │ ├── tracks_test.rb │ ├── unsubscribe_test.rb │ ├── user_switches_track_mode_test.rb │ └── walkthrough_test.rb ├── tasks │ └── temporary │ │ └── delete_stale_notifications_task_test.rb ├── test_helper.rb ├── tmp │ └── .gitkeep └── views │ ├── changelog_entries │ └── entry_test.rb │ ├── maintainer_widget_test.rb │ ├── submission_test_run_results │ └── fail_test.rb │ └── submission_test_runs │ └── research │ ├── error_test.rb │ └── pass_test.rb ├── tmp └── .keep ├── vendor └── .keep └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | defaults 2 | -------------------------------------------------------------------------------- /.github/main.workflow: -------------------------------------------------------------------------------- 1 | workflow "Automatic Rebase" { 2 | on = "issue_comment" 3 | resolves = "Rebase" 4 | } 5 | 6 | action "Rebase" { 7 | uses = "docker://cirrusactions/rebase:latest" 8 | secrets = ["GITHUB_TOKEN"] 9 | } 10 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | require: 2 | - ./lib/rubocop/cop/custom/accessible_images.rb 3 | 4 | AllCops: 5 | DisabledByDefault: true 6 | 7 | Custom/AccessibleImages: 8 | Enable: true 9 | Exclude: 10 | - ./app/helpers/a11y_helper.rb 11 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.6.3 2 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | # Add your own tasks in files placed in lib/tasks ending in .rake, 2 | # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. 3 | 4 | require_relative 'config/application' 5 | 6 | Rails.application.load_tasks 7 | -------------------------------------------------------------------------------- /app/assets/config/manifest.js: -------------------------------------------------------------------------------- 1 | //= link_tree ../images 2 | //= link_directory ../stylesheets .css 3 | -------------------------------------------------------------------------------- /app/assets/images/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/.keep -------------------------------------------------------------------------------- /app/assets/images/anonymous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/anonymous.png -------------------------------------------------------------------------------- /app/assets/images/background-overlay-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/background-overlay-1.png -------------------------------------------------------------------------------- /app/assets/images/background-overlay-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/background-overlay-2.png -------------------------------------------------------------------------------- /app/assets/images/become-a-mentor-chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/become-a-mentor-chat.png -------------------------------------------------------------------------------- /app/assets/images/become-a-mentor-line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/become-a-mentor-line.png -------------------------------------------------------------------------------- /app/assets/images/blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/blank.png -------------------------------------------------------------------------------- /app/assets/images/code-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/code-background.png -------------------------------------------------------------------------------- /app/assets/images/code-sample-frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/code-sample-frame.png -------------------------------------------------------------------------------- /app/assets/images/company/about-header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/company/about-header.jpg -------------------------------------------------------------------------------- /app/assets/images/company/header-rhs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/company/header-rhs.png -------------------------------------------------------------------------------- /app/assets/images/company/photo-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/company/photo-map.png -------------------------------------------------------------------------------- /app/assets/images/company/stats-background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/company/stats-background.jpg -------------------------------------------------------------------------------- /app/assets/images/company/stats-hex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/company/stats-hex.png -------------------------------------------------------------------------------- /app/assets/images/company/strategy-header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/company/strategy-header.jpg -------------------------------------------------------------------------------- /app/assets/images/company/supporter-header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/company/supporter-header.jpg -------------------------------------------------------------------------------- /app/assets/images/company/supporters-header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/company/supporters-header.jpg -------------------------------------------------------------------------------- /app/assets/images/company/supporters-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/company/supporters-icon.png -------------------------------------------------------------------------------- /app/assets/images/company/team-header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/company/team-header.jpg -------------------------------------------------------------------------------- /app/assets/images/favicon/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/favicon/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /app/assets/images/favicon/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/favicon/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /app/assets/images/favicon/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/favicon/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /app/assets/images/favicon/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/favicon/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /app/assets/images/favicon/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/favicon/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /app/assets/images/favicon/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/favicon/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /app/assets/images/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /app/assets/images/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /app/assets/images/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/favicon/favicon.ico -------------------------------------------------------------------------------- /app/assets/images/favicon/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/favicon/mstile-144x144.png -------------------------------------------------------------------------------- /app/assets/images/hex-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/hex-background.png -------------------------------------------------------------------------------- /app/assets/images/how-step-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/how-step-1.png -------------------------------------------------------------------------------- /app/assets/images/how-step-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/how-step-2.png -------------------------------------------------------------------------------- /app/assets/images/how-step-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/how-step-3.png -------------------------------------------------------------------------------- /app/assets/images/how-step-4-exercises.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/how-step-4-exercises.png -------------------------------------------------------------------------------- /app/assets/images/how-step-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/how-step-4.png -------------------------------------------------------------------------------- /app/assets/images/how-step-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/how-step-5.png -------------------------------------------------------------------------------- /app/assets/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/icon.png -------------------------------------------------------------------------------- /app/assets/images/landing-page-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/landing-page-background.png -------------------------------------------------------------------------------- /app/assets/images/laptop-people.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/laptop-people.png -------------------------------------------------------------------------------- /app/assets/images/lego-construction.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/lego-construction.jpg -------------------------------------------------------------------------------- /app/assets/images/li-tick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/li-tick.png -------------------------------------------------------------------------------- /app/assets/images/logo-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/logo-green.png -------------------------------------------------------------------------------- /app/assets/images/logo-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/logo-white.png -------------------------------------------------------------------------------- /app/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/logo.png -------------------------------------------------------------------------------- /app/assets/images/mailers/footer-bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/mailers/footer-bar.png -------------------------------------------------------------------------------- /app/assets/images/mailers/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/mailers/logo.png -------------------------------------------------------------------------------- /app/assets/images/mentor-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/mentor-bg.jpg -------------------------------------------------------------------------------- /app/assets/images/nav-divider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/nav-divider.png -------------------------------------------------------------------------------- /app/assets/images/people/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/people/1.png -------------------------------------------------------------------------------- /app/assets/images/people/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/people/2.png -------------------------------------------------------------------------------- /app/assets/images/people/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/people/3.png -------------------------------------------------------------------------------- /app/assets/images/people/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/people/4.png -------------------------------------------------------------------------------- /app/assets/images/people/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/people/5.png -------------------------------------------------------------------------------- /app/assets/images/people/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/people/6.png -------------------------------------------------------------------------------- /app/assets/images/people/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/people/7.png -------------------------------------------------------------------------------- /app/assets/images/people/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/people/8.png -------------------------------------------------------------------------------- /app/assets/images/pr-logos/changelog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/pr-logos/changelog.png -------------------------------------------------------------------------------- /app/assets/images/pr-logos/code-newbie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/pr-logos/code-newbie.png -------------------------------------------------------------------------------- /app/assets/images/pr-logos/codeship.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/pr-logos/codeship.png -------------------------------------------------------------------------------- /app/assets/images/pr-logos/linux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/pr-logos/linux.png -------------------------------------------------------------------------------- /app/assets/images/pr-logos/opensource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/pr-logos/opensource.png -------------------------------------------------------------------------------- /app/assets/images/pr-logos/sd-times.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/pr-logos/sd-times.png -------------------------------------------------------------------------------- /app/assets/images/pr-logos/wired.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/pr-logos/wired.png -------------------------------------------------------------------------------- /app/assets/images/profile-blanked-out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/profile-blanked-out.png -------------------------------------------------------------------------------- /app/assets/images/research-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research-header.png -------------------------------------------------------------------------------- /app/assets/images/research-landing-page-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research-landing-page-background.png -------------------------------------------------------------------------------- /app/assets/images/research/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/background.jpg -------------------------------------------------------------------------------- /app/assets/images/research/chicago-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/chicago-logo.png -------------------------------------------------------------------------------- /app/assets/images/research/choose-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/choose-icon.png -------------------------------------------------------------------------------- /app/assets/images/research/data-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/data-icon.png -------------------------------------------------------------------------------- /app/assets/images/research/funding-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/funding-icon.png -------------------------------------------------------------------------------- /app/assets/images/research/gary-lupyan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/gary-lupyan.jpg -------------------------------------------------------------------------------- /app/assets/images/research/james-evans.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/james-evans.jpg -------------------------------------------------------------------------------- /app/assets/images/research/methodology-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/methodology-icon.png -------------------------------------------------------------------------------- /app/assets/images/research/research-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/research-icon.png -------------------------------------------------------------------------------- /app/assets/images/research/researcher-background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/researcher-background.jpg -------------------------------------------------------------------------------- /app/assets/images/research/scope-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/scope-icon.png -------------------------------------------------------------------------------- /app/assets/images/research/sloan-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/sloan-logo.png -------------------------------------------------------------------------------- /app/assets/images/research/wisconsin-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/research/wisconsin-logo.png -------------------------------------------------------------------------------- /app/assets/images/speech-marks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/speech-marks.png -------------------------------------------------------------------------------- /app/assets/images/supporter-logos/chicago.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/supporter-logos/chicago.jpg -------------------------------------------------------------------------------- /app/assets/images/supporter-logos/mozilla-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/supporter-logos/mozilla-black.png -------------------------------------------------------------------------------- /app/assets/images/supporter-logos/mozilla-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/supporter-logos/mozilla-white.png -------------------------------------------------------------------------------- /app/assets/images/supporter-logos/sloan-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/supporter-logos/sloan-black.png -------------------------------------------------------------------------------- /app/assets/images/supporter-logos/sloan-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/supporter-logos/sloan-white.png -------------------------------------------------------------------------------- /app/assets/images/supporter-logos/thalamus-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/supporter-logos/thalamus-black.png -------------------------------------------------------------------------------- /app/assets/images/supporter-logos/thalamus-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/supporter-logos/thalamus-white.png -------------------------------------------------------------------------------- /app/assets/images/supporter-logos/wisconsin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/supporter-logos/wisconsin.png -------------------------------------------------------------------------------- /app/assets/images/team-default-avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/team-default-avatar.png -------------------------------------------------------------------------------- /app/assets/images/tick-color-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/tick-color-1.png -------------------------------------------------------------------------------- /app/assets/images/tick-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/tick-white.png -------------------------------------------------------------------------------- /app/assets/images/tmp/exercise-icon-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/tmp/exercise-icon-dark.png -------------------------------------------------------------------------------- /app/assets/images/tmp/exercise-icon-turquoise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/tmp/exercise-icon-turquoise.png -------------------------------------------------------------------------------- /app/assets/images/tmp/exercise-icon-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/tmp/exercise-icon-white.png -------------------------------------------------------------------------------- /app/assets/images/tmp/exercise-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/tmp/exercise-icon.png -------------------------------------------------------------------------------- /app/assets/images/track-page-code-sample-frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/track-page-code-sample-frame.png -------------------------------------------------------------------------------- /app/assets/images/track-page-exercises.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/track-page-exercises.png -------------------------------------------------------------------------------- /app/assets/images/track-page-mentors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/track-page-mentors.png -------------------------------------------------------------------------------- /app/assets/images/track-page-students.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/track-page-students.png -------------------------------------------------------------------------------- /app/assets/images/turquoise-hex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/turquoise-hex.png -------------------------------------------------------------------------------- /app/assets/images/well-done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/assets/images/well-done.png -------------------------------------------------------------------------------- /app/assets/stylesheets/announcement-bar.css.scss: -------------------------------------------------------------------------------- 1 | @import 'variables'; 2 | @import 'mixins'; 3 | 4 | .announcement-bar { 5 | background:#fff;//$error-red-color; 6 | padding:10px; 7 | text-align:center; 8 | color: #333; 9 | a { 10 | color: #444; 11 | font-weight:$fw-semibold; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/assets/stylesheets/changelog_admin/new-entry.scss: -------------------------------------------------------------------------------- 1 | @import 'variables'; 2 | @import 'mixins'; 3 | 4 | #changelog-admin-new-entry { 5 | table { 6 | margin-bottom:10px; 7 | th, td { 8 | border:1px solid #ddd; 9 | padding:10px; 10 | } 11 | } 12 | a { 13 | color:$color-2; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/assets/stylesheets/changelog_admin/page.scss: -------------------------------------------------------------------------------- 1 | @import 'variables'; 2 | @import 'mixins'; 3 | 4 | .lo-changelog-admin-page { 5 | padding:20px 0; 6 | h1 { 7 | @include font-size(20, 20); 8 | margin-bottom:10px; 9 | } 10 | p { 11 | @include font-size(15, 21); 12 | margin-bottom:10px; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/assets/stylesheets/pages/log-in-page.scss: -------------------------------------------------------------------------------- 1 | @import 'variables'; 2 | @import 'mixins'; 3 | 4 | #log-in-page { 5 | } 6 | 7 | -------------------------------------------------------------------------------- /app/assets/stylesheets/pages/my-solution-walkthrough.scss: -------------------------------------------------------------------------------- 1 | @import 'variables'; 2 | @import 'mixins'; 3 | 4 | #modal-wrapper #modal.solution-walkthrough { 5 | max-width: 100%; 6 | padding: 15px; 7 | @include width-medium() { 8 | padding: 40px; 9 | } 10 | } 11 | 12 | #modal-wrapper #modal-close-button { 13 | padding: 15px 19px; 14 | } 15 | -------------------------------------------------------------------------------- /app/assets/stylesheets/teams/join.scss: -------------------------------------------------------------------------------- 1 | .team-join-page { 2 | margin-top: 2rem; 3 | 4 | .section { 5 | margin-bottom: 20px; 6 | 7 | > .section-inner { 8 | margin-bottom: 10px; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/assets/stylesheets/unsubscribe.scss: -------------------------------------------------------------------------------- 1 | // Place all the styles related to the unsubscribe controller here. 2 | // They will automatically be included in application.css. 3 | // You can use Sass (SCSS) here: http://sass-lang.com/ 4 | -------------------------------------------------------------------------------- /app/assets/stylesheets/widgets/mentor.scss: -------------------------------------------------------------------------------- 1 | // See maintainer.scss 2 | -------------------------------------------------------------------------------- /app/assets/stylesheets/widgets/recaptcha.scss: -------------------------------------------------------------------------------- 1 | .g-recaptcha { 2 | > div { 3 | margin: auto; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /app/channels/application_cable/channel.rb: -------------------------------------------------------------------------------- 1 | module ApplicationCable 2 | class Channel < ActionCable::Channel::Base 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /app/controllers/admin/dashboard_controller.rb: -------------------------------------------------------------------------------- 1 | class Admin::DashboardController < AdminController 2 | def show 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /app/controllers/admin/data/experiments_controller.rb: -------------------------------------------------------------------------------- 1 | class Admin::Data::ExperimentsController < AdminController 2 | before_action :restrict_to_admins! 3 | 4 | def show 5 | zip_path = ExportExperimentData.() 6 | send_file(zip_path) 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/controllers/admin/data/tracks_controller.rb: -------------------------------------------------------------------------------- 1 | class Admin::Data::TracksController < AdminController 2 | before_action :restrict_to_admins! 3 | 4 | def index 5 | @tracks = Track.order('title ASC') 6 | end 7 | 8 | def show 9 | @track = Track.find(params[:id]) 10 | @exercises = @track.exercises.reorder('slug ASC') 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/controllers/admin/mentors_controller.rb: -------------------------------------------------------------------------------- 1 | class Admin::MentorsController < AdminController 2 | before_action :restrict_to_admins! 3 | 4 | def index 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /app/controllers/api/cli_settings_controller.rb: -------------------------------------------------------------------------------- 1 | module API 2 | class CLISettingsController < BaseController 3 | def show 4 | render json: {}, status: 200 5 | end 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/controllers/api/ping_controller.rb: -------------------------------------------------------------------------------- 1 | module API 2 | class PingController < BaseController 3 | skip_before_action :authenticate_user! 4 | 5 | def index 6 | render json: { 7 | status: { 8 | website: true, 9 | database: true 10 | } 11 | }, status: 200 12 | end 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /app/controllers/api/validate_token_controller.rb: -------------------------------------------------------------------------------- 1 | module API 2 | class ValidateTokenController < BaseController 3 | def index 4 | render json: { 5 | status: { 6 | token: 'valid', 7 | } 8 | }, status: 200 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/controllers/confirmations_controller.rb: -------------------------------------------------------------------------------- 1 | class ConfirmationsController < Devise::ConfirmationsController 2 | def required 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /app/controllers/markdown_controller.rb: -------------------------------------------------------------------------------- 1 | class MarkdownController < ApplicationController 2 | skip_before_action :verify_authenticity_token 3 | layout false 4 | 5 | def parse 6 | html = ParseMarkdown.(params[:markdown].to_s) 7 | render html: html.html_safe 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/controllers/mentor_controller.rb: -------------------------------------------------------------------------------- 1 | class MentorController < ApplicationController 2 | before_action :authenticate_user! 3 | before_action :restrict_to_mentors! 4 | 5 | private 6 | 7 | def restrict_to_mentors! 8 | return if current_user.is_mentor? 9 | redirect_to new_mentor_registrations_path 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/controllers/my/dashboard_controller.rb: -------------------------------------------------------------------------------- 1 | class My::DashboardController < MyController 2 | def show 3 | return redirect_to [:my, :tracks] 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/controllers/my_controller.rb: -------------------------------------------------------------------------------- 1 | class MyController < ApplicationController 2 | before_action :authenticate_user! 3 | end 4 | -------------------------------------------------------------------------------- /app/controllers/research/omniauth_callbacks_controller.rb: -------------------------------------------------------------------------------- 1 | module Research 2 | class OmniauthCallbacksController < ::OmniauthCallbacksController 3 | def github 4 | super { |user| user.join_research! } 5 | end 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/controllers/research/pages_controller.rb: -------------------------------------------------------------------------------- 1 | module Research 2 | class PagesController < BaseController 3 | skip_before_action :authenticate_user! 4 | skip_before_action :check_user_joined_research! 5 | 6 | def index 7 | redirect_to research_experiments_path if user_signed_in? 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/controllers/research/sessions_controller.rb: -------------------------------------------------------------------------------- 1 | module Research 2 | class SessionsController < ::SessionsController 3 | def create 4 | super { |user| user.join_research! } 5 | end 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/controllers/sessions_controller.rb: -------------------------------------------------------------------------------- 1 | class SessionsController < Devise::SessionsController 2 | def create 3 | super 4 | rescue BCrypt::Errors::InvalidHash 5 | redirect_to new_user_session_path, alert: "Your account does not have a password. Please use oauth." 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/controllers/teams/dashboard_controller.rb: -------------------------------------------------------------------------------- 1 | class Teams::DashboardController < Teams::BaseController 2 | def index 3 | redirect_to teams_teams_path 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/helpers/blog_comments_helper.rb: -------------------------------------------------------------------------------- 1 | module BlogCommentsHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/helpers/blog_posts_helper.rb: -------------------------------------------------------------------------------- 1 | module BlogPostsHelper 2 | def blog_post_summary(blog_post) 3 | blog_post.marketing_copy || strip_tags(blog_post.content)[0,280] 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/helpers/comments_helper.rb: -------------------------------------------------------------------------------- 1 | module CommentsHelper 2 | def allowed_to_comment?(user = current_user) 3 | AllowedToCommentPolicy.allowed?(user) 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/helpers/communication_preferences_helper.rb: -------------------------------------------------------------------------------- 1 | module CommunicationPreferencesHelper 2 | def communication_preference_option(f, key) 3 | f.label key do 4 | f.check_box(key) + 5 | content_tag(:span, I18n.t("communication_preferences.#{key}")) 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/helpers/default_allow_comments_helper.rb: -------------------------------------------------------------------------------- 1 | module DefaultAllowCommentsHelper 2 | def show_decide_default_allow_comments_modal? 3 | return false unless user_signed_in? 4 | return false unless current_user.default_allow_comments === nil 5 | return false unless current_user.solutions.published.count > 0 6 | return true 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/helpers/file_helper.rb: -------------------------------------------------------------------------------- 1 | module FileHelper 2 | def syntax_highlighter_for_filename(filename, track) 3 | extension = filename.split(".").last.try(&:downcase) 4 | lang = Exercism::PrismFileMappings[extension] || 5 | track.syntax_highlighter_language 6 | 7 | "language-#{lang}" 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/helpers/mentor_helper.rb: -------------------------------------------------------------------------------- 1 | module MentorHelper 2 | def allowed_to_mentor?(user = current_user) 3 | AllowedToMentorPolicy.allowed?(user) 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/helpers/solutions_helper.rb: -------------------------------------------------------------------------------- 1 | module SolutionsHelper 2 | def iteration_path(url_path, url_parts) 3 | if url_path 4 | send url_path, *url_parts 5 | else 6 | url_parts 7 | end 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/helpers/unsubscribe_helper.rb: -------------------------------------------------------------------------------- 1 | module UnsubscribeHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/javascript/channels/consumer.js: -------------------------------------------------------------------------------- 1 | // Action Cable provides the framework to deal with WebSockets in Rails. 2 | // You can generate new channels where WebSocket features live using the `rails generate channel` command. 3 | 4 | import { createConsumer } from "@rails/actioncable" 5 | 6 | export default createConsumer() 7 | -------------------------------------------------------------------------------- /app/javascript/channels/index.js: -------------------------------------------------------------------------------- 1 | // Load all the channels within this directory and all subdirectories. 2 | // Channel files must be named *_channel.js. 3 | 4 | const channels = require.context('.', true, /_channel\.js$/) 5 | channels.keys().forEach(channels) 6 | -------------------------------------------------------------------------------- /app/javascript/src/ace-editor-config.js: -------------------------------------------------------------------------------- 1 | class AceEditorConfig { 2 | constructor(config) { 3 | config = config || {} 4 | 5 | this.mode = `ace/mode/${config.language}`; 6 | this.tabSize = config.indent_size || 2; 7 | this.useSoftTabs = config.indent_style == 'space'; 8 | } 9 | } 10 | 11 | export default AceEditorConfig; 12 | -------------------------------------------------------------------------------- /app/javascript/src/blog_post.js: -------------------------------------------------------------------------------- 1 | window.setupBlogPost = function(blogcommentId) { 2 | setupTabs(); 3 | setupNewEditableText('blogComment-' + blogcommentId); 4 | }; 5 | -------------------------------------------------------------------------------- /app/javascript/src/info_panel.js: -------------------------------------------------------------------------------- 1 | class InfoPanel { 2 | constructor(element) { 3 | this.element = element; 4 | this.instructionsTab = this.element.find('.tab-1'); 5 | this.resultsTab = this.element.find('.tab-2'); 6 | } 7 | 8 | codeSubmitted() { 9 | this.resultsTab.click(); 10 | } 11 | } 12 | 13 | export default InfoPanel; 14 | -------------------------------------------------------------------------------- /app/javascript/src/options.js: -------------------------------------------------------------------------------- 1 | window.updateOptions = function(select, options) { 2 | select.clearOptions(); 3 | select.addOption(options); 4 | } 5 | -------------------------------------------------------------------------------- /app/javascript/src/selectize.js: -------------------------------------------------------------------------------- 1 | $('select:not(.js-skip-selectize)').selectize(); 2 | -------------------------------------------------------------------------------- /app/javascript/src/selects.js: -------------------------------------------------------------------------------- 1 | window.submitOnChange = function($select) { 2 | $select.change(function() { 3 | var form = $(this).parents('form'); 4 | var isRemote = $(form).data("remote"); 5 | 6 | if (isRemote) { 7 | Rails.fire(form[0], 'submit'); 8 | } else { 9 | form[0].submit(); 10 | } 11 | }) 12 | } 13 | -------------------------------------------------------------------------------- /app/javascript/src/solution.js: -------------------------------------------------------------------------------- 1 | function setupSolution(solutionID, iterationID) { 2 | setupTabs(); 3 | setupNewEditableText('discussionPost-' + solutionID + '-' + iterationID); 4 | } 5 | 6 | window.setupSolution = setupSolution; 7 | -------------------------------------------------------------------------------- /app/javascript/tests/setup.js: -------------------------------------------------------------------------------- 1 | window.$ = window.jQuery = require('jquery'); 2 | -------------------------------------------------------------------------------- /app/jobs/application_job.rb: -------------------------------------------------------------------------------- 1 | class ApplicationJob < ActiveJob::Base 2 | end 3 | -------------------------------------------------------------------------------- /app/jobs/broadcast_submission_job.rb: -------------------------------------------------------------------------------- 1 | class BroadcastSubmissionJob < ApplicationJob 2 | def perform(submission) 3 | BroadcastSolutionJob.perform_now(submission.solution) 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/jobs/changelog_entry_tweet_job.rb: -------------------------------------------------------------------------------- 1 | class ChangelogEntryTweetJob < ApplicationJob 2 | def perform(account, tweet) 3 | account = TwitterAccountSerializer.new.deserialize(account) 4 | 5 | ChangelogEntryServices::Tweet.(account, tweet) 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/models/application_record.rb: -------------------------------------------------------------------------------- 1 | class ApplicationRecord < ActiveRecord::Base 2 | self.abstract_class = true 3 | end 4 | -------------------------------------------------------------------------------- /app/models/auth_token.rb: -------------------------------------------------------------------------------- 1 | class AuthToken < ApplicationRecord 2 | scope :active, -> { where(active: true) } 3 | 4 | belongs_to :user 5 | 6 | before_create do 7 | self.token ||= SecureRandom.uuid 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/models/blog_comment.rb: -------------------------------------------------------------------------------- 1 | class BlogComment < ApplicationRecord 2 | belongs_to :blog_post 3 | belongs_to :user 4 | end 5 | -------------------------------------------------------------------------------- /app/models/communication_preferences.rb: -------------------------------------------------------------------------------- 1 | class CommunicationPreferences < ApplicationRecord 2 | belongs_to :user 3 | 4 | before_create do 5 | self.token = SecureRandom.uuid 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/models/concerns/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/models/concerns/.keep -------------------------------------------------------------------------------- /app/models/exercise_topic.rb: -------------------------------------------------------------------------------- 1 | class ExerciseTopic < ApplicationRecord 2 | belongs_to :topic 3 | belongs_to :exercise 4 | end 5 | -------------------------------------------------------------------------------- /app/models/git/null_github_profile.rb: -------------------------------------------------------------------------------- 1 | class Git::NullGithubProfile 2 | def name 3 | nil 4 | end 5 | 6 | def bio 7 | nil 8 | end 9 | 10 | def avatar_url 11 | nil 12 | end 13 | 14 | def link_url 15 | nil 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /app/models/guest.rb: -------------------------------------------------------------------------------- 1 | class Guest 2 | def theme 3 | :light 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/models/ignored_solution_mentorship.rb: -------------------------------------------------------------------------------- 1 | class IgnoredSolutionMentorship < ApplicationRecord 2 | belongs_to :user 3 | belongs_to :solution 4 | end 5 | -------------------------------------------------------------------------------- /app/models/infrastructure.rb: -------------------------------------------------------------------------------- 1 | module Infrastructure 2 | def self.table_name_prefix 3 | 'infrastructure_' 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/models/maintainer.rb: -------------------------------------------------------------------------------- 1 | class Maintainer < ApplicationRecord 2 | belongs_to :track 3 | belongs_to :user, optional: true 4 | 5 | scope :active, -> { where(alumnus: nil) } 6 | scope :visible, -> { where(visible: true) } 7 | 8 | def active? 9 | alumnus.blank? 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/models/mentor.rb: -------------------------------------------------------------------------------- 1 | class Mentor < ApplicationRecord 2 | belongs_to :track 3 | 4 | validates :name, presence: true 5 | validates :github_username, presence: true 6 | end 7 | -------------------------------------------------------------------------------- /app/models/null_track.rb: -------------------------------------------------------------------------------- 1 | class NullTrack 2 | def repo 3 | end 4 | end 5 | -------------------------------------------------------------------------------- /app/models/null_user.rb: -------------------------------------------------------------------------------- 1 | class NullUser 2 | def handle 3 | "Anonymous User" 4 | end 5 | 6 | def avatar_url 7 | User::DEFAULT_AVATAR 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/models/repo_update_fetch.rb: -------------------------------------------------------------------------------- 1 | class RepoUpdateFetch < ApplicationRecord 2 | belongs_to :repo_update 3 | 4 | validates :repo_update, presence: true 5 | validates :host, presence: true 6 | end 7 | -------------------------------------------------------------------------------- /app/models/research.rb: -------------------------------------------------------------------------------- 1 | module Research 2 | def self.table_name_prefix 3 | 'research_' 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/models/research/experiment.rb: -------------------------------------------------------------------------------- 1 | module Research 2 | class Experiment < ApplicationRecord 3 | extend FriendlyId 4 | friendly_id :title, use: [:slugged, :history] 5 | 6 | def to_param 7 | slug 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/models/solution_comment.rb: -------------------------------------------------------------------------------- 1 | class SolutionComment < ApplicationRecord 2 | belongs_to :solution 3 | belongs_to :user 4 | end 5 | -------------------------------------------------------------------------------- /app/models/solution_lock.rb: -------------------------------------------------------------------------------- 1 | class SolutionLock < ApplicationRecord 2 | belongs_to :solution 3 | belongs_to :user 4 | end 5 | -------------------------------------------------------------------------------- /app/models/solution_star.rb: -------------------------------------------------------------------------------- 1 | class SolutionStar < ApplicationRecord 2 | belongs_to :solution 3 | belongs_to :user 4 | end 5 | -------------------------------------------------------------------------------- /app/models/team_membership.rb: -------------------------------------------------------------------------------- 1 | class TeamMembership < ApplicationRecord 2 | class InvalidMembership < RuntimeError 3 | end 4 | 5 | belongs_to :team 6 | belongs_to :user 7 | 8 | delegate :name, to: :team, prefix: true 9 | delegate :name, to: :user 10 | end 11 | -------------------------------------------------------------------------------- /app/models/terminal_output.rb: -------------------------------------------------------------------------------- 1 | require "ansi-to-html" 2 | 3 | class TerminalOutput 4 | def initialize(output) 5 | @output = output 6 | end 7 | 8 | def to_html 9 | return nil unless output 10 | Ansi::To::Html.new(output).to_html 11 | end 12 | 13 | private 14 | attr_reader :output 15 | end 16 | -------------------------------------------------------------------------------- /app/models/testimonial.rb: -------------------------------------------------------------------------------- 1 | class Testimonial < ApplicationRecord 2 | belongs_to :track, optional: true 3 | 4 | scope :generic, -> { where(track_id: nil) } 5 | end 6 | -------------------------------------------------------------------------------- /app/models/topic.rb: -------------------------------------------------------------------------------- 1 | class Topic < ApplicationRecord 2 | has_many :exercise_topics 3 | has_many :exercises, through: :exercise_topics 4 | 5 | before_create do 6 | self.name = slug.titleize unless name 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/models/track_mentorship.rb: -------------------------------------------------------------------------------- 1 | class TrackMentorship < ApplicationRecord 2 | belongs_to :user 3 | belongs_to :track 4 | 5 | def handle 6 | super || user.handle 7 | end 8 | 9 | def avatar_url 10 | super || user.avatar_url 11 | end 12 | 13 | def bio 14 | super || user.bio 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /app/models/user_email_log.rb: -------------------------------------------------------------------------------- 1 | class UserEmailLog < ApplicationRecord 2 | belongs_to :user 3 | 4 | # In rails 6 we can use create_or_find_by for this 5 | def self.for_user(user) 6 | create!(user_id: user.id) 7 | rescue ActiveRecord::RecordNotUnique 8 | find_by(user_id: user.id) 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/policies/allowed_to_comment_policy.rb: -------------------------------------------------------------------------------- 1 | class AllowedToCommentPolicy 2 | def self.allowed?(user) 3 | new(user).allowed? 4 | end 5 | 6 | def initialize(user) 7 | @user = user 8 | end 9 | 10 | def allowed? 11 | user.solutions.submitted.any? 12 | end 13 | 14 | private 15 | attr_reader :user 16 | end 17 | -------------------------------------------------------------------------------- /app/policies/allowed_to_mentor_policy.rb: -------------------------------------------------------------------------------- 1 | class AllowedToMentorPolicy 2 | def self.allowed?(user) 3 | new(user).allowed? 4 | end 5 | 6 | def initialize(user) 7 | @user = user 8 | end 9 | 10 | def allowed? 11 | user.solutions.submitted.any? 12 | end 13 | 14 | private 15 | attr_reader :user 16 | end 17 | -------------------------------------------------------------------------------- /app/services/analysis_services/unlock_solution.rb: -------------------------------------------------------------------------------- 1 | module AnalysisServices 2 | class UnlockSolution 3 | include Mandate 4 | 5 | initialize_with(:solution) 6 | 7 | def call 8 | solution.solution_locks.where(user_id: User::SYSTEM_USER_ID).destroy_all 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/services/clear_notifications.rb: -------------------------------------------------------------------------------- 1 | class ClearNotifications 2 | include Mandate 3 | 4 | initialize_with :user, :about 5 | 6 | def call 7 | Notification.where(user: user, about: about).update_all(read: true) 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/services/create_profile.rb: -------------------------------------------------------------------------------- 1 | class CreateProfile 2 | include Mandate 3 | initialize_with :user, :display_name 4 | 5 | def call 6 | Profile.create( 7 | user: user, 8 | display_name: display_name 9 | ) 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /app/services/create_team.rb: -------------------------------------------------------------------------------- 1 | class CreateTeam 2 | include Mandate 3 | 4 | initialize_with :user, :name, :avatar 5 | 6 | def call 7 | team = Team.create!( 8 | name: name, 9 | avatar: avatar 10 | ) 11 | team.memberships.create!( 12 | user: user, 13 | admin: true 14 | ) 15 | team 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /app/services/git/fetch_repos.rb: -------------------------------------------------------------------------------- 1 | class Git::FetchRepos 2 | include Mandate 3 | 4 | FETCH_BACKOFF_PERIOD = 1.second 5 | 6 | initialize_with(:repos) 7 | 8 | def call 9 | return 10 | repos.each do |repo| 11 | Git::FetchRepo.(repo) 12 | sleep FETCH_BACKOFF_PERIOD 13 | end 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/services/git/sync_website_copy.rb: -------------------------------------------------------------------------------- 1 | class Git::SyncWebsiteCopy 2 | include Mandate 3 | 4 | def call 5 | return 6 | Git::SyncMentors.() 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /app/services/html_generation_helpers.rb: -------------------------------------------------------------------------------- 1 | module HTMLGenerationHelpers 2 | def strong(text) 3 | "#{text}" 4 | end 5 | 6 | def routes 7 | Rails.application.routes.url_helpers 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/services/pause_user_track.rb: -------------------------------------------------------------------------------- 1 | class PauseUserTrack 2 | include Mandate 3 | 4 | initialize_with :user_track 5 | 6 | def call 7 | ActiveRecord::Base.transaction do 8 | user_track.update(paused_at: Time.current) 9 | user_track.solutions.update_all(paused: true) 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/services/publish_solution.rb: -------------------------------------------------------------------------------- 1 | class PublishSolution 2 | include Mandate 3 | 4 | initialize_with :solution 5 | 6 | def call 7 | return if solution.published? 8 | 9 | solution.update( 10 | published_at: Time.current, 11 | show_on_profile: true, 12 | allow_comments: true 13 | ) 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /app/services/retrieve_mentor_exercise_notes.rb: -------------------------------------------------------------------------------- 1 | class RetrieveMentorExerciseNotes 2 | include Mandate 3 | 4 | initialize_with(:track, :exercise) 5 | 6 | def call 7 | markdown = Git::WebsiteContent.head.mentor_notes_for(track.slug, exercise.slug) 8 | ParseMarkdown.(markdown.to_s) 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /app/services/unlock_core_exercise.rb: -------------------------------------------------------------------------------- 1 | class UnlockCoreExercise 2 | include Mandate 3 | 4 | initialize_with :user, :exercise 5 | 6 | def call 7 | CreateSolution.(user, exercise) 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /app/services/unpause_user_track.rb: -------------------------------------------------------------------------------- 1 | class UnpauseUserTrack 2 | include Mandate 3 | 4 | initialize_with :user_track 5 | 6 | def call 7 | ActiveRecord::Base.transaction do 8 | user_track.update(paused_at: nil) 9 | user_track.solutions.update_all(paused: false) 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/support/sql_snippets.rb: -------------------------------------------------------------------------------- 1 | module SQLSnippets 2 | def self.random 3 | Arel.sql("RAND()") 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /app/views/admin/data/tracks/index.html.haml: -------------------------------------------------------------------------------- 1 | .lo-container 2 | %h1 Tracks 3 | %ul 4 | -@tracks.each do |track| 5 | %li= link_to track.title, [:admin, :data, track] 6 | -------------------------------------------------------------------------------- /app/views/admin/data/tracks/show.html.haml: -------------------------------------------------------------------------------- 1 | .lo-container 2 | %h1= @track.title 3 | 4 | %ul 5 | -@exercises.each do |exercise| 6 | %li= link_to exercise.title, [:admin, :data, @track, exercise] 7 | -------------------------------------------------------------------------------- /app/views/admin/mentors/index.html.haml: -------------------------------------------------------------------------------- 1 | %h1 Admin::Mentors#index 2 | %p Find me in app/views/admin/mentors/index.html.haml 3 | -------------------------------------------------------------------------------- /app/views/blog_comments/create.js.haml: -------------------------------------------------------------------------------- 1 | var newComment = '#{j render("blog_comments/comment", comment: @comment)}'; 2 | $('#blog-post .comments .no-comments').hide() 3 | $('#blog-post .comments').append(newComment) 4 | window.location.href = "#blog-comment-#{@comment.id}" 5 | =raw yield(:js).gsub(/<\/?script>/, "") 6 | -------------------------------------------------------------------------------- /app/views/blog_comments/destroy.js.haml: -------------------------------------------------------------------------------- 1 | var newComment = '#{j render("blog_comments/comment", comment: @comment)}'; 2 | $('#blog-comment-#{@comment.id}').replaceWith(newComment); 3 | -------------------------------------------------------------------------------- /app/views/blog_comments/update.js.haml: -------------------------------------------------------------------------------- 1 | var newComment = '#{j render("blog_comments/comment", comment: @comment)}'; 2 | $('#blog-comment-#{@comment.id}').replaceWith(newComment); 3 | Prism.highlightAll() 4 | 5 | =raw yield(:js).gsub(/<\/?script>/, "") 6 | -------------------------------------------------------------------------------- /app/views/changelog_admin/entries/_actions.html.haml: -------------------------------------------------------------------------------- 1 | - actions.each do |action| 2 | = action.render_for(self, entry, current_user) 3 | 4 | = link_to "Back to Changelog Admin", changelog_admin_root_path, class: 'entries-link' 5 | -------------------------------------------------------------------------------- /app/views/changelog_admin/entries/edit.html.haml: -------------------------------------------------------------------------------- 1 | #changelog-admin-edit-entry.lo-changelog-admin-page 2 | .lo-container 3 | %h1 Edit Entry 4 | 5 | = render "form", 6 | form: @form, 7 | url: changelog_admin_entry_path(@entry), 8 | method: :patch 9 | -------------------------------------------------------------------------------- /app/views/changelog_admin/entries/new.html.haml: -------------------------------------------------------------------------------- 1 | #changelog-admin-new-entry.lo-changelog-admin-page 2 | .lo-container 3 | %h1 New Entry 4 | %p Use this form to create a new entry in the Changelog 5 | 6 | = render "form", form: @form, url: changelog_admin_entries_path 7 | -------------------------------------------------------------------------------- /app/views/changelog_entries/_entry.html.haml: -------------------------------------------------------------------------------- 1 | %div 2 | %p= graphical_image entry.icon 3 | %p= entry.title 4 | %p Created by #{entry.created_by_handle} 5 | %p Published #{time_ago_in_words(entry.published_at)} ago 6 | %p= raw entry.details_html 7 | - if entry.info_url 8 | %p= link_to changelog_entry_info_url_text(entry.info_url), entry.info_url 9 | -------------------------------------------------------------------------------- /app/views/changelog_entries/index.html.haml: -------------------------------------------------------------------------------- 1 | - @entries.each do |entry| 2 | = render "entry", entry: entry 3 | 4 | = paginate @entries 5 | -------------------------------------------------------------------------------- /app/views/changelog_entries/show.html.haml: -------------------------------------------------------------------------------- 1 | = render "entry", entry: @entry 2 | -------------------------------------------------------------------------------- /app/views/devise/mailer/confirmation_instructions.html.haml: -------------------------------------------------------------------------------- 1 | .content 2 | .h2 Hello #{@user.handle}, 3 | %p Welcome to Exercism. Complete setting up your account by confirming your email address - just click the link below. 4 | %p= link_to 'Confirm my account', confirmation_url(@user, confirmation_token: @token) 5 | -------------------------------------------------------------------------------- /app/views/devise/mailer/confirmation_instructions.text.erb: -------------------------------------------------------------------------------- 1 | Hello <%= @user.handle %>, 2 | Welcome to Exercism. Complete setting up your account by confirming your email address - just copy and paste the link below to your browser. 3 | <%= confirmation_url(@user, confirmation_token: @token) %> 4 | -------------------------------------------------------------------------------- /app/views/devise/mailer/email_changed.html.haml: -------------------------------------------------------------------------------- 1 | %p 2 | Hello #{@email}! 3 | - if @resource.try(:unconfirmed_email?) 4 | %p 5 | We're contacting you to notify you that your email is being changed to #{@resource.unconfirmed_email}. 6 | - else 7 | %p 8 | We're contacting you to notify you that your email has been changed to #{@resource.email}. 9 | -------------------------------------------------------------------------------- /app/views/devise/mailer/password_change.html.haml: -------------------------------------------------------------------------------- 1 | %p 2 | Hello #{@resource.email}! 3 | %p We're contacting you to notify you that your password has been changed. 4 | -------------------------------------------------------------------------------- /app/views/devise/mailer/unlock_instructions.html.haml: -------------------------------------------------------------------------------- 1 | %p 2 | Hello #{@resource.email}! 3 | %p Your account has been locked due to an excessive number of unsuccessful sign in attempts. 4 | %p Click the link below to unlock your account: 5 | %p= link_to 'Unlock my account', unlock_url(@resource, unlock_token: @token) 6 | -------------------------------------------------------------------------------- /app/views/layouts/_announcement_bar.html.haml: -------------------------------------------------------------------------------- 1 | .announcement-bar 2 | 🎉 Exercism Research is now launched. Help Exercism, help science and have some fun at #{link_to "research.exercism.io", "https://research.exercism.io"} 🎉 3 | -------------------------------------------------------------------------------- /app/views/layouts/_head.html.haml: -------------------------------------------------------------------------------- 1 | =stylesheet_link_tag 'application', media: 'all' 2 | 3 | =async_stylesheet_link_tag '//fonts.googleapis.com/css?family=Dosis:600,700,800' 4 | 5 | =render "layouts/prismjs" 6 | =render "layouts/meta_tags" 7 | =csrf_meta_tags 8 | =yield(:head) 9 | -------------------------------------------------------------------------------- /app/views/layouts/_logged_out_header.html.haml: -------------------------------------------------------------------------------- 1 | %header.logged-out 2 | .lo-container 3 | =link_to root_path, class: 'logo' do 4 | =image "logo-white.png", 'Exercism' 5 | 6 | .options 7 | = link_to "Sign up", new_user_registration_path 8 | = link_to "Log in", new_user_session_path 9 | -------------------------------------------------------------------------------- /app/views/layouts/_modal.html.haml: -------------------------------------------------------------------------------- 1 | #modal-wrapper 2 | #modal 3 | 4 | -------------------------------------------------------------------------------- /app/views/layouts/changelog_admin.html.haml: -------------------------------------------------------------------------------- 1 | !!! 2 | %html{lang: I18n.locale} 3 | %head 4 | =render "layouts/head" 5 | 6 | %body{class: body_class} 7 | =render_header 8 | = yield 9 | =render "layouts/footer" 10 | =render "layouts/modal" 11 | 12 | =yield(:async_css) 13 | =render "layouts/javascript" 14 | -------------------------------------------------------------------------------- /app/views/mentor/dashboard/_next_solutions.html.haml: -------------------------------------------------------------------------------- 1 | -next_solutions.each do |solution| 2 | -user_track = user_tracks["#{solution.user_id}|#{solution.exercise.track_id}"] 3 | =render "solution", solution: solution, user_track: user_track 4 | 5 | -------------------------------------------------------------------------------- /app/views/mentor/dashboard/_no_solutions_section.html.haml: -------------------------------------------------------------------------------- 1 | .no-solutions-section 2 | =icon :inbox, nil, style: :solid 3 | %h2 No solutions to mentor 4 | %p There are currently no solutions that need mentoring in your chosen languages - thanks for your hard work! Why not go spend some time learning a new language on Exercism instead? 5 | -------------------------------------------------------------------------------- /app/views/mentor/dashboard/_your_solutions.html.haml: -------------------------------------------------------------------------------- 1 | -your_solutions.each do |solution| 2 | -user_track = user_tracks["#{solution.user_id}|#{solution.exercise.track_id}"] 3 | =render "solution", solution: solution, user_track: user_track 4 | 5 | = paginate @your_solutions, remote: true, params: {action: :your_solutions} 6 | -------------------------------------------------------------------------------- /app/views/mentor/exercise_notes/modal.html.haml: -------------------------------------------------------------------------------- 1 | #mentor-exercise-notes 2 | %h1 Mentor Notes for #{@track.title} | #{@exercise.title} 3 | =render "notes" 4 | -------------------------------------------------------------------------------- /app/views/mentor/exercise_notes/show.html.haml: -------------------------------------------------------------------------------- 1 | #mentor-exercise-notes 2 | .header 3 | .lo-container 4 | %h1 Mentor Notes for #{@exercise.title} on the #{@track.title} Track 5 | .lo-container 6 | =render "notes" 7 | -------------------------------------------------------------------------------- /app/views/mentor/solutions/approve.js.haml: -------------------------------------------------------------------------------- 1 | $('.approved').show() 2 | $('.approve-button').remove() 3 | $('.approve-and-comment-button').remove() 4 | $('.leave-button').remove() 5 | -------------------------------------------------------------------------------- /app/views/mentor/solutions/lock.js.haml: -------------------------------------------------------------------------------- 1 | -if @solution_locked 2 | $('.claim-section').hide() 3 | $('.claimed-section').show() 4 | $('.discussion').show() 5 | $('.new-editable-text').show() 6 | -else 7 | $('.claim-section .request').hide() 8 | $('.claim-section .force').show() 9 | -------------------------------------------------------------------------------- /app/views/mentor_notifications_mailer/new_discussion_post.text.haml: -------------------------------------------------------------------------------- 1 | Hi there, 2 | 3 | A student you are mentoring (#{display_handle(@solution.user, @solution.user_track)}) has posted a new comment on their solution to #{@solution.exercise.title} on the #{@solution.exercise.track.title} track. You can view it here: #{mentor_solution_url(@solution)} 4 | -------------------------------------------------------------------------------- /app/views/mentor_notifications_mailer/new_iteration.text.haml: -------------------------------------------------------------------------------- 1 | Hi there, 2 | 3 | A student you are mentoring (#{display_handle(@solution.user, @solution.user_track)}) has posted a new iteration of their solution to #{@solution.exercise.title} on the #{@solution.exercise.track.title} track. You can view it here: #{mentor_solution_url(@solution)} 4 | 5 | -------------------------------------------------------------------------------- /app/views/my/dashboard/show.html.haml: -------------------------------------------------------------------------------- 1 | #dashboard-page 2 | .lo-container 3 | Your dashboard 4 | 5 | -if @last_solution 6 | %h2 Carry on where you left off 7 | =link_to @last_solution.exercise.title, [:my, @last_solution] 8 | -------------------------------------------------------------------------------- /app/views/my/discussion_posts/create.js.haml: -------------------------------------------------------------------------------- 1 | var newPost = '#{j discussion_post_widget(@post, @iteration.solution, @user_track)}'; 2 | $('.discussion .posts').show().append(newPost) 3 | $('.discussion .next-steps').hide() 4 | window.location.href = "#discussion-post-#{@post.id}" 5 | 6 | =raw yield(:js).gsub(/<\/?script>/, "") 7 | -------------------------------------------------------------------------------- /app/views/my/discussion_posts/destroy.js.haml: -------------------------------------------------------------------------------- 1 | var newPost = '#{j discussion_post_widget(@post, @iteration.solution, @user_track)}'; 2 | $('#discussion-post-#{@post.id}').replaceWith(newPost); 3 | -------------------------------------------------------------------------------- /app/views/my/discussion_posts/update.js.haml: -------------------------------------------------------------------------------- 1 | var newPost = '#{j discussion_post_widget(@post, @iteration.solution, @user_track)}'; 2 | $('#discussion-post-#{@post.id}').replaceWith(newPost); 3 | Prism.highlightAll() 4 | 5 | =raw yield(:js).gsub(/<\/?script>/, "") 6 | -------------------------------------------------------------------------------- /app/views/my/profile/edit.html.haml: -------------------------------------------------------------------------------- 1 | = render "profiles/page", profile: @profile, profile_view: @profile_view 2 | 3 | - content_for :js do 4 | :javascript 5 | $(function() { 6 | showModal('edit-profile', '#{j render("edit_modal")}'); 7 | }); 8 | -------------------------------------------------------------------------------- /app/views/my/side_exercises/index.js.haml: -------------------------------------------------------------------------------- 1 | $('#my-track-page .side-exercises .exercises').html("#{j render("my/side_exercises/exercises", exercises_and_solutions: @exercises_and_solutions)}") 2 | $('#my-track-page .side-exercises .num-extra-exercises').html("#{j pluralize @exercises_and_solutions.size, "Exercise"}") 3 | -------------------------------------------------------------------------------- /app/views/my/solutions/_solutions.html.haml: -------------------------------------------------------------------------------- 1 | -solutions.each do |solution| 2 | .pure-u-1.pure-u-lg-1-2 3 | =render "solution", solution: solution 4 | -------------------------------------------------------------------------------- /app/views/my/solutions/index.js.haml: -------------------------------------------------------------------------------- 1 | $('.solutions').html('#{j render "solutions", solutions: @solutions}') 2 | $('.num-solutions').html('Showing #{pluralize @solutions.size, "solution"}') 3 | -------------------------------------------------------------------------------- /app/views/my/solutions/mentor_feedback_request/_oversubscribed.html.haml: -------------------------------------------------------------------------------- 1 | %p 2 | %strong Request mentor feedback (disabled). 3 | This track is currently oversubscribed so requests for mentoring are currently paused. Please check back later. 4 | =link_to "Request mentor feedback", "#", class: 'pure-button disabled', disabled: true 5 | -------------------------------------------------------------------------------- /app/views/my/solutions/mentor_feedback_request/independent/_oversubscribed.html.haml: -------------------------------------------------------------------------------- 1 | = render "my/solutions/mentor_feedback_request/oversubscribed" 2 | -------------------------------------------------------------------------------- /app/views/my/solutions/mentor_feedback_request/legacy/_oversubscribed.html.haml: -------------------------------------------------------------------------------- 1 | = render "my/solutions/mentor_feedback_request/oversubscribed" 2 | -------------------------------------------------------------------------------- /app/views/my/solutions/mentor_feedback_request/mentored/_oversubscribed.html.haml: -------------------------------------------------------------------------------- 1 | = render "my/solutions/mentor_feedback_request/oversubscribed" 2 | -------------------------------------------------------------------------------- /app/views/my/solutions/mentor_feedback_request_notification/_mentoring_slots_remaining.html.haml: -------------------------------------------------------------------------------- 1 | You may request mentoring on one solution at a time. 2 | 3 | = link_to "Request mentoring", request_mentoring_my_solution_path(mentor_request.solution), method: :patch 4 | -------------------------------------------------------------------------------- /app/views/my/solutions/mentor_feedback_request_notification/_mentoring_slots_used.html.haml: -------------------------------------------------------------------------------- 1 | You may request mentoring once your existing solutions have been mentored. 2 | -------------------------------------------------------------------------------- /app/views/my/solutions/mentor_feedback_request_notification/_oversubscribed.html.haml: -------------------------------------------------------------------------------- 1 | You may request mentoring once the track isn't oversubscribed. 2 | -------------------------------------------------------------------------------- /app/views/my/solutions/toggle.js.haml: -------------------------------------------------------------------------------- 1 | $(".solution_#{@solution.id}").replaceWith("#{j render("solution", solution: @solution)}") 2 | -------------------------------------------------------------------------------- /app/views/my/solutions/walkthrough.html.haml: -------------------------------------------------------------------------------- 1 | #cli-walkthrough 2 | = @walkthrough.html_safe 3 | 4 | - content_for :js do 5 | :javascript 6 | $(function() { Walkthrough.bindEvents("html, body") }); 7 | -------------------------------------------------------------------------------- /app/views/my/solutions/walkthrough_modal.html.haml: -------------------------------------------------------------------------------- 1 | #cli-walkthrough 2 | = @walkthrough.html_safe 3 | 4 | :javascript 5 | $(function() { Walkthrough.bindEvents("#modal") }); 6 | -------------------------------------------------------------------------------- /app/views/my/solutions/widgets/_complete_prompt.html.haml: -------------------------------------------------------------------------------- 1 | .next-option 2 | %p 3 | %strong Complete this solution. 4 | If you're happy with this solution, you can mark it as completed. You will then be allowed to publish it. 5 | =link_to "Complete this solution", complete_my_solution_path(@solution), method: :patch, class: 'pure-button', remote: true 6 | -------------------------------------------------------------------------------- /app/views/my/starred_solutions/create.js.haml: -------------------------------------------------------------------------------- 1 | $(".star-button").replaceWith("#{j render "star_button"}") 2 | -------------------------------------------------------------------------------- /app/views/my/tracks/_topic_percentages.html.haml: -------------------------------------------------------------------------------- 1 | -topic_percentages.each do |topic, percentage| 2 | .topic 3 | .percentage #{percentage.round}% 4 | .bar 5 | .filled{style: "width: #{percentage.round}%"} 6 | .title= topic.titleize 7 | -------------------------------------------------------------------------------- /app/views/my/tracks/_unlocked_exercises.html.haml: -------------------------------------------------------------------------------- 1 | - unlocked_exercises.each do |exercise| 2 | = link_to [:my, exercise.solution], class: "unlocked-exercise", data: { status: exercise.status, title: exercise.title } do 3 | = graphical_image exercise.turquoise_icon_url, class: 'normal' 4 | = graphical_image exercise.white_icon_url, class: 'hover' 5 | -------------------------------------------------------------------------------- /app/views/pages/cli_walkthrough.html.haml: -------------------------------------------------------------------------------- 1 | #cli-walkthrough 2 | .lo-container 3 | = @walkthrough.html_safe 4 | 5 | - content_for :js do 6 | :javascript 7 | $(function() { Walkthrough.bindEvents("html, body") }); 8 | -------------------------------------------------------------------------------- /app/views/pages/contributors.js.haml: -------------------------------------------------------------------------------- 1 | $('.contributors .pure-button').replaceWith("#{j render("contributors")}") 2 | -------------------------------------------------------------------------------- /app/views/profiles/show.html.haml: -------------------------------------------------------------------------------- 1 | = render "page", profile: @profile, profile_view: @profile_view 2 | -------------------------------------------------------------------------------- /app/views/profiles/solutions.js.haml: -------------------------------------------------------------------------------- 1 | $('.solutions').html('#{j render "solutions", solutions: @profile_view.solutions}') 2 | $('.num-solutions').html('Showing #{pluralize @profile_view.solutions.size, "solution"}') 3 | -------------------------------------------------------------------------------- /app/views/research/submission_ops_status/_fail.html.haml: -------------------------------------------------------------------------------- 1 | = render partial: status.test_run, as: :test_run 2 | -------------------------------------------------------------------------------- /app/views/research/submission_ops_status/_pass.html.haml: -------------------------------------------------------------------------------- 1 | = render partial: status.test_run, as: :test_run 2 | -------------------------------------------------------------------------------- /app/views/research/submission_test_runs/_error.html.haml: -------------------------------------------------------------------------------- 1 | .test-run 2 | .run-status An error occurred 3 | 4 | .test-run-error 5 | %p We got the following error message when we ran your code: 6 | 7 | %pre 8 | %code= test_run.message 9 | -------------------------------------------------------------------------------- /app/views/research/submission_test_runs/_fail.html.haml: -------------------------------------------------------------------------------- 1 | .test-run 2 | .run-status 3 | #{test_run.num_passed_tests} passed, 4 | #{test_run.num_failed_tests} failed, 5 | #{test_run.num_skipped_tests} skipped 6 | 7 | -test_run.tests_to_display.each.with_index do |test, idx| 8 | = render partial: test, as: :test, locals: {test_idx: idx + 1} 9 | -------------------------------------------------------------------------------- /app/views/research/submission_test_runs/_no_results.html.haml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/app/views/research/submission_test_runs/_no_results.html.haml -------------------------------------------------------------------------------- /app/views/research/submissions/_submission.html.haml: -------------------------------------------------------------------------------- 1 | - if submission 2 | = render partial: submission.ops_status, as: :status 3 | - else 4 | Hit "Run code" to see how your solution performs. 5 | -------------------------------------------------------------------------------- /app/views/solution_comments/create.js.haml: -------------------------------------------------------------------------------- 1 | var newComment = '#{j solution_comment_widget(@comment, @solution)}'; 2 | $('#solution-page .comments .no-comments').hide() 3 | $('#solution-page .comments').show().append(newComment) 4 | window.location.href = "#solution-comment-#{@comment.id}" 5 | =raw yield(:js).gsub(/<\/?script>/, "") 6 | -------------------------------------------------------------------------------- /app/views/solution_comments/destroy.js.haml: -------------------------------------------------------------------------------- 1 | var newComment = '#{j solution_comment_widget(@comment, @solution)}'; 2 | $('#solution-comment-#{@comment.id}').replaceWith(newComment); 3 | -------------------------------------------------------------------------------- /app/views/solution_comments/update.js.haml: -------------------------------------------------------------------------------- 1 | var newComment = '#{j solution_comment_widget(@comment, @solution)}'; 2 | $('#solution-comment-#{@comment.id}').replaceWith(newComment); 3 | Prism.highlightAll() 4 | 5 | =raw yield(:js).gsub(/<\/?script>/, "") 6 | -------------------------------------------------------------------------------- /app/views/solution_comments_mailer/new_comment_for_other_commenter.html.haml: -------------------------------------------------------------------------------- 1 | .content 2 | %p Hi there, 3 | %p 4 | User "#{@comment.user.handle}" has commented on #{@solution_user_handle}'s solution to #{@exercise_title} on the #{@track_title} track. 5 | You can #{link_to "view it here", @solution}. 6 | -------------------------------------------------------------------------------- /app/views/solution_comments_mailer/new_comment_for_other_commenter.text.haml: -------------------------------------------------------------------------------- 1 | Hi there, 2 | 3 | User "#{@comment.user.handle}" has commented on #{@solution_user_handle}'s solution to #{@sexercise_title} on the #{@track_title} track. You can view it here: #{my_solution_url(@solution)}: 4 | -------------------------------------------------------------------------------- /app/views/solution_comments_mailer/new_comment_for_solution_user.html.haml: -------------------------------------------------------------------------------- 1 | .content 2 | %p Hi there, 3 | %p 4 | User "#{@comment.user.handle}" has commented on your solution to #{@exercise_title} on the #{@track_title} track. 5 | You can #{link_to "view it here", @solution}. 6 | -------------------------------------------------------------------------------- /app/views/solution_comments_mailer/new_comment_for_solution_user.text.haml: -------------------------------------------------------------------------------- 1 | Hi there, 2 | 3 | User "#{@comment.user.handle}" has commented on your solution to #{@exercise_title} on the #{@track_title} track. You can view it here: #{my_solution_url(@solution)}: 4 | -------------------------------------------------------------------------------- /app/views/solutions/_new_comment.html.haml: -------------------------------------------------------------------------------- 1 | -if solution.allow_comments? 2 | =render "new_comment_form", solution: solution 3 | -else 4 | =render "comments_disabled" 5 | -------------------------------------------------------------------------------- /app/views/team_invite_mailer/existing_user.html.haml: -------------------------------------------------------------------------------- 1 | .content 2 | %p #{@invitation.inviter_name} has invited you to join #{@invitation.team_name}! 3 | %p Join the team by following #{link_to "this link", teams_invitation_url(@invitation)}. 4 | -------------------------------------------------------------------------------- /app/views/team_invite_mailer/existing_user.text.haml: -------------------------------------------------------------------------------- 1 | #{@invitation.inviter_name} has invited you to join their team "#{@invitation.team_name}" on Exercism. 2 | 3 | Join the team by following #{link_to "this link", teams_invitation_url(@invitation)}. 4 | -------------------------------------------------------------------------------- /app/views/team_invite_mailer/new_user.html.haml: -------------------------------------------------------------------------------- 1 | .content 2 | %p #{@invitation.inviter_name} has invited you to join their team "#{@invitation.team_name}" on Exercism! 3 | %p Join the team by following #{link_to "this link", teams_invitation_url(@invitation)}. 4 | -------------------------------------------------------------------------------- /app/views/team_invite_mailer/new_user.text.haml: -------------------------------------------------------------------------------- 1 | #{@invitation.inviter_name} has invited you to join their team "#{@invitation.team_name}" on Exercism. 2 | 3 | Join the team by following #{link_to "this link", teams_invitation_url(@invitation)}. 4 | -------------------------------------------------------------------------------- /app/views/teams/dashboard/index.html.haml: -------------------------------------------------------------------------------- 1 | Teams dashboard 2 | -------------------------------------------------------------------------------- /app/views/teams/teams/_activity_team_membership.html.haml: -------------------------------------------------------------------------------- 1 | .activity.team-membership 2 | = image activity.user.avatar_url, "Avatar of #{activity.user.handle}" 3 | .title 4 | %strong #{activity.user.handle} 5 | joined the team. 6 | -------------------------------------------------------------------------------- /app/views/teams/teams/_activity_team_solution.html.haml: -------------------------------------------------------------------------------- 1 | .activity.solution 2 | = image activity.user.avatar_url, "Avatar of #{activity.user.handle}" 3 | .title 4 | %strong #{activity.user.handle} 5 | started 6 | %strong #{activity.exercise.title} 7 | on the 8 | %strong #{activity.exercise.track.title} 9 | Track. 10 | -------------------------------------------------------------------------------- /app/views/teams/teams/memberships/_settings.html.haml: -------------------------------------------------------------------------------- 1 | .section 2 | %h3 Settings 3 | .section-inner 4 | = render "teams/teams/memberships/settings/form", team: team 5 | .section-inner 6 | = render "teams/teams/memberships/settings/join_url", team: team 7 | -------------------------------------------------------------------------------- /app/views/teams/teams/memberships/settings/_join_url.html.haml: -------------------------------------------------------------------------------- 1 | - return unless team.url_join_allowed? 2 | 3 | %p.text-muted Share this link with people you want to join your team: 4 | = text_field_tag :join_url, 5 | teams_team_join_url(team.token), 6 | readonly: true, 7 | class: "team-join-url" 8 | -------------------------------------------------------------------------------- /app/views/teams/teams/my_solutions/possible_exercises.js.haml: -------------------------------------------------------------------------------- 1 | $('.exercises').html("#{j render("possible_exercises")}") 2 | -------------------------------------------------------------------------------- /app/views/teams/teams/show.html.haml: -------------------------------------------------------------------------------- 1 | #teams-team-page.team-page 2 | =teams_header 3 | 4 | .lo-container 5 | %h2 Activity Feed 6 | .h2-subheading What's been happening in your team. 7 | 8 | -@activities.each do |activity| 9 | =render "activity_#{activity.class.name.underscore}", activity: activity 10 | -------------------------------------------------------------------------------- /app/views/teams/teams/solutions/_solutions.html.haml: -------------------------------------------------------------------------------- 1 | -solutions.each do |solution| 2 | .pure-u-1.pure-u-md-1-2 3 | =render "solution", solution: solution 4 | -------------------------------------------------------------------------------- /app/views/tracks/_testimonial.html.haml: -------------------------------------------------------------------------------- 1 | -return unless testimonial 2 | .testimonal-section 3 | .lo-container 4 | .frame 5 | =graphical_image "speech-marks.png" 6 | %h2= testimonial.headline 7 | %p= testimonial.content 8 | .byline= testimonial.byline 9 | -------------------------------------------------------------------------------- /app/views/user_notifications_mailer/new_discussion_post.html.haml: -------------------------------------------------------------------------------- 1 | .content 2 | %p Hi there, 3 | %p 4 | A mentor has posted a comment on your solution to #{@solution.exercise.title} on the #{@solution.exercise.track.title} track. 5 | You can #{link_to "view it here", [:my, @solution]}. 6 | -------------------------------------------------------------------------------- /app/views/user_notifications_mailer/new_discussion_post.text.haml: -------------------------------------------------------------------------------- 1 | Hi there, 2 | 3 | A mentor has posted a comment on your solution to #{@solution.exercise.title} on the #{@solution.exercise.track.title} track. You can view it here: #{my_solution_url(@solution)} 4 | -------------------------------------------------------------------------------- /app/views/widgets/_banner.html.haml: -------------------------------------------------------------------------------- 1 | %span.banner= text 2 | -------------------------------------------------------------------------------- /app/views/widgets/_code_snippet.html.haml: -------------------------------------------------------------------------------- 1 | .widget-code-snippet 2 | =button_tag "copy", class: 'pure-button copy-button' 3 | %input.download-code{value: code, readonly: true} 4 | -------------------------------------------------------------------------------- /app/views/widgets/_contributor.html.haml: -------------------------------------------------------------------------------- 1 | =link_to "https://github.com/#{contributor.github_username}", class: "contributor", rel: "nofollow" do 2 | =image contributor.avatar_url, "Avatar of #{contributor.github_username}" 3 | %h3 @#{contributor.github_username} 4 | .num-contributions= pluralize contributor.num_contributions, "Contribution" 5 | -------------------------------------------------------------------------------- /bin/bundle: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) 3 | load Gem.bin_path('bundler', 'bundle') 4 | -------------------------------------------------------------------------------- /bin/delayed_job: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) 4 | require 'delayed/command' 5 | Delayed::Command.new(ARGV).daemonize 6 | -------------------------------------------------------------------------------- /bin/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_PATH = File.expand_path('../config/application', __dir__) 3 | require_relative '../config/boot' 4 | require 'rails/commands' 5 | -------------------------------------------------------------------------------- /bin/rake: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require_relative '../config/boot' 3 | require 'rake' 4 | Rake.application.run 5 | -------------------------------------------------------------------------------- /bin/yarn: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | APP_ROOT = File.expand_path('..', __dir__) 3 | Dir.chdir(APP_ROOT) do 4 | begin 5 | exec "yarnpkg", *ARGV 6 | rescue Errno::ENOENT 7 | $stderr.puts "Yarn executable was not detected in the system." 8 | $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install" 9 | exit 1 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require_relative 'config/environment' 4 | 5 | run Rails.application 6 | -------------------------------------------------------------------------------- /config/boot.rb: -------------------------------------------------------------------------------- 1 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) 2 | 3 | require 'bundler/setup' # Set up gems listed in the Gemfile. 4 | require 'bootsnap/setup' # Speed up boot time by caching expensive operations. 5 | -------------------------------------------------------------------------------- /config/cable.yml: -------------------------------------------------------------------------------- 1 | development: 2 | adapter: redis 3 | url: redis://localhost:6379/1 4 | 5 | test: 6 | adapter: test 7 | 8 | production: 9 | adapter: redis 10 | url: <%= Rails.application.secrets.action_cable_redis_url %> 11 | channel_prefix: exercism_production 12 | -------------------------------------------------------------------------------- /config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the Rails application. 2 | require_relative 'application' 3 | 4 | # Initialize the Rails application. 5 | Rails.application.initialize! 6 | -------------------------------------------------------------------------------- /config/initializers/ace.rb: -------------------------------------------------------------------------------- 1 | Exercism::AceMappings = { 2 | "go" => "golang", 3 | "common-lisp" => "lisp" 4 | } 5 | -------------------------------------------------------------------------------- /config/initializers/active_storage.rb: -------------------------------------------------------------------------------- 1 | require 'active_storage/filename' 2 | class ActiveStorage::Filename 3 | 4 | def with_slashes 5 | @filename.encode(Encoding::UTF_8, invalid: :replace, undef: :replace, replace: "�").strip.tr("\u{202E}%$|:;\t\r\n\\", "-").to_s 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /config/initializers/analyzers.rb: -------------------------------------------------------------------------------- 1 | Exercism::ANALYZERS = %i{ 2 | ruby 3 | } 4 | -------------------------------------------------------------------------------- /config/initializers/application_controller_renderer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # ActiveSupport::Reloader.to_prepare do 4 | # ApplicationController.renderer.defaults.merge!( 5 | # http_host: 'example.org', 6 | # https: false 7 | # ) 8 | # end 9 | -------------------------------------------------------------------------------- /config/initializers/bugsnag.rb: -------------------------------------------------------------------------------- 1 | Bugsnag.configure do |config| 2 | config.api_key = Rails.application.secrets.bugsnag_api_key 3 | config.notify_release_stages = ["staging", "production"] 4 | end 5 | -------------------------------------------------------------------------------- /config/initializers/cluster_config.rb: -------------------------------------------------------------------------------- 1 | server_identity_file = Rails. 2 | application. 3 | config_for("cluster")["server_identity_file"] 4 | 5 | unless File.exist?(server_identity_file) 6 | raise "Server identity file isn't setup! Please see README.md" 7 | end 8 | -------------------------------------------------------------------------------- /config/initializers/cookies_serializer.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Specify a serializer for the signed and encrypted cookie jars. 4 | # Valid options are :json, :marshal, and :hybrid. 5 | Rails.application.config.action_dispatch.cookies_serializer = :json 6 | -------------------------------------------------------------------------------- /config/initializers/enumerable.rb: -------------------------------------------------------------------------------- 1 | module Enumerable 2 | def avg 3 | f = sum.fdiv(size) 4 | f.nan?? 0 : f 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /config/initializers/filter_parameter_logging.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Configure sensitive parameters which will be filtered from the log file. 4 | Rails.application.config.filter_parameters += [:password] 5 | -------------------------------------------------------------------------------- /config/initializers/flipper.rb: -------------------------------------------------------------------------------- 1 | Flipper.configure do |config| 2 | config.default do 3 | adapter = Flipper::Adapters::ActiveRecord.new 4 | 5 | Flipper.new(adapter) 6 | end 7 | end 8 | 9 | Flipper.register(:admins) do |actor| 10 | actor.admin? 11 | end 12 | -------------------------------------------------------------------------------- /config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | -------------------------------------------------------------------------------- /config/initializers/random_people_images.rb: -------------------------------------------------------------------------------- 1 | Exercism::PeopleImagesPath = Pathname.new("people") 2 | Exercism::PeopleImages = Dir.entries(Rails.root / "app/assets/images" / Exercism::PeopleImagesPath).select { |s| s =~ /.png$/ } 3 | -------------------------------------------------------------------------------- /config/initializers/recaptcha.rb: -------------------------------------------------------------------------------- 1 | Recaptcha.configure do |config| 2 | recaptcha_config = Rails.application.config_for("recaptcha") 3 | config.site_key = recaptcha_config["site_key"] 4 | config.secret_key = recaptcha_config["secret_key"] 5 | end 6 | -------------------------------------------------------------------------------- /config/initializers/routing_constraints.rb: -------------------------------------------------------------------------------- 1 | class CanAccessFlipperUI 2 | def self.matches?(request) 3 | current_user = request.env['warden'].user 4 | 5 | current_user.present? && current_user.admin? 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | Rails.application.config.session_store :cookie_store, key: '_exercism_session', domain: :all, tld_length: 2 2 | #Rails.application.config.session_store :cookie_store, key: '_exercism_session', domain: { 3 | # production: '.exercism.io', 4 | # development: '.localhost:3000' 5 | #}.fetch(Rails.env.to_sym, :all) 6 | -------------------------------------------------------------------------------- /config/initializers/warden_hooks.rb: -------------------------------------------------------------------------------- 1 | Warden::Manager.after_set_user do |user,auth,opts| 2 | scope = opts[:scope] 3 | auth.cookies.signed["#{scope}.id"] = user.id 4 | end 5 | 6 | Warden::Manager.before_logout do |user, auth, opts| 7 | scope = opts[:scope] 8 | auth.cookies.signed["#{scope}.id"] = nil 9 | end 10 | -------------------------------------------------------------------------------- /config/recaptcha.yml: -------------------------------------------------------------------------------- 1 | development: 2 | site_key: 6LeqSrUUAAAAAOkCu13JbNnjoyf_i-mSWypA8Sxv 3 | secret_key: 6LeqSrUUAAAAAJ5B41-vH_3Qcn_LsDC6w1N97DaT 4 | test: 5 | site_key: SITE_KEY 6 | secret_key: SECRET_KEY 7 | -------------------------------------------------------------------------------- /config/selenium.yml: -------------------------------------------------------------------------------- 1 | test: 2 | hub_url: <%= ENV['TESTS_SELENIUM_HUB_URL'] %> 3 | default_host: <%= ENV['TESTS_DEFAULT_HOST'] %> 4 | teams_host: <%= ENV['TESTS_TEAMS_HOST'] ? "http://#{ENV["TESTS_TEAMS_HOST"]}" : "http://teams.lvh.me" %> 5 | research_host: <%= ENV['TESTS_RESEARCH_HOST'] ? "http://#{ENV["TESTS_RESEARCH_HOST"]}" : "http://research.lvh.me" %> 6 | -------------------------------------------------------------------------------- /config/sidekiq.yml: -------------------------------------------------------------------------------- 1 | --- 2 | :concurrency: 1 3 | :queues: 4 | - default 5 | - mailers 6 | -------------------------------------------------------------------------------- /config/skylight.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # The authentication token for the application. 3 | authentication: <%= Rails.application.secrets.skylight_api_key %> 4 | -------------------------------------------------------------------------------- /config/spring.rb: -------------------------------------------------------------------------------- 1 | Spring.watch( 2 | ".ruby-version", 3 | ".rbenv-vars", 4 | "tmp/restart.txt", 5 | "tmp/caching-dev.txt" 6 | ) 7 | -------------------------------------------------------------------------------- /config/webpack/development.js: -------------------------------------------------------------------------------- 1 | process.env.NODE_ENV = process.env.NODE_ENV || 'development' 2 | 3 | const environment = require('./environment') 4 | 5 | module.exports = environment.toWebpackConfig() 6 | -------------------------------------------------------------------------------- /config/webpack/environment.js: -------------------------------------------------------------------------------- 1 | const { environment } = require('@rails/webpacker') 2 | 3 | const webpack = require('webpack'); 4 | environment.plugins.append('Provide', new webpack.ProvidePlugin({ 5 | $: 'jquery', 6 | jQuery: 'jquery' 7 | })); 8 | 9 | module.exports = environment; 10 | -------------------------------------------------------------------------------- /config/webpack/production.js: -------------------------------------------------------------------------------- 1 | process.env.NODE_ENV = process.env.NODE_ENV || 'production' 2 | 3 | const environment = require('./environment') 4 | 5 | module.exports = environment.toWebpackConfig() 6 | -------------------------------------------------------------------------------- /config/webpack/test.js: -------------------------------------------------------------------------------- 1 | process.env.NODE_ENV = process.env.NODE_ENV || 'development' 2 | 3 | const environment = require('./environment') 4 | 5 | module.exports = environment.toWebpackConfig() 6 | -------------------------------------------------------------------------------- /db/migrate/20170516141813_create_iterations.rb: -------------------------------------------------------------------------------- 1 | class CreateIterations < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :iterations do |t| 4 | t.bigint :solution_id, null: false 5 | 6 | t.timestamps 7 | end 8 | 9 | add_foreign_key :iterations, :solutions 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20170630181249_create_auth_tokens.rb: -------------------------------------------------------------------------------- 1 | class CreateAuthTokens < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :auth_tokens do |t| 4 | t.bigint :user_id, null: false 5 | t.string :token, null: false 6 | 7 | t.timestamps 8 | end 9 | 10 | add_foreign_key :auth_tokens, :users 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /db/migrate/20170717120459_create_topics.rb: -------------------------------------------------------------------------------- 1 | class CreateTopics < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :topics do |t| 4 | t.string :name, null: false 5 | t.string :slug, null: false 6 | 7 | t.timestamps 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /db/migrate/20170823065541_create_repo_update.rb: -------------------------------------------------------------------------------- 1 | class CreateRepoUpdate < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :repo_updates do |t| 4 | t.timestamp :synced_at 5 | t.string :slug, null: false 6 | 7 | t.timestamps 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /db/migrate/20170922081639_add_alumnus_to_maintainers.rb: -------------------------------------------------------------------------------- 1 | class AddAlumnusToMaintainers < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :maintainers, :alumnus, :string 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20170922081759_populate_alummus_strings.rb: -------------------------------------------------------------------------------- 1 | class PopulateAlummusStrings < ActiveRecord::Migration[5.1] 2 | def up 3 | Maintainer.find_each do |maintainer| 4 | maintainer.update(alumnus: "alumnus") unless maintainer.active? 5 | end 6 | end 7 | 8 | def down 9 | Maintainer.update_all(alumnus: nil) 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20170922082233_drop_column_active_from_maintainers.rb: -------------------------------------------------------------------------------- 1 | class DropColumnActiveFromMaintainers < ActiveRecord::Migration[5.1] 2 | def change 3 | remove_column :maintainers, :active, :boolean, default: true, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20170923144117_fix_maintainers_with_alumnus_false.rb: -------------------------------------------------------------------------------- 1 | class FixMaintainersWithAlumnusFalse < ActiveRecord::Migration[5.1] 2 | def up 3 | Maintainer.where(alumnus: "0").update_all(alumnus: nil) 4 | end 5 | 6 | def down 7 | raise ActiveRecord::IrreversibleMigration 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20170923211039_set_default_num_contributions_on_contributors.rb: -------------------------------------------------------------------------------- 1 | class SetDefaultNumContributionsOnContributors < ActiveRecord::Migration[5.1] 2 | def change 3 | change_column_default :contributors, :num_contributions, 0 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20170923211552_add_github_id_to_contributors.rb: -------------------------------------------------------------------------------- 1 | class AddGithubIdToContributors < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :contributors, :github_id, :integer 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20170923230700_disallow_null_github_ids_for_contributors.rb: -------------------------------------------------------------------------------- 1 | class DisallowNullGithubIdsForContributors < ActiveRecord::Migration[5.1] 2 | def change 3 | change_column_null(:contributors, :github_id, false) 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171107030936_add_independent_mode_to_user_tracks.rb: -------------------------------------------------------------------------------- 1 | class AddIndependentModeToUserTracks < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :user_tracks, :independent_mode, :boolean, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171107042340_add_mentoring_enabled_to_solutions.rb: -------------------------------------------------------------------------------- 1 | class AddMentoringEnabledToSolutions < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :solutions, :mentoring_enabled, :boolean, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20171230121412_create_teams.rb: -------------------------------------------------------------------------------- 1 | class CreateTeams < ActiveRecord::Migration[5.1] 2 | def change 3 | create_table :teams do |t| 4 | t.string :name, null: false 5 | t.string :slug, null: false 6 | 7 | t.timestamps 8 | end 9 | 10 | add_index :teams, :slug, unique: true 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /db/migrate/20171231162945_add_active_column_to_tracks.rb: -------------------------------------------------------------------------------- 1 | class AddActiveColumnToTracks < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :tracks, :active, :boolean, default: true, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180508121234_add_description_to_teams.rb: -------------------------------------------------------------------------------- 1 | class AddDescriptionToTeams < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :teams, :description, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180613065104_add_token_to_team.rb: -------------------------------------------------------------------------------- 1 | class AddTokenToTeam < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :teams, :token, :string 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180613065447_generate_tokens_for_teams.rb: -------------------------------------------------------------------------------- 1 | class GenerateTokensForTeams < ActiveRecord::Migration[5.1] 2 | def up 3 | Team.find_each do |team| 4 | team.update!(token: SecureRandom::base58) 5 | end 6 | end 7 | 8 | def down 9 | raise ActiveRecord::IrreversibleMigration 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /db/migrate/20180613065754_add_constraints_for_token_column.rb: -------------------------------------------------------------------------------- 1 | class AddConstraintsForTokenColumn < ActiveRecord::Migration[5.1] 2 | def change 3 | change_column_null :teams, :token, false 4 | add_index :teams, :token, unique: true 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20180613074446_add_url_join_allowed_to_teams.rb: -------------------------------------------------------------------------------- 1 | class AddUrlJoinAllowedToTeams < ActiveRecord::Migration[5.1] 2 | def change 3 | add_column :teams, :url_join_allowed, :boolean, null: false, default: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180617190428_constraint_one_solution_per_exercise_per_user.rb: -------------------------------------------------------------------------------- 1 | class ConstraintOneSolutionPerExercisePerUser < ActiveRecord::Migration[5.1] 2 | def change 3 | add_index :solutions, [:exercise_id, :user_id], unique: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180621150555_remove_about_from_tracks.rb: -------------------------------------------------------------------------------- 1 | class RemoveAboutFromTracks < ActiveRecord::Migration[5.1] 2 | def up 3 | remove_column :tracks, :about 4 | end 5 | 6 | def down 7 | add_column :tracks, :about, :string 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20180707132112_add_archived_at_to_user_tracks.rb: -------------------------------------------------------------------------------- 1 | class AddArchivedAtToUserTracks < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :user_tracks, :archived_at, :datetime 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180709140439_allow_no_users_for_discussion_posts.rb: -------------------------------------------------------------------------------- 1 | class AllowNoUsersForDiscussionPosts < ActiveRecord::Migration[5.2] 2 | def change 3 | change_column_null :discussion_posts, :user_id, true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180711154145_persist_legacy_uuid_in_iterations.rb: -------------------------------------------------------------------------------- 1 | class PersistLegacyUuidInIterations < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :iterations, :legacy_uuid, :string, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180713095823_add_uniq_constraint_for_track_mentors.rb: -------------------------------------------------------------------------------- 1 | class AddUniqConstraintForTrackMentors < ActiveRecord::Migration[5.2] 2 | def change 3 | add_index :track_mentorships, [:user_id, :track_id], unique: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180713164812_add_index_to_solutions_uuid.rb: -------------------------------------------------------------------------------- 1 | class AddIndexToSolutionsUuid < ActiveRecord::Migration[5.2] 2 | def change 3 | add_index :solutions, :uuid 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180722190707_add_email_on_solution_approved_to_users.rb: -------------------------------------------------------------------------------- 1 | class AddEmailOnSolutionApprovedToUsers < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :communication_preferences, :email_on_solution_approved, :boolean, default: true, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180723201554_add_edited_to_discussion_post.rb: -------------------------------------------------------------------------------- 1 | class AddEditedToDiscussionPost < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :discussion_posts, :edited, :boolean, default: false, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180723202243_add_previous_content_for_discussion_post.rb: -------------------------------------------------------------------------------- 1 | class AddPreviousContentForDiscussionPost < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :discussion_posts, :previous_content, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180724000822_add_deleted_to_discussion_posts.rb: -------------------------------------------------------------------------------- 1 | class AddDeletedToDiscussionPosts < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :discussion_posts, :deleted, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180725105216_add_indepdendent_mode_to_solutions.rb: -------------------------------------------------------------------------------- 1 | class AddIndepdendentModeToSolutions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :solutions, :independent_mode, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180725115010_add_extra_solutions_indexes.rb: -------------------------------------------------------------------------------- 1 | class AddExtraSolutionsIndexes < ActiveRecord::Migration[5.2] 2 | def change 3 | add_index :solutions, [:num_mentors, :independent_mode, :created_at, :exercise_id], name: "mentor_selection_idx_1" 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180726141241_cache_track_independent_mode_on_solutions.rb: -------------------------------------------------------------------------------- 1 | class CacheTrackIndependentModeOnSolutions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :solutions, :track_in_independent_mode, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180726143058_add_mentor_selection_idx_2.rb: -------------------------------------------------------------------------------- 1 | class AddMentorSelectionIdx2 < ActiveRecord::Migration[5.2] 2 | def change 3 | add_index :solutions, [:num_mentors, :track_in_independent_mode, :created_at, :exercise_id], name: "mentor_selection_idx_2" 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20180905191521_add_dark_code_theme_to_user.rb: -------------------------------------------------------------------------------- 1 | class AddDarkCodeThemeToUser < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :users, :dark_code_theme, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20181003205938_remove_old_mentoring_enabled_flag.rb: -------------------------------------------------------------------------------- 1 | class RemoveOldMentoringEnabledFlag < ActiveRecord::Migration[5.2] 2 | def change 3 | #remove_column :solutions, :mentoring_enabled, :boolean, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20181008220354_add_mentor_flag_to_users.rb: -------------------------------------------------------------------------------- 1 | class AddMentorFlagToUsers < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :users, :is_mentor, :boolean, null: false, default: false 4 | User.where(id: TrackMentorship.distinct.select(:user_id)). 5 | update_all(is_mentor: true) 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20181009215319_ensure_that_mentors_remain_mentors.rb: -------------------------------------------------------------------------------- 1 | class EnsureThatMentorsRemainMentors < ActiveRecord::Migration[5.2] 2 | def change 3 | User.where(id: TrackMentorship.select(:user_id)).update_all(is_mentor: true) 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20181010155830_pause_user_tracks.rb: -------------------------------------------------------------------------------- 1 | class PauseUserTracks < ActiveRecord::Migration[5.2] 2 | def change 3 | rename_column :user_tracks, :archived_at, :paused_at 4 | add_column :solutions, :paused, :boolean, default: false, null: false 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20181101054326_add_active_to_auth_token.rb: -------------------------------------------------------------------------------- 1 | class AddActiveToAuthToken < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :auth_tokens, :active, :boolean, null: false, default: true 4 | add_index :auth_tokens, [:user_id, :active] 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20181122150334_add_token_to_team_invitations.rb: -------------------------------------------------------------------------------- 1 | class AddTokenToTeamInvitations < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :team_invitations, :token, :string, null: true 4 | TeamInvitation.find_each {|ti| ti.update(token: SecureRandom.uuid) } 5 | change_column_null :team_invitations, :token, false 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20181124155843_add_on_profile_and_allow_comments_to_solutions.rb: -------------------------------------------------------------------------------- 1 | class AddOnProfileAndAllowCommentsToSolutions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :solutions, :show_on_profile, :boolean, null: false, default: false 4 | add_column :solutions, :allow_comments, :boolean, null: false, default: false 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20190118215101_add_mentor_reminder_sent_at_to_solution_mentorships.rb: -------------------------------------------------------------------------------- 1 | class AddMentorReminderSentAtToSolutionMentorships < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :solution_mentorships, :mentor_reminder_sent_at, :datetime, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190118221754_add_email_on_remind_mentor_to_communication_preferences.rb: -------------------------------------------------------------------------------- 1 | class AddEmailOnRemindMentorToCommunicationPreferences < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :communication_preferences, "email_on_remind_mentor", :boolean, default: true, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190125193618_add_default_allow_comments_to_users.rb: -------------------------------------------------------------------------------- 1 | class AddDefaultAllowCommentsToUsers < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :users, :default_allow_comments, :boolean, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190126005649_add_solution_counters.rb: -------------------------------------------------------------------------------- 1 | class AddSolutionCounters < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :solutions, :num_comments, :smallint, null: false, default: 0 4 | add_column :solutions, :num_stars, :smallint, null: false, default: 0 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20190126005925_clear_up_legacy.rb: -------------------------------------------------------------------------------- 1 | class ClearUpLegacy < ActiveRecord::Migration[5.2] 2 | def change 3 | # Do this manually after deployment is checked to avoid data loss 4 | return if Rails.env.production? 5 | 6 | #drop_table :reactions 7 | #remove_column :solutions, :num_reactions 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20190212000818_add_image_url_to_blog_posts.rb: -------------------------------------------------------------------------------- 1 | class AddImageUrlToBlogPosts < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :blog_posts, :image_url, :string, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190226131553_add_mentoring_indexes.rb: -------------------------------------------------------------------------------- 1 | class AddMentoringIndexes < ActiveRecord::Migration[5.2] 2 | def change 3 | add_index :solutions, %i{exercise_id approved_by_id completed_at mentoring_requested_at num_mentors id}, name: "mentor_selection_idx_3" 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190302212514_add_email_on_mentor_heartbeat_to_communication_preferences.rb: -------------------------------------------------------------------------------- 1 | class AddEmailOnMentorHeartbeatToCommunicationPreferences < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :communication_preferences, :email_on_mentor_heartbeat, :boolean, null: false, default: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190404193450_add_reminder_sent_at_to_solutions.rb: -------------------------------------------------------------------------------- 1 | class AddReminderSentAtToSolutions < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :solutions, :reminder_sent_at, :datetime, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190404195320_add_email_on_remind_about_solution_to_communication_preferences.rb: -------------------------------------------------------------------------------- 1 | class AddEmailOnRemindAboutSolutionToCommunicationPreferences < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :communication_preferences, :email_on_remind_about_solution, :boolean, null: false, default: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190404201717_add_solution_reminder_sent_at_to_user_email_logs.rb: -------------------------------------------------------------------------------- 1 | class AddSolutionReminderSentAtToUserEmailLogs < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :user_email_logs, :remind_about_solution_sent_at, :datetime, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190626175744_add_type_to_discussion_posts.rb: -------------------------------------------------------------------------------- 1 | class AddTypeToDiscussionPosts < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :discussion_posts, :type, :string, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190627052503_add_median_wait_time_to_exercises.rb: -------------------------------------------------------------------------------- 1 | class AddMedianWaitTimeToExercises < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :exercises, :median_wait_time, :integer 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190628060134_add_median_wait_time_to_tracks.rb: -------------------------------------------------------------------------------- 1 | class AddMedianWaitTimeToTracks < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :tracks, :median_wait_time, :integer 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190703133313_add_website_error_to_iteration_analyses.rb: -------------------------------------------------------------------------------- 1 | class AddWebsiteErrorToIterationAnalyses < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :iteration_analyses, :website_error, :string, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190724042815_add_deleted_at_to_user.rb: -------------------------------------------------------------------------------- 1 | class AddDeletedAtToUser < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :users, :deleted_at, :datetime 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190729064621_add_full_width_code_panes_to_user.rb: -------------------------------------------------------------------------------- 1 | class AddFullWidthCodePanesToUser < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :users, :full_width_code_panes, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190904023937_increase_size_of_previous_content.rb: -------------------------------------------------------------------------------- 1 | class IncreaseSizeOfPreviousContent < ActiveRecord::Migration[5.2] 2 | def change 3 | change_column :discussion_posts, :previous_content, "LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190914171152_rename_analyses_status.rb: -------------------------------------------------------------------------------- 1 | class RenameAnalysesStatus < ActiveRecord::Migration[5.2] 2 | def change 3 | rename_column :iteration_analyses, :status, :ops_status 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190914172312_add_analysis_status_to_analyses.rb: -------------------------------------------------------------------------------- 1 | class AddAnalysisStatusToAnalyses < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :iteration_analyses, :analysis_status, :string, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190914172448_migrate_analysis_statuses.rb: -------------------------------------------------------------------------------- 1 | class MigrateAnalysisStatuses < ActiveRecord::Migration[5.2] 2 | def change 3 | IterationAnalysis.find_each do |ia| 4 | ia.update!(analysis_status: ia.analysis[:status]) 5 | end 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20190923044907_add_may_edit_changelog_to_users.rb: -------------------------------------------------------------------------------- 1 | class AddMayEditChangelogToUsers < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :users, :may_edit_changelog, :boolean, default: false, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190923102032_add_published_at_to_changelog_entries.rb: -------------------------------------------------------------------------------- 1 | class AddPublishedAtToChangelogEntries < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :changelog_entries, :published_at, :datetime 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190926082203_add_details_html_to_changelog_entries.rb: -------------------------------------------------------------------------------- 1 | class AddDetailsHtmlToChangelogEntries < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :changelog_entries, :details_html, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190926090258_add_referenceable_key_to_changelog_entries.rb: -------------------------------------------------------------------------------- 1 | class AddReferenceableKeyToChangelogEntries < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :changelog_entries, :referenceable_key, :string 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20190930041955_add_tweet_copy_to_changelog_entries.rb: -------------------------------------------------------------------------------- 1 | class AddTweetCopyToChangelogEntries < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :changelog_entries, :tweet_copy, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20191010005342_create_changelog_entry_tweet.rb: -------------------------------------------------------------------------------- 1 | class CreateChangelogEntryTweet < ActiveRecord::Migration[5.2] 2 | def change 3 | create_table :changelog_entry_tweets do |t| 4 | t.belongs_to :changelog_entry, null: false 5 | t.text :copy, null: false 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20191010015553_remove_tweet_copy_from_changelog_entry.rb: -------------------------------------------------------------------------------- 1 | class RemoveTweetCopyFromChangelogEntry < ActiveRecord::Migration[5.2] 2 | def change 3 | remove_column :changelog_entries, :tweet_copy, :text 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20191010023224_add_status_to_changelog_entry_tweet.rb: -------------------------------------------------------------------------------- 1 | class AddStatusToChangelogEntryTweet < ActiveRecord::Migration[5.2] 2 | def change 3 | add_column :changelog_entry_tweets, :status, :integer, default: 0, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20191122044056_add_uuid_to_submissions.rb: -------------------------------------------------------------------------------- 1 | class AddUuidToSubmissions < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :submissions, :uuid, :string, null: true 4 | Submission.find_each { |s| s.update(uuid: SecureRandom.uuid) } 5 | change_column_null :submissions, :uuid, false 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20191122044354_add_index_to_submissions_uuid.rb: -------------------------------------------------------------------------------- 1 | class AddIndexToSubmissionsUuid < ActiveRecord::Migration[6.0] 2 | def change 3 | add_index :submissions, :uuid, unique: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20191122045517_add_filenames_to_submissions.rb: -------------------------------------------------------------------------------- 1 | class AddFilenamesToSubmissions < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :submissions, :filenames, :json, null: true 4 | #Submission.update_all(filenames: []) 5 | change_column_null :submissions, :filenames, false 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20191128025739_make_submission_solution_polymorphic.rb: -------------------------------------------------------------------------------- 1 | class MakeSubmissionSolutionPolymorphic < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :submissions, :solution_type, :string, null: true 4 | Submission.update_all(solution_type: "Solution") 5 | change_column_null :submissions, :solution_type, false 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20191128032457_add_index_for_polymorphic_submission_solution.rb: -------------------------------------------------------------------------------- 1 | class AddIndexForPolymorphicSubmissionSolution < ActiveRecord::Migration[6.0] 2 | def change 3 | add_index :submissions, [:solution_type, :solution_id] 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20191129055832_add_initial_experiment.rb: -------------------------------------------------------------------------------- 1 | class AddInitialExperiment < ActiveRecord::Migration[6.0] 2 | def change 3 | Research::Experiment.create!( 4 | title: "How does what you know affect how you code?", 5 | repo_url: "https://github.com/exercism/research_experiment_1" 6 | ) 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /db/migrate/20191129061641_add_joined_research_to_user.rb: -------------------------------------------------------------------------------- 1 | class AddJoinedResearchToUser < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :users, :joined_research, :boolean, null: false, default: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20191129083917_change_joined_research_to_datetime.rb: -------------------------------------------------------------------------------- 1 | class ChangeJoinedResearchToDatetime < ActiveRecord::Migration[6.0] 2 | def change 3 | remove_column :users, :joined_research 4 | add_column :users, :joined_research_at, :datetime 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /db/migrate/20191129093109_make_research_experiment_solutions_uniq.rb: -------------------------------------------------------------------------------- 1 | class MakeResearchExperimentSolutionsUniq < ActiveRecord::Migration[6.0] 2 | def change 3 | add_index :research_experiment_solutions, [:user_id, :experiment_id, :exercise_id], unique: true, name: "research_solutions_uniq" 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20191205051247_increase_test_results_message_size.rb: -------------------------------------------------------------------------------- 1 | class IncreaseTestResultsMessageSize < ActiveRecord::Migration[6.0] 2 | def change 3 | change_column :submission_test_results, :message, :text, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20191205063716_rename_test_results_to_test_run.rb: -------------------------------------------------------------------------------- 1 | class RenameTestResultsToTestRun < ActiveRecord::Migration[6.0] 2 | def change 3 | rename_table :submission_test_results, :submission_test_runs 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20191220152641_allow_test_runner_version_slug_to_be_null.rb: -------------------------------------------------------------------------------- 1 | class AllowTestRunnerVersionSlugToBeNull < ActiveRecord::Migration[6.0] 2 | def change 3 | change_column_null :infrastructure_test_runners, :version_slug, true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200219150933_add_survey_fields_to_experiment_solutions.rb: -------------------------------------------------------------------------------- 1 | class AddSurveyFieldsToExperimentSolutions < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :research_experiment_solutions, :difficulty_rating, :integer, null: true 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200225110803_rename_syntax_highlighter_language.rb: -------------------------------------------------------------------------------- 1 | class RenameSyntaxHighlighterLanguage < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :tracks, :syntax_highlighter_language, :string 4 | 5 | Track.update_all("syntax_highlighter_language = syntax_highligher_language") 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /db/migrate/20200227005918_add_null_check_to_syntax_highlighter_column.rb: -------------------------------------------------------------------------------- 1 | class AddNullCheckToSyntaxHighlighterColumn < ActiveRecord::Migration[6.0] 2 | def change 3 | change_column_null :tracks, :syntax_highlighter_language, false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200318194204_add_survey_to_user_experiments.rb: -------------------------------------------------------------------------------- 1 | class AddSurveyToUserExperiments < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :research_user_experiments, :survey, :json 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200420144100_add_show_v3_patience_modal_to_users.rb: -------------------------------------------------------------------------------- 1 | class AddShowV3PatienceModalToUsers < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :users, :show_v3_patience_modal, :boolean, default: true, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /db/migrate/20200721124114_add_show_introducing_research_modal.rb: -------------------------------------------------------------------------------- 1 | class AddShowIntroducingResearchModal < ActiveRecord::Migration[6.0] 2 | def change 3 | add_column :users, :show_introducing_research_modal, :boolean, default: true, null: false 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /lib/assets/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/lib/assets/.keep -------------------------------------------------------------------------------- /lib/open_source.rb: -------------------------------------------------------------------------------- 1 | module OpenSource 2 | end 3 | 4 | require_relative 'open_source/contribution' 5 | -------------------------------------------------------------------------------- /lib/prism_js.rb: -------------------------------------------------------------------------------- 1 | require "prism_js/theme" 2 | require "prism_js/plugin" 3 | require "prism_js/component" 4 | 5 | module PrismJS 6 | mattr_accessor :cdn 7 | 8 | def self.configure 9 | yield(self) 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /lib/tasks/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/lib/tasks/.keep -------------------------------------------------------------------------------- /lib/tasks/contributors.rake: -------------------------------------------------------------------------------- 1 | namespace :contributors do 2 | task :sync => :environment do 3 | SyncContributors.("/opt/exercism-contributors/contributors.json") 4 | end 5 | end 6 | -------------------------------------------------------------------------------- /lib/tasks/exercises.rake: -------------------------------------------------------------------------------- 1 | namespace :exercises do 2 | desc "Update exercise median wait times" 3 | task :update_median_wait_time => :environment do 4 | ExerciseServices::UpdateMedianWaitTime.() 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /lib/tasks/exercism.rake: -------------------------------------------------------------------------------- 1 | namespace :exercism do 2 | desc 'Initiate exercism website' 3 | task :setup => :environment do 4 | %w(yarn:install db:schema:load db:seed).each do |task| 5 | Rake::Task[task].invoke 6 | end 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /lib/tasks/temporary/bootstrap_users.rake: -------------------------------------------------------------------------------- 1 | namespace :temporary do 2 | desc "Bootstrap users without auth tokens" 3 | task :bootstrap_users => :environment do 4 | users_without_auth_tokens = User.where.not(id: AuthToken.select(:user_id)) 5 | 6 | users_without_auth_tokens.each { |user| BootstrapUser.(account) } 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /lib/tasks/temporary/delete_stale_notifications.rake: -------------------------------------------------------------------------------- 1 | namespace :temporary do 2 | desc "Delete stale notifications about solutions and iterations" 3 | task :delete_stale_notifications => :environment do 4 | puts "Deleting notifications...." 5 | 6 | Temporary::DeleteStaleNotificationsTask.() 7 | 8 | puts "Done" 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /lib/tasks/tracks.rake: -------------------------------------------------------------------------------- 1 | namespace :tracks do 2 | desc "Update track median wait times" 3 | task :update_median_wait_time => :environment do 4 | TrackServices::UpdateMedianWaitTime.() 5 | end 6 | end 7 | -------------------------------------------------------------------------------- /log/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/log/.keep -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require('postcss-import'), 4 | require('postcss-flexbugs-fixes'), 5 | require('postcss-preset-env')({ 6 | autoprefixer: { 7 | flexbox: 'no-2009' 8 | }, 9 | stage: 3 10 | }) 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /public/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/public/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/public/favicon.ico -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: /my/ 3 | -------------------------------------------------------------------------------- /public/sad-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/public/sad-icon.png -------------------------------------------------------------------------------- /test/controllers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/controllers/.keep -------------------------------------------------------------------------------- /test/controllers/api/ping_controller_test.rb: -------------------------------------------------------------------------------- 1 | require_relative './test_base' 2 | 3 | class API::PingControllerTest < API::TestBase 4 | test "should return 200" do 5 | get api_ping_path, as: :json 6 | assert_response 200 7 | end 8 | end 9 | -------------------------------------------------------------------------------- /test/controllers/mentor/analyses_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class Mentor::AnalysesControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/controllers/research/joins_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | module Research 4 | class JoinsControllerTest < ActionDispatch::IntegrationTest 5 | test "redirects to root when not logged in" do 6 | get research_join_url 7 | 8 | assert_redirected_to root_path 9 | end 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /test/controllers/unsubscribe_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class UnsubscribeControllerTest < ActionDispatch::IntegrationTest 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/fixtures/analyzers/foobar_v2.4.json: -------------------------------------------------------------------------------- 1 | { 2 | "release": { 3 | "tag_name": "v2.4" 4 | }, 5 | "repository": { 6 | "name": "foobar-analyzer" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /test/fixtures/analyzers/ruby_v2.4.json: -------------------------------------------------------------------------------- 1 | { 2 | "release": { 3 | "tag_name": "v2.4" 4 | }, 5 | "repository": { 6 | "name": "ruby-analyzer" 7 | } 8 | } 9 | 10 | -------------------------------------------------------------------------------- /test/fixtures/contributions/push_event.to_default_master.json: -------------------------------------------------------------------------------- 1 | { 2 | "ref": "refs/heads/master", 3 | "repository": { 4 | "default_branch": "master" 5 | }, 6 | "sender": { 7 | "login": "carlos", 8 | "id": 3, 9 | "avatar_url": "https://example.com/carlos.png" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /test/fixtures/contributions/push_event.to_non_default_branch.json: -------------------------------------------------------------------------------- 1 | { 2 | "ref": "refs/heads/other-branch", 3 | "repository": { 4 | "default_branch": "master" 5 | }, 6 | "sender": { 7 | "login": "carlos", 8 | "id": 3, 9 | "avatar_url": "https://example.com/carlos.png" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /test/fixtures/contributions/push_event.to_non_default_master.json: -------------------------------------------------------------------------------- 1 | { 2 | "ref": "refs/heads/master", 3 | "repository": { 4 | "default_branch": "production" 5 | }, 6 | "sender": { 7 | "login": "carlos", 8 | "id": 3, 9 | "avatar_url": "https://example.com/carlos.png" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /test/fixtures/contributions/push_event.to_non_standard_default.json: -------------------------------------------------------------------------------- 1 | { 2 | "ref": "refs/heads/production", 3 | "repository": { 4 | "default_branch": "production" 5 | }, 6 | "sender": { 7 | "login": "eu-jin", 8 | "id": 5, 9 | "avatar_url": "https://example.com/eu-jin.png" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/HEAD: -------------------------------------------------------------------------------- 1 | ref: refs/heads/master 2 | -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/config: -------------------------------------------------------------------------------- 1 | [core] 2 | repositoryformatversion = 0 3 | filemode = true 4 | bare = true 5 | ignorecase = true 6 | precomposeunicode = true 7 | -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/description: -------------------------------------------------------------------------------- 1 | Unnamed repository; edit this file 'description' to name the repository. 2 | -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/hooks/post-update.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # An example hook script to prepare a packed repository for use over 4 | # dumb transports. 5 | # 6 | # To enable this hook, rename this file to "post-update". 7 | 8 | exec git update-server-info 9 | -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/info/exclude: -------------------------------------------------------------------------------- 1 | # git ls-files --others --exclude-from=.git/info/exclude 2 | # Lines that start with '#' are comments. 3 | # For a project mostly in C, the following would be a good set of 4 | # exclude patterns (uncomment them if you want to use them): 5 | # *.[oa] 6 | # *~ 7 | -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/09/0a4790033153a078b6bea2ba3ea9145d13f6e2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/09/0a4790033153a078b6bea2ba3ea9145d13f6e2 -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/0e/97b9e845f08c1745e418170c40f09ce1c0d5e6: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/0e/97b9e845f08c1745e418170c40f09ce1c0d5e6 -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/1b/f7bc1973c0f2934bd7f9a99f5f7043618b0c45: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/1b/f7bc1973c0f2934bd7f9a99f5f7043618b0c45 -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/6e/921a663380b3f00a00156fc29894fa523898d4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/6e/921a663380b3f00a00156fc29894fa523898d4 -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/71/4c3bb08b80d545a5b3149ed3c19a924d29f545: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/71/4c3bb08b80d545a5b3149ed3c19a924d29f545 -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/78/155c5e96f8c7fe2234be3677987ac0f055451f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/78/155c5e96f8c7fe2234be3677987ac0f055451f -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/98/eb07d7c4c27caab7a84c6b1d72c462cad5798e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/98/eb07d7c4c27caab7a84c6b1d72c462cad5798e -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/a2/bde10d4b877ee56033d93348c490f9a5e1d0fc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/a2/bde10d4b877ee56033d93348c490f9a5e1d0fc -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/bf/a591caae207edae854b96a591c3946677a6e1d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/bf/a591caae207edae854b96a591c3946677a6e1d -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/c2/609c8c36f90325a0ff08803101ed76fa13bbbc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/c2/609c8c36f90325a0ff08803101ed76fa13bbbc -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/d5/64d0bc3dd917926892c55e3706cc116d5b165e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/d5/64d0bc3dd917926892c55e3706cc116d5b165e -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/e2/ee3db913459632537d11aea11167f94f550c16: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/e2/ee3db913459632537d11aea11167f94f550c16 -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/f2/843dc648280c17a8daae027e47eea4f0a6adda: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/f2/843dc648280c17a8daae027e47eea4f0a6adda -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/f2/d5818bf6922c9b50793588550db3de3e074e16: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/f2/d5818bf6922c9b50793588550db3de3e074e16 -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/fa/09267aa3c80b33ef2a786575af39ec2f61ae78: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/fa/09267aa3c80b33ef2a786575af39ec2f61ae78 -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/fa/d7bb86acc81a4ef04bb9d5f2a9565f8a1bf113: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/fa/d7bb86acc81a4ef04bb9d5f2a9565f8a1bf113 -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/objects/fd/36b65fcd1e02269ed6377ab9b034e31d81d51b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/problem-specifications/objects/fd/36b65fcd1e02269ed6377ab9b034e31d81d51b -------------------------------------------------------------------------------- /test/fixtures/problem-specifications/refs/heads/master: -------------------------------------------------------------------------------- 1 | fad7bb86acc81a4ef04bb9d5f2a9565f8a1bf113 2 | -------------------------------------------------------------------------------- /test/fixtures/research-track/HEAD: -------------------------------------------------------------------------------- 1 | ref: refs/heads/master 2 | -------------------------------------------------------------------------------- /test/fixtures/research-track/config: -------------------------------------------------------------------------------- 1 | [core] 2 | repositoryformatversion = 0 3 | filemode = true 4 | bare = true 5 | ignorecase = true 6 | precomposeunicode = true 7 | -------------------------------------------------------------------------------- /test/fixtures/research-track/description: -------------------------------------------------------------------------------- 1 | Unnamed repository; edit this file 'description' to name the repository. 2 | -------------------------------------------------------------------------------- /test/fixtures/research-track/hooks/post-update.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # An example hook script to prepare a packed repository for use over 4 | # dumb transports. 5 | # 6 | # To enable this hook, rename this file to "post-update". 7 | 8 | exec git update-server-info 9 | -------------------------------------------------------------------------------- /test/fixtures/research-track/info/exclude: -------------------------------------------------------------------------------- 1 | # git ls-files --others --exclude-from=.git/info/exclude 2 | # Lines that start with '#' are comments. 3 | # For a project mostly in C, the following would be a good set of 4 | # exclude patterns (uncomment them if you want to use them): 5 | # *.[oa] 6 | # *~ 7 | -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/0f/0ac527af1401781fb20dc334515c4c5c20fc0f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/0f/0ac527af1401781fb20dc334515c4c5c20fc0f -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/13/19246fd3a92f7234ace86687502aa813b413ca: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/13/19246fd3a92f7234ace86687502aa813b413ca -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/13/33ed77b7e1ed056329cae96075dc558158ee69: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/13/33ed77b7e1ed056329cae96075dc558158ee69 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/15/9d345077fa41615b903e2ce5db6a86d3ddaed3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/15/9d345077fa41615b903e2ce5db6a86d3ddaed3 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/1c/c9af4414b6525f349a984f53373953ccde1010: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/1c/c9af4414b6525f349a984f53373953ccde1010 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/20/eac05f8afee875c326234570004a21416e8f4b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/20/eac05f8afee875c326234570004a21416e8f4b -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/22/94899ab057a543669863a0625a9582504e8ad9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/22/94899ab057a543669863a0625a9582504e8ad9 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/25/f91e9d7c7cdb65b3168db30546a622188fff72: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/25/f91e9d7c7cdb65b3168db30546a622188fff72 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/2b/df5a37d9807b59d39fb803fb05f92ad9b0e572: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/2b/df5a37d9807b59d39fb803fb05f92ad9b0e572 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/32/fd7cce6bd2c140208eb8278f0e7cad5d8084bb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/32/fd7cce6bd2c140208eb8278f0e7cad5d8084bb -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/3a/547cbd2b4b4ca4420546ed282230e415091f6b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/3a/547cbd2b4b4ca4420546ed282230e415091f6b -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/41/1d5412d0f3767dc09aff49a2b89d8706f96bc0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/41/1d5412d0f3767dc09aff49a2b89d8706f96bc0 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/4b/b588a0e159ca543e82ac556ed94fd21bbfb6c0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/4b/b588a0e159ca543e82ac556ed94fd21bbfb6c0 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/64/1d08dbfe5e25912218fde2b7764083ec2872d1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/64/1d08dbfe5e25912218fde2b7764083ec2872d1 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/65/54aa52f55101cb6849016ba29539ddd95db669: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/65/54aa52f55101cb6849016ba29539ddd95db669 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/65/9bcbc2ccc66a326b643905ea6cea1582a6d16b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/65/9bcbc2ccc66a326b643905ea6cea1582a6d16b -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/66/d04cb0578a440b5f4cd518239f0ab1949c9331: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/66/d04cb0578a440b5f4cd518239f0ab1949c9331 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/69/9889275a70f6d09c9b868f17a05f12493f3b10: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/69/9889275a70f6d09c9b868f17a05f12493f3b10 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/6d/9323c9254d319bfe82715b40a70fd4fa0e5343: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/6d/9323c9254d319bfe82715b40a70fd4fa0e5343 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/7a/368780cd482227f702880bf9c6aad3e4488721: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/7a/368780cd482227f702880bf9c6aad3e4488721 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/7d/93c2c33242b65d5fa9182fe5af42bb8941562f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/7d/93c2c33242b65d5fa9182fe5af42bb8941562f -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/7e/af19783ebe51fa0d810e0d54a249372c558a37: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/7e/af19783ebe51fa0d810e0d54a249372c558a37 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/7f/2f0a5c4c0e63f3bc948de589e97b4f817f5346: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/7f/2f0a5c4c0e63f3bc948de589e97b4f817f5346 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/8c/5717073982bfecfcebb031b3bac8851e905d09: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/8c/5717073982bfecfcebb031b3bac8851e905d09 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/8e/868a999c4924e0bef83c2aec45bf67a5948136: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/8e/868a999c4924e0bef83c2aec45bf67a5948136 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/8f/7af03f11f75c52a37479f13d4deec7273d3e33: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/8f/7af03f11f75c52a37479f13d4deec7273d3e33 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/91/5d66ad937403bb5a8fa6ef113a05ea0bacf223: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/91/5d66ad937403bb5a8fa6ef113a05ea0bacf223 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/95/3983a70f2e108b125d00266c1e8b4862877afb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/95/3983a70f2e108b125d00266c1e8b4862877afb -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/95/6700420cca2b9fe0e9d7564639b5acdc3e566a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/95/6700420cca2b9fe0e9d7564639b5acdc3e566a -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/99/423cfd31c4c2de76a6344280f755a6850c09a1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/99/423cfd31c4c2de76a6344280f755a6850c09a1 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/99/77bea9bfe7f75d31503f0fc8b3223ad70770da: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/99/77bea9bfe7f75d31503f0fc8b3223ad70770da -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/9a/cb9af602f6a16e7f715047daa00fce517f95ec: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/9a/cb9af602f6a16e7f715047daa00fce517f95ec -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/a0/f039bc7d39539cdbeb798139a444141e343f1a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/a0/f039bc7d39539cdbeb798139a444141e343f1a -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/a3/29c6c3fc6c9b218aa466f17759b0211b475465: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/a3/29c6c3fc6c9b218aa466f17759b0211b475465 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/a5/e97da82a17ac85547b1a4ca6ae9fba9de205b5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/a5/e97da82a17ac85547b1a4ca6ae9fba9de205b5 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/ab/2b5848c4a4e6b9331546be4afe5acdaee18ec4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/ab/2b5848c4a4e6b9331546be4afe5acdaee18ec4 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/ac/bab3178201eaa8ce1bc34f9041713ec12f883b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/ac/bab3178201eaa8ce1bc34f9041713ec12f883b -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/ae/1ffb2e51c36a4551731fa2733b5e3f2aa99eb7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/ae/1ffb2e51c36a4551731fa2733b5e3f2aa99eb7 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/af/5fb6e1ffdb8602e103ea61674888c4403bb438: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/af/5fb6e1ffdb8602e103ea61674888c4403bb438 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/be/a97d998dff0f1d1ab0aa06ffe5a68b504ac243: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/be/a97d998dff0f1d1ab0aa06ffe5a68b504ac243 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/c1/9f18f95894129cb52f1aaf8907aaca1e71f956: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/c1/9f18f95894129cb52f1aaf8907aaca1e71f956 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/ce/f9845501401a3d4475c0f1d083e79f818953a2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/ce/f9845501401a3d4475c0f1d083e79f818953a2 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/d7/8ad0693ec743d32c31964cfb2790923424d951: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/d7/8ad0693ec743d32c31964cfb2790923424d951 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/da/7f865198c466cae50d6201e28a2564e1b90815: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/da/7f865198c466cae50d6201e28a2564e1b90815 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/db/2f4a7ba542d35402beebb77f8858a62cdbef3e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/db/2f4a7ba542d35402beebb77f8858a62cdbef3e -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/db/eb3af6e8b250a92d22cea6224a2e87f083349d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/db/eb3af6e8b250a92d22cea6224a2e87f083349d -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/e0/6ec23f916c8d0497bdd360caff4001caaa486d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/e0/6ec23f916c8d0497bdd360caff4001caaa486d -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/e0/6eebd05787d64ebba88077653c76a2a374fe93: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/e0/6eebd05787d64ebba88077653c76a2a374fe93 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/e2/9dc5dddba8fd645141b96122d5d0c3a3be097a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/e2/9dc5dddba8fd645141b96122d5d0c3a3be097a -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/e3/6a5ddfd6cfff8a2ddacf2cebf5252d33f4e258: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/e3/6a5ddfd6cfff8a2ddacf2cebf5252d33f4e258 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/e6/73f7a13294e53fedc5f0d7c234cd471a096151: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/e6/73f7a13294e53fedc5f0d7c234cd471a096151 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/ea/ca01e5d345f51f6cf7f9410c09fc1396789c52: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/ea/ca01e5d345f51f6cf7f9410c09fc1396789c52 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/ee/a482b537f780fd6addd28478362c1784bc2907: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/ee/a482b537f780fd6addd28478362c1784bc2907 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/f7/3045954a50158de096d69934615a926907f367: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/f7/3045954a50158de096d69934615a926907f367 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/f7/30668aea082c5003b9e9b75487a74c9aa15327: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/f7/30668aea082c5003b9e9b75487a74c9aa15327 -------------------------------------------------------------------------------- /test/fixtures/research-track/objects/fa/b92db89261a514db4d3b9137e0c6d564b10603: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/research-track/objects/fa/b92db89261a514db4d3b9137e0c6d564b10603 -------------------------------------------------------------------------------- /test/fixtures/research-track/refs/heads/master: -------------------------------------------------------------------------------- 1 | 25f91e9d7c7cdb65b3168db30546a622188fff72 2 | -------------------------------------------------------------------------------- /test/fixtures/server_identity: -------------------------------------------------------------------------------- 1 | hostname 2 | -------------------------------------------------------------------------------- /test/fixtures/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/test.png -------------------------------------------------------------------------------- /test/fixtures/track/HEAD: -------------------------------------------------------------------------------- 1 | ref: refs/heads/master 2 | -------------------------------------------------------------------------------- /test/fixtures/track/config: -------------------------------------------------------------------------------- 1 | [core] 2 | repositoryformatversion = 0 3 | filemode = true 4 | bare = true 5 | ignorecase = true 6 | precomposeunicode = true 7 | -------------------------------------------------------------------------------- /test/fixtures/track/description: -------------------------------------------------------------------------------- 1 | Unnamed repository; edit this file 'description' to name the repository. 2 | -------------------------------------------------------------------------------- /test/fixtures/track/hooks/post-update.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # An example hook script to prepare a packed repository for use over 4 | # dumb transports. 5 | # 6 | # To enable this hook, rename this file to "post-update". 7 | 8 | exec git update-server-info 9 | -------------------------------------------------------------------------------- /test/fixtures/track/info/exclude: -------------------------------------------------------------------------------- 1 | # git ls-files --others --exclude-from=.git/info/exclude 2 | # Lines that start with '#' are comments. 3 | # For a project mostly in C, the following would be a good set of 4 | # exclude patterns (uncomment them if you want to use them): 5 | # *.[oa] 6 | # *~ 7 | -------------------------------------------------------------------------------- /test/fixtures/track/objects/02/9028a44de8c25f923fdd76367143e05d43ba60: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/02/9028a44de8c25f923fdd76367143e05d43ba60 -------------------------------------------------------------------------------- /test/fixtures/track/objects/17/711ac0560ae94d3271ab88fd0d57defd18c6b7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/17/711ac0560ae94d3271ab88fd0d57defd18c6b7 -------------------------------------------------------------------------------- /test/fixtures/track/objects/1b/74a96e731f6cbdb6b8d4c0821384e3f8531e4f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/1b/74a96e731f6cbdb6b8d4c0821384e3f8531e4f -------------------------------------------------------------------------------- /test/fixtures/track/objects/21/5f0497d8e607afeccc4ef4b511df67af399b9b: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/21/5f0497d8e607afeccc4ef4b511df67af399b9b -------------------------------------------------------------------------------- /test/fixtures/track/objects/25/46d82a9b2ba395ff64410ed57415557e00931d: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/25/46d82a9b2ba395ff64410ed57415557e00931d -------------------------------------------------------------------------------- /test/fixtures/track/objects/2d/1669aef9b1cf2160c22dce6511dc6f050c8250: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/2d/1669aef9b1cf2160c22dce6511dc6f050c8250 -------------------------------------------------------------------------------- /test/fixtures/track/objects/3b/717d0e320c11707f3d7706233a6669452f2019: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/3b/717d0e320c11707f3d7706233a6669452f2019 -------------------------------------------------------------------------------- /test/fixtures/track/objects/3f/58c5bc62a3c4b99c304e6d53a122fffc531314: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/3f/58c5bc62a3c4b99c304e6d53a122fffc531314 -------------------------------------------------------------------------------- /test/fixtures/track/objects/41/262ce35ab285460ea4f8ff6d9be143bfefeed9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/41/262ce35ab285460ea4f8ff6d9be143bfefeed9 -------------------------------------------------------------------------------- /test/fixtures/track/objects/42/be0be3de17aed32f7f369960231d9640ae67cb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/42/be0be3de17aed32f7f369960231d9640ae67cb -------------------------------------------------------------------------------- /test/fixtures/track/objects/43/4de04ba21321dd8a2c388dde70fb20221693c3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/43/4de04ba21321dd8a2c388dde70fb20221693c3 -------------------------------------------------------------------------------- /test/fixtures/track/objects/5c/7d3794cfc33780708627c270ee9f83bb36da77: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/5c/7d3794cfc33780708627c270ee9f83bb36da77 -------------------------------------------------------------------------------- /test/fixtures/track/objects/6b/bb9d919d0ebe9be038f4252643ece5878528e1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/6b/bb9d919d0ebe9be038f4252643ece5878528e1 -------------------------------------------------------------------------------- /test/fixtures/track/objects/75/f8f77e2260daf8686bfff76f40ff60201d5f5a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/75/f8f77e2260daf8686bfff76f40ff60201d5f5a -------------------------------------------------------------------------------- /test/fixtures/track/objects/78/d65301e3521173e960b14d7fc27055cd68bad2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/78/d65301e3521173e960b14d7fc27055cd68bad2 -------------------------------------------------------------------------------- /test/fixtures/track/objects/87/fdefed34c1b1d36c696f02ccb35ea783f83407: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/87/fdefed34c1b1d36c696f02ccb35ea783f83407 -------------------------------------------------------------------------------- /test/fixtures/track/objects/90/86a80a54f7622cdb930d2d4cc2f0cc8ed189b8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/90/86a80a54f7622cdb930d2d4cc2f0cc8ed189b8 -------------------------------------------------------------------------------- /test/fixtures/track/objects/93/067d84fbaa10220f5a74a7fa52aa339242aecc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/93/067d84fbaa10220f5a74a7fa52aa339242aecc -------------------------------------------------------------------------------- /test/fixtures/track/objects/96/841d9f86d637de92c8acd35a876ff18612c9c4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/96/841d9f86d637de92c8acd35a876ff18612c9c4 -------------------------------------------------------------------------------- /test/fixtures/track/objects/a4/39f1e2c9c8ef43130de7a3224a27a6b6ea2fd3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/a4/39f1e2c9c8ef43130de7a3224a27a6b6ea2fd3 -------------------------------------------------------------------------------- /test/fixtures/track/objects/ac/87374ecf316b07e8b647b6dffe5782bddb62a8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/ac/87374ecf316b07e8b647b6dffe5782bddb62a8 -------------------------------------------------------------------------------- /test/fixtures/track/objects/ba/2a9feafa09bb9cacd82e7c9df6cf46c21f25df: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/ba/2a9feafa09bb9cacd82e7c9df6cf46c21f25df -------------------------------------------------------------------------------- /test/fixtures/track/objects/bd/ad7fe59b3d85259099123b463ec9cb76442951: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/bd/ad7fe59b3d85259099123b463ec9cb76442951 -------------------------------------------------------------------------------- /test/fixtures/track/objects/c9/b4c44d2933ad5b59830fd0e7f5e025445371b0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/c9/b4c44d2933ad5b59830fd0e7f5e025445371b0 -------------------------------------------------------------------------------- /test/fixtures/track/objects/cc/0be1e56dcbe29142bf4b97265a19afa1698e44: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/cc/0be1e56dcbe29142bf4b97265a19afa1698e44 -------------------------------------------------------------------------------- /test/fixtures/track/objects/d3/04d7e335f23acf9fd2cf310e37d690d075b0c7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/d3/04d7e335f23acf9fd2cf310e37d690d075b0c7 -------------------------------------------------------------------------------- /test/fixtures/track/objects/d9/1e0d4545afeb6a91308e7411715adda4916b2f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/d9/1e0d4545afeb6a91308e7411715adda4916b2f -------------------------------------------------------------------------------- /test/fixtures/track/objects/e0/cdc18e0f05b62ef0c97aeac22043a63b218a08: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/e0/cdc18e0f05b62ef0c97aeac22043a63b218a08 -------------------------------------------------------------------------------- /test/fixtures/track/objects/e3/fd03446ed0c0cdb3c1819bf584857fb956dcaf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/e3/fd03446ed0c0cdb3c1819bf584857fb956dcaf -------------------------------------------------------------------------------- /test/fixtures/track/objects/f4/63de15b377a50b04c1f209dd36d51d7b687c00: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/f4/63de15b377a50b04c1f209dd36d51d7b687c00 -------------------------------------------------------------------------------- /test/fixtures/track/objects/f8/5e2790fa105d9a34150c0fb07d17c1e1bc8e2c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/track/objects/f8/5e2790fa105d9a34150c0fb07d17c1e1bc8e2c -------------------------------------------------------------------------------- /test/fixtures/track/refs/heads/master: -------------------------------------------------------------------------------- 1 | 87fdefed34c1b1d36c696f02ccb35ea783f83407 2 | -------------------------------------------------------------------------------- /test/fixtures/website-copy/HEAD: -------------------------------------------------------------------------------- 1 | ref: refs/heads/master 2 | -------------------------------------------------------------------------------- /test/fixtures/website-copy/config: -------------------------------------------------------------------------------- 1 | [core] 2 | repositoryformatversion = 0 3 | filemode = true 4 | bare = true 5 | ignorecase = true 6 | precomposeunicode = true 7 | -------------------------------------------------------------------------------- /test/fixtures/website-copy/description: -------------------------------------------------------------------------------- 1 | Unnamed repository; edit this file 'description' to name the repository. 2 | -------------------------------------------------------------------------------- /test/fixtures/website-copy/hooks/post-update.sample: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # An example hook script to prepare a packed repository for use over 4 | # dumb transports. 5 | # 6 | # To enable this hook, rename this file to "post-update". 7 | 8 | exec git update-server-info 9 | -------------------------------------------------------------------------------- /test/fixtures/website-copy/info/exclude: -------------------------------------------------------------------------------- 1 | # git ls-files --others --exclude-from=.git/info/exclude 2 | # Lines that start with '#' are comments. 3 | # For a project mostly in C, the following would be a good set of 4 | # exclude patterns (uncomment them if you want to use them): 5 | # *.[oa] 6 | # *~ 7 | -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/0b/67b61278c12c6dc4c80994e3f9791352cf86ad: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/0b/67b61278c12c6dc4c80994e3f9791352cf86ad -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/13/715fb160dbaa535979af0297eb64ae6b49ae50: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/13/715fb160dbaa535979af0297eb64ae6b49ae50 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/19/e2ff5f93714f7e8ff445acc6ef8805e30aab15: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/19/e2ff5f93714f7e8ff445acc6ef8805e30aab15 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/1b/f44e8d16a4cbb0eefa5c732b69cfeb5d53ce46: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/1b/f44e8d16a4cbb0eefa5c732b69cfeb5d53ce46 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/2a/534a44cb4190eaaeba9079b6b642d6ed7180f9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/2a/534a44cb4190eaaeba9079b6b642d6ed7180f9 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/33/b387436631db10d904485f3af0274a253c7dd2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/33/b387436631db10d904485f3af0274a253c7dd2 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/41/323c97e6e885dacc061b1cdea05e938f8cef3f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/41/323c97e6e885dacc061b1cdea05e938f8cef3f -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/50/3e898a14ff4b69ae78a7ab55cc1e5d271c8434: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/50/3e898a14ff4b69ae78a7ab55cc1e5d271c8434 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/59/e7b1500e43d3050384ab45842b1d259df81aa5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/59/e7b1500e43d3050384ab45842b1d259df81aa5 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/5f/91ca5c7038e36c139d450f3ae51cd146a56d00: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/5f/91ca5c7038e36c139d450f3ae51cd146a56d00 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/5f/e6064048e56be449b2e09715fa8ece14c5da77: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/5f/e6064048e56be449b2e09715fa8ece14c5da77 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/61/8044deebb8b559ce3d48e8b19d4cc4080a1f59: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/61/8044deebb8b559ce3d48e8b19d4cc4080a1f59 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/72/6e4ba0e43d1558fe7515cb05f51a1371f6f32f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/72/6e4ba0e43d1558fe7515cb05f51a1371f6f32f -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/74/6c2f0e586e09b63a90807d2d33ecb2dcd294b8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/74/6c2f0e586e09b63a90807d2d33ecb2dcd294b8 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/78/e5903790b4c699fb4c4d040f27a612f598d371: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/78/e5903790b4c699fb4c4d040f27a612f598d371 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/7d/f00f09ef207fd129c33c637fa8f4de1d62653c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/7d/f00f09ef207fd129c33c637fa8f4de1d62653c -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/85/dfe788aa9d1f2c143f1186fd2c4073398e45a9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/85/dfe788aa9d1f2c143f1186fd2c4073398e45a9 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/88/8bd3bf4a79ecbf587372dda690872d8bc8a99f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/88/8bd3bf4a79ecbf587372dda690872d8bc8a99f -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/8a/d671855e0dea6607f7110c7c475b7437e740c2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/8a/d671855e0dea6607f7110c7c475b7437e740c2 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/94/75d54bb0b39a7a5ac15bda1598ba3698a80809: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/94/75d54bb0b39a7a5ac15bda1598ba3698a80809 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/a5/c41adacb01fe3a82c969611c00508de42f4d16: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/a5/c41adacb01fe3a82c969611c00508de42f4d16 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/ab/b95bbcb689bce0fdfc6f3a25a8e5c6918f57af: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/ab/b95bbcb689bce0fdfc6f3a25a8e5c6918f57af -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/b5/31940c492affe90459f9b63cadcb1bed482e68: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/b5/31940c492affe90459f9b63cadcb1bed482e68 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/c9/2d392ab82379839bf651d5371ad4c9f03e1d07: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/c9/2d392ab82379839bf651d5371ad4c9f03e1d07 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/ca/50ddd6ccc492ab5c8badcb9cc87edc5398bd50: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/ca/50ddd6ccc492ab5c8badcb9cc87edc5398bd50 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/d0/083ddd5bee0ae084dcf82c429987fb320bb47f: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/d0/083ddd5bee0ae084dcf82c429987fb320bb47f -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/d5/11ee6a8f2e52f85e623d5182afbabc7ff9816e: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/d5/11ee6a8f2e52f85e623d5182afbabc7ff9816e -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/e1/ed69e8c38e1b02020549d4234f484012bcc513: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/e1/ed69e8c38e1b02020549d4234f484012bcc513 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/e3/8f3a007ecb56138e584fceca4166be22ff10e9: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/e3/8f3a007ecb56138e584fceca4166be22ff10e9 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/e5/ffb5760706ad3683af685eed70d6325c005ed0: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/e5/ffb5760706ad3683af685eed70d6325c005ed0 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/ea/f4faab44d3ee8394fa3ceb5d5ac5916913f3a7: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/ea/f4faab44d3ee8394fa3ceb5d5ac5916913f3a7 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/fb/6709bff97485c35bf8d8aff23b0fd09b9cfff8: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/fb/6709bff97485c35bf8d8aff23b0fd09b9cfff8 -------------------------------------------------------------------------------- /test/fixtures/website-copy/objects/fc/917b42c88bc1ede5b2e96d5daaaab8e7722468: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/fixtures/website-copy/objects/fc/917b42c88bc1ede5b2e96d5daaaab8e7722468 -------------------------------------------------------------------------------- /test/fixtures/website-copy/refs/heads/master: -------------------------------------------------------------------------------- 1 | c92d392ab82379839bf651d5371ad4c9f03e1d07 2 | -------------------------------------------------------------------------------- /test/helpers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/helpers/.keep -------------------------------------------------------------------------------- /test/initalizers/enumerable_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class EnumerableTest < ActiveSupport::TestCase 4 | test "avg" do 5 | assert_equal 2.75, [1,2,3,5].avg 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /test/integration/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/integration/.keep -------------------------------------------------------------------------------- /test/mailers/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/mailers/.keep -------------------------------------------------------------------------------- /test/mailers/previews/team_invite_mailer_preview.rb: -------------------------------------------------------------------------------- 1 | class TeamInviteMailerPreview < ActionMailer::Preview 2 | def new_user 3 | TeamInviteMailer.new_user(TeamInvitation.first) 4 | end 5 | 6 | def existing_user 7 | TeamInviteMailer.existing_user(TeamInvitation.first) 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /test/models/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/models/.keep -------------------------------------------------------------------------------- /test/models/blog_comment_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class BlogCommentTest < ActiveSupport::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/models/cluster_config_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | class ClusterConfigTest < ActiveSupport::TestCase 4 | test "gets the server identity from a file" do 5 | assert_equal "hostname", ClusterConfig.server_identity 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /test/models/factories_test.rb: -------------------------------------------------------------------------------- 1 | require_relative '../test_helper' 2 | 3 | class Factories < ActiveSupport::TestCase 4 | FactoryBot.factories.map(&:name).each do |factory| 5 | test factory.to_s do 6 | RestClient.stubs(:post) 7 | create factory 8 | end 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /test/models/git/blog_repository_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | class Git::BlogRepositoryTest < ActiveSupport::TestCase 4 | # TODO - This needs implementing but I don't understand 5 | # the whole git syncing thing enough to do it, so I've 6 | # smoke tested it locally for now.W 7 | test "retrieves blog post" do 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /test/models/infrastructure/test_runner_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class Infrastructure::TestRunnerTest < ActiveSupport::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/models/infrastructure/test_runner_version_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class Infrastructure::TestRunnerVersionTest < ActiveSupport::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/models/null_track_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | class NullTrackTest < ActiveSupport::TestCase 4 | test "repo returns nil" do 5 | assert_nil NullTrack.new.repo 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /test/models/solution_star_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class SolutionStarTest < ActiveSupport::TestCase 4 | # test "the truth" do 5 | # assert true 6 | # end 7 | end 8 | -------------------------------------------------------------------------------- /test/models/team_membership_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class TeamMembershipTest < ActiveSupport::TestCase 4 | test "returns user name" do 5 | user = create(:user, name: "User") 6 | member = create(:team_membership, user: user) 7 | 8 | assert_equal "User", member.name 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /test/services/git/fetch_repo_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class Git::FetchRepoTest < ActiveSupport::TestCase 4 | test "fetches repo" do 5 | repo = mock() 6 | repo.stubs(:repo_url) 7 | repo.stubs(:head) 8 | 9 | repo.expects(:fetch!) 10 | 11 | Git::FetchRepo.(repo) 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /test/services/git/fetch_repos_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class Git::FetchReposTest < ActiveSupport::TestCase 4 | test "fetches repos" do 5 | repo = mock() 6 | 7 | Git::FetchRepo.expects(:call).with(repo) 8 | Git::FetchRepos.([repo]) 9 | end 10 | end 11 | -------------------------------------------------------------------------------- /test/support/webmock.rb: -------------------------------------------------------------------------------- 1 | require "webmock/minitest" 2 | 3 | WebMock.disable_net_connect!( 4 | allow_localhost: true, 5 | allow: "chromedriver.storage.googleapis.com" 6 | ) 7 | -------------------------------------------------------------------------------- /test/system/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/system/.keep -------------------------------------------------------------------------------- /test/system/teams/test_case.rb: -------------------------------------------------------------------------------- 1 | require "application_system_test_case" 2 | 3 | class Teams::TestCase < ApplicationSystemTestCase 4 | setup do 5 | @original_host = Capybara.app_host 6 | Capybara.app_host = SeleniumHelpers.teams_host 7 | end 8 | 9 | teardown do 10 | Capybara.app_host = @original_host 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /test/tmp/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/test/tmp/.gitkeep -------------------------------------------------------------------------------- /tmp/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/tmp/.keep -------------------------------------------------------------------------------- /vendor/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/exercism/v2-website/c7faf72615cb7e2c28f7e33ab55bb6e1e609f8c8/vendor/.keep --------------------------------------------------------------------------------