diff --git a/.env.sample b/.env.sample index 259daad1..79b142bc 100644 --- a/.env.sample +++ b/.env.sample @@ -1,4 +1,4 @@ MEILI_MASTER_KEY=your local meili master key but in therory meilisearch can run without master key in development mode YOUTUBE_API_KEY=useful for scraping youtube videos but the app can run without it -GITHUB_TOKEN=useful for the profile enhancement feature but the app can run without it +RUBYVIDEO_GITHUB_TOKEN=useful for the profile enhancement feature but the app can run without it OPENAI_ACCESS_TOKEN="change_me" diff --git a/.erb-lint.yml b/.erb-lint.yml new file mode 100644 index 00000000..001ed220 --- /dev/null +++ b/.erb-lint.yml @@ -0,0 +1,27 @@ +--- +EnableDefaultLinters: true +glob: "**/*.{html}{+*,}.erb" +exclude: + - vendor/bundle/**/* + - node_modules/**/* + - tmp/**/* + - log/**/* + +linters: + ErbSafety: + enabled: true + PartialInstanceVariable: + enabled: true + + Rubocop: + enabled: true + rubocop_config: + require: standard + inherit_gem: + standard: config/base.yml + Layout/InitialIndentation: + Enabled: false + Layout/TrailingEmptyLines: + Enabled: false + Lint/UselessAssignment: + Enabled: false diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..cf4e3260 --- /dev/null +++ b/.eslintrc @@ -0,0 +1 @@ +{ "extends": "standard" } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..c888c6e0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,78 @@ +name: linters + +on: + pull_request: + branches: + - "*" + push: + branches: + - main + +concurrency: ci-${{ github.ref }} + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + bundler: default + bundler-cache: true + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: "18" + cache: yarn + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: StandardRB Check + run: bundle exec standardrb + + - name: StandardJS Check + run: yarn standard + + - name: erb-lint Check + run: bundle exec erblint --lint-all + test: + runs-on: ubuntu-latest + env: + RAILS_ENV: test + steps: + - uses: actions/checkout@v3 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + bundler: default + bundler-cache: true + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: "18" + cache: yarn + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build assets + run: bin/vite build --clear --mode=test + + - name: Prepare database + run: | + bin/rails db:create + bin/rails db:schema:load + + - name: Run tests + run: | + bin/rails test + bin/rails test:system + + # - name: Smoke test database seeds + # run: sudo bin/rails db:reset diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index ebb57f27..00000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,57 +0,0 @@ -# name: deploy to production - -# on: -# push: -# branches: [main] - -# jobs: -# build: -# runs-on: ubuntu-latest -# # container: adrienpoly/rails_hetzner_mrsk -# env: -# RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }} -# MRSK_REGISTRY_PASSWORD: ${{ secrets.MRSK_REGISTRY_PASSWORD }} - -# steps: -# - name: Checkout code -# uses: actions/checkout@v3 - -# - name: Set up Ruby -# uses: ruby/setup-ruby@v1 -# with: -# ruby-version: 3.2.0 -# bundler-cache: true - -# - name: Install dependencies -# run: gem install mrsk - -# - uses: webfactory/ssh-agent@v0.7.0 -# with: -# ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - -# - name: Login to DockerHub -# uses: docker/login-action@v2 -# with: -# username: ${{ secrets.DOCKERHUB_USERNAME }} -# password: ${{ secrets.MRSK_REGISTRY_PASSWORD }} - -# - name: Set up QEMU test -# uses: docker/setup-qemu-action@v2 - -# - name: Pull Docker Image -# run: docker pull ${{ secrets.DOCKERHUB_USERNAME }}/rubyvideo || true - -# - name: Set up Docker Buildx. -# uses: docker/setup-buildx-action@v2 - -# - name: Build and push -# uses: docker/build-push-action@v4 -# with: -# context: . -# push: true -# tags: ${{ secrets.DOCKERHUB_USERNAME }}/rubyvideo:latest -# cache-from: type=gha # https://docs.docker.com/build/cache/backends/gha/ -# cache-to: type=gha,mode=max - -# - name: MRSK deploy -# run: mrsk deploy --skip-push diff --git a/.gitignore b/.gitignore index c02798df..9cf06003 100644 --- a/.gitignore +++ b/.gitignore @@ -35,7 +35,7 @@ /node_modules -/script +/script_tmp .env .byebug_history @@ -47,6 +47,13 @@ /data.ms /data_tmp -/meili_data +/data_preparation/**/* +!/data_preparation/organisations.yml /config/credentials/production.key + +test-run-report* + +# Ignore SQLite databases create by Litestack for action cable to be removed once we are able to move them to storage +db/*.db +db/*.db-* diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..dec833ef --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "bradlc.vscode-tailwindcss", + "testdouble.vscode-standard-ruby" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 0a524fac..d87f7d16 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,13 +1,41 @@ { + "editor.detectIndentation": false, + "editor.formatOnPaste": true, "editor.formatOnSave": true, + "editor.minimap.enabled": false, + "editor.multiCursorModifier": "ctrlCmd", + "editor.insertSpaces": true, + "editor.tabSize": 2, + "editor.rulers": [80, 120], + "editor.renderControlCharacters": true, + "editor.snippetSuggestions": "top", + "editor.trimAutoWhitespace": true, + "editor.useTabStops": true, + "editor.scrollBeyondLastLine": true, + "editor.showFoldingControls": "always", + "emmet.triggerExpansionOnTab": true, "emmet.includeLanguages": { + "html.erb": "html", "erb": "html" }, - "emmet.triggerExpansionOnTab": true, + "files.associations": { + "*.html.erb": "erb" + }, "[ruby]": { "editor.defaultFormatter": "testdouble.vscode-standard-ruby" }, "rubyLsp.enabledFeatures": { "diagnostics": false - } + }, + "[javascript]": { + "editor.defaultFormatter": "dbaeumer.vscode-eslint", + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + } + }, + "tailwindCSS.includeLanguages": { + "erb": "html" + }, + "tailwindCSS.emmetCompletions": true, + "tailwindCSS.validate": true } diff --git a/Gemfile b/Gemfile index 699fe5d2..dc2a5987 100644 --- a/Gemfile +++ b/Gemfile @@ -28,7 +28,7 @@ gem "turbo-rails" # gem "cssbundling-rails" # Use Redis adapter to run Action Cable in production -gem "redis", ">= 4.0.1" +# gem "redis", ">= 4.0.1" # Use Kredis to get higher-level data types in Redis [https://github.com/rails/kredis] # gem "kredis" @@ -58,7 +58,7 @@ group :development do gem "web-console" # Add speed badges [https://github.com/MiniProfiler/rack-mini-profiler] - # gem "rack-mini-profiler" + gem "rack-mini-profiler" # Speed up commands on slow machines / big apps [https://github.com/rails/spring] # gem "spring" @@ -66,21 +66,23 @@ group :development do gem "error_highlight", ">= 0.4.0", platforms: [:ruby] gem "ruby-lsp", "~> 0.5.1", require: false gem "standardrb", "~> 1.0" + gem "erb_lint", "~> 0.4.0" gem "authentication-zero", "~> 2.16" end group :test do # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing] gem "capybara" + gem "rails-controller-testing" gem "selenium-webdriver" - gem "webdrivers" gem "vcr", "~> 6.1" gem "webmock" end gem "pagy", "~> 6.0" gem "dockerfile-rails", ">= 1.2", group: :development -gem "litestack", "~> 0.2.3" +gem "litestack" +# gem "litestack", git: "git@github.com:oldmoe/litestack.git", branch: "master" gem "inline_svg", "~> 1.9" gem "net-http", "~> 0.3.2" gem "meilisearch-rails", "~> 0.9.1" @@ -92,3 +94,5 @@ gem "groupdate", "~> 6.2" gem "appsignal", "~> 3.4" gem "ruby-openai" + +gem "chartkick", "~> 5.0" diff --git a/Gemfile.lock b/Gemfile.lock index f308376d..a9d37cf4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -111,6 +111,13 @@ GEM ast (2.4.2) authentication-zero (2.16.29) bcrypt (3.1.18) + better_html (2.0.2) + actionview (>= 6.0) + activesupport (>= 6.0) + ast (~> 2.0) + erubi (~> 1.4) + parser (>= 2.4) + smart_properties bindex (0.8.1) bootsnap (1.16.0) msgpack (~> 1.2) @@ -125,6 +132,7 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) + chartkick (5.0.4) concurrent-ruby (1.2.2) connection_pool (2.4.1) crack (0.4.5) @@ -142,9 +150,16 @@ GEM dotenv (= 2.8.1) railties (>= 3.2) dry-cli (1.0.0) + erb_lint (0.4.0) + activesupport + better_html (>= 2.0.1) + parser (>= 2.7.1.4) + rainbow + rubocop + smart_properties error_highlight (0.5.1) erubi (1.12.0) - faraday (2.7.7) + faraday (2.7.10) faraday-net_http (>= 2.0, < 3.1) ruby2_keywords (>= 0.0.4) faraday-multipart (1.0.4) @@ -227,6 +242,8 @@ GEM nio4r (~> 2.0) racc (1.7.1) rack (3.0.8) + rack-mini-profiler (3.1.1) + rack (>= 1.2.0) rack-proxy (0.7.6) rack rack-session (2.0.0) @@ -236,6 +253,10 @@ GEM rackup (2.1.0) rack (>= 3) webrick (~> 1.8) + rails-controller-testing (1.0.5) + actionpack (>= 5.0.1.rc1) + actionview (>= 5.0.1.rc1) + activesupport (>= 5.0.1.rc1) rails-dom-testing (2.0.3) activesupport (>= 4.2.0) nokogiri (>= 1.6) @@ -244,10 +265,6 @@ GEM nokogiri (~> 1.14) rainbow (3.1.1) rake (13.0.6) - redis (5.0.6) - redis-client (>= 0.9.0) - redis-client (0.14.1) - connection_pool regexp_parser (2.8.0) reline (0.3.5) io-console (~> 0.5) @@ -271,7 +288,7 @@ GEM language_server-protocol (~> 3.17.0) sorbet-runtime syntax_tree (>= 6.1.1, < 7) - ruby-openai (4.1.0) + ruby-openai (5.1.0) faraday (>= 1) faraday-multipart (>= 1) ruby-progressbar (1.13.0) @@ -282,6 +299,7 @@ GEM rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) + smart_properties (1.17.0) sorbet-runtime (0.5.10820) sqlite3 (1.6.2-aarch64-linux) sqlite3 (1.6.2-arm64-darwin) @@ -324,10 +342,6 @@ GEM activemodel (>= 6.0.0) bindex (>= 0.4.0) railties (>= 6.0.0) - webdrivers (5.2.0) - nokogiri (~> 1.6) - rubyzip (>= 1.3.0) - selenium-webdriver (~> 4.0) webmock (3.18.1) addressable (>= 2.8.0) crack (>= 0.3.2) @@ -355,21 +369,24 @@ DEPENDENCIES bootsnap byebug (~> 11.1) capybara + chartkick (~> 5.0) debug dockerfile-rails (>= 1.2) dotenv-rails + erb_lint (~> 0.4.0) error_highlight (>= 0.4.0) groupdate (~> 6.2) inline_svg (~> 1.9) - litestack (~> 0.2.3) + litestack meilisearch-rails (~> 0.9.1) meta-tags (~> 2.18) net-http (~> 0.3.2) pagy (~> 6.0) propshaft puma (>= 5.0) + rack-mini-profiler rails! - redis (>= 4.0.1) + rails-controller-testing ruby-lsp (~> 0.5.1) ruby-openai selenium-webdriver @@ -380,7 +397,6 @@ DEPENDENCIES vcr (~> 6.1) vite_rails (~> 3.0) web-console - webdrivers webmock RUBY VERSION diff --git a/Procfile.dev b/Procfile.dev index 1398191b..cd1f7eff 100644 --- a/Procfile.dev +++ b/Procfile.dev @@ -1,3 +1,3 @@ web: bin/rails server -p 3000 vite: bin/vite dev -search: docker rm -f rubyvideo-meilisearch && docker run --name rubyvideo-meilisearch -p 7700:7700 -v $(pwd)/meili_data:/meili_data getmeili/meilisearch:prototype-vector-store-1 meilisearch --env development --no-analytics --log-level=INFO \ No newline at end of file +search: docker rm -f rubyvideo-meilisearch && docker run --name rubyvideo-meilisearch -p 7700:7700 -v $(pwd)/meili_data:/data.ms getmeili/meilisearch:v1.3.2 meilisearch --env development --no-analytics --log-level=INFO \ No newline at end of file diff --git a/README.md b/README.md index 96d6081d..cc5b2936 100644 --- a/README.md +++ b/README.md @@ -44,25 +44,31 @@ bin/dev https://github.com/adrienpoly/rubyvideo/assets/7847244/64d299bb-dd57-47ee-b6c9-e3e9b430fcfa -Rubyvideo.dev offers experimental support for the Page View Transition API, recently released by Chrome. +Rubyvideo.dev offers experimental support for the Page View Transition API, which was recently released by Chrome. -Enabling page transitions with Turbo started with the addition of the following code: +Initially, Page View Transitions were implemented using custom code. However, the support for page transitions with Turbo is now available through the library [Turn](https://github.com/domchristie/turn). + +To enable page transitions with Turbo, include the following three lines of code: ```js -addEventListener("turbo:before-render", (event) => { - if (document.startViewTransition) { - event.preventDefault(); - - document.startViewTransition(() => { - event.detail.resume(); - }); - } -}); +import Turn from "@domchristie/turn"; +Turn.config.experimental.viewTransitions = true; +Turn.start(); ``` The rest of the implementation was guided by examples you can find here: https://glitch.com/edit/#!/simple-set-demos?path=1-cross-fade%2Fscript.js%3A1%3A0 -Currently, the implementation requires two Stimulus controllers. One controller adds a page transition class to an element on a click (before the navigation), and the other clears the DOM from any remaining `view-transition-name` on the page. It's crucial to ensure there is only one `view-transition-name= the name` per page. Plans are in place to improve this system and potentially remove the latter controller. This feature is still very much experimental. +## Linter + +The CI performs 3 checks: + +- erblint +- standardrb +- standard (js) + +Before committing your code you can run `bin/lint` to detect and potentially autocorrect lint errors. + +To follow Tailwind CSS's recommended order of classes, you can use [Prettier](https://prettier.io/) along with the [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss), both of which are included as devDependencies. This formating is not yet enforced by the CI. ## Code of Conduct diff --git a/app/assets/images/icons/heroicons/solid/heart.svg b/app/assets/images/icons/heroicons/solid/heart.svg new file mode 100644 index 00000000..adf55ff2 --- /dev/null +++ b/app/assets/images/icons/heroicons/solid/heart.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/stylesheets/components/button.css b/app/assets/stylesheets/components/button.css index db6fc74c..05e26542 100644 --- a/app/assets/stylesheets/components/button.css +++ b/app/assets/stylesheets/components/button.css @@ -4,11 +4,11 @@ button[type="submit"], input[type="submit"], [role="button"] { - @apply inline-block rounded-lg transition-all duration-150 ease-in-out bg-brand text-white px-4 py-2 hover:no-underline active:no-underline focus:no-underline cursor-pointer whitespace-nowrap; + @apply inline-block cursor-pointer whitespace-nowrap rounded-lg bg-brand px-4 py-2 text-white transition-all duration-150 ease-in-out hover:no-underline focus:no-underline active:no-underline; text-decoration: none; &.secondary { - @apply text-dark border-2 border-brand-lighter border-solid bg-transparent; + @apply border-2 border-solid border-brand-lighter bg-transparent text-dark; &:hover { @apply shadow; } diff --git a/app/assets/stylesheets/components/nav.css b/app/assets/stylesheets/components/nav.css index 1ee6ffd8..f05eed86 100644 --- a/app/assets/stylesheets/components/nav.css +++ b/app/assets/stylesheets/components/nav.css @@ -1,17 +1,24 @@ @layer components { nav { - @apply flex justify-between px-4 md:px-4 xl:px-8 bg-brand text-white; + @apply flex justify-between bg-brand px-4 text-white md:px-4 xl:px-8; } nav ul { - @apply flex items-center list-none m-0 p-0 gap-8; + @apply m-0 flex list-none items-center gap-8 p-0; } nav li, nav title { - @apply inline-block m-0 py-2; + @apply m-0 inline-block py-2; + div { + @apply invisible border-b-2 border-solid border-white; + } &.active { - @apply border-b-2 border-white border-solid; + @apply relative; + & > div { + view-transition-name: navbar-active; + @apply visible absolute bottom-0 w-full; + } } } @@ -21,13 +28,13 @@ nav a, nav [role="link"] { - @apply inline-block m-0 p-0 rounded-none hover:no-underline active:no-underline focus:no-underline; + @apply m-0 inline-block rounded-none p-0 hover:no-underline focus:no-underline active:no-underline; text-decoration: none; } nav button, nav [role="button"] { - @apply bg-white text-dark hover:no-underline active:no-underline focus:no-underline; + @apply bg-white text-dark hover:no-underline focus:no-underline active:no-underline; text-decoration: none; } } diff --git a/app/assets/stylesheets/components/pagination.css b/app/assets/stylesheets/components/pagination.css index 8faae491..9f119d81 100644 --- a/app/assets/stylesheets/components/pagination.css +++ b/app/assets/stylesheets/components/pagination.css @@ -1,9 +1,9 @@ @layer components { nav.pagy-nav.pagination { - @apply bg-transparent text-dark justify-normal gap-4 sm:gap-8 mx-auto; + @apply mx-auto justify-normal gap-4 bg-transparent text-dark sm:gap-8; .page.active { - @apply text-brand font-semibold; + @apply font-semibold text-brand; } .page.disabled { diff --git a/app/assets/stylesheets/components/transition.css b/app/assets/stylesheets/components/transition.css index 8b7d0fc4..fd939eea 100644 --- a/app/assets/stylesheets/components/transition.css +++ b/app/assets/stylesheets/components/transition.css @@ -10,7 +10,6 @@ } .banner-img .v-vlite { - view-transition-name: banner-img; contain: layout; } @@ -60,3 +59,17 @@ isolation: none; } } + +/* turn annimations */ + +html.turn-advance.turn-exit.turn-no-view-transitions [data-turn-exit] { + animation-name: fade-out; + animation-duration: 0.3s; + animation-fill-mode: forwards; +} + +html.turn-advance.turn-enter.turn-no-view-transitions [data-turn-enter] { + animation-name: fade-in; + animation-duration: 0.3s; + animation-fill-mode: forwards; +} diff --git a/app/assets/stylesheets/components/typography.css b/app/assets/stylesheets/components/typography.css index 85e39874..557f91e3 100644 --- a/app/assets/stylesheets/components/typography.css +++ b/app/assets/stylesheets/components/typography.css @@ -1,6 +1,6 @@ @layer components { body { - @apply text-dark leading-relaxed; + @apply leading-relaxed text-dark; } h1, @@ -16,4 +16,8 @@ p.secondary { @apply text-gray; } + + a.link { + @apply text-brand hover:underline; + } } diff --git a/app/clients/github/client.rb b/app/clients/github/client.rb index 78ea8785..3d26971e 100644 --- a/app/clients/github/client.rb +++ b/app/clients/github/client.rb @@ -5,7 +5,7 @@ class Client < ApplicationClient private def token - ENV["GITHUB_TOKEN"] + ENV["RUBYVIDEO_GITHUB_TOKEN"] end def content_type diff --git a/app/clients/youtube/video.rb b/app/clients/youtube/video.rb new file mode 100644 index 00000000..52ed51ff --- /dev/null +++ b/app/clients/youtube/video.rb @@ -0,0 +1,20 @@ +module Youtube + class Video < Client + def get_statistics(video_id) + path = "/videos" + query = { + part: "statistics", + id: video_id + } + + response = all_items(path, query: query) + + return unless response.present? + + { + view_count: response.first["statistics"]["viewCount"], + like_count: response.first["statistics"]["likeCount"] + } + end + end +end diff --git a/app/controllers/analytics/dashboards_controller.rb b/app/controllers/analytics/dashboards_controller.rb new file mode 100644 index 00000000..87e2104f --- /dev/null +++ b/app/controllers/analytics/dashboards_controller.rb @@ -0,0 +1,15 @@ +class Analytics::DashboardsController < ApplicationController + skip_before_action :authenticate_user! + + def daily_visits + @daily_visits = Rails.cache.fetch("daily_visits", expires_at: Time.current.end_of_day) do + Ahoy::Visit.where("date(started_at) BETWEEN ? AND ?", 60.days.ago.to_date, Date.yesterday).group_by_day(:started_at).count + end + end + + def daily_page_views + @daily_page_views = Rails.cache.fetch("daily_page_views", expires_at: Time.current.end_of_day) do + Ahoy::Event.where("date(time) BETWEEN ? AND ?", 60.days.ago.to_date, Date.yesterday).group_by_day(:time).count + end + end +end diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 6ef9faa4..fa2d5604 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -1,6 +1,6 @@ class EventsController < ApplicationController - skip_before_action :authenticate_user!, only: %i[index show] - before_action :set_event, only: %i[show edit update destroy] + skip_before_action :authenticate_user!, only: %i[index show update] + before_action :set_event, only: %i[show edit update] # GET /events def index @@ -11,50 +11,30 @@ def index def show end - # GET /events/new - def new - @event = Event.new - end - # GET /events/1/edit def edit end - # POST /events - def create - @event = Event.new(event_params) - - if @event.save - redirect_to @event, notice: "Event was successfully created." - else - render :new, status: :unprocessable_entity - end - end - # PATCH/PUT /events/1 def update - if @event.update(event_params) - redirect_to @event, notice: "Event was successfully updated." + suggestion = @event.create_suggestion_from(params: event_params, user: Current.user) + + if suggestion.persisted? + redirect_to event_path(@event), notice: suggestion.notice else render :edit, status: :unprocessable_entity end end - # DELETE /events/1 - def destroy - @event.destroy! - redirect_to events_url, notice: "Event was successfully destroyed.", status: :see_other - end - private # Use callbacks to share common setup or constraints between actions. def set_event - @event = Event.find_by(slug: params[:slug]) + @event = Event.find_by!(slug: params[:slug]) end # Only allow a list of trusted parameters through. def event_params - params.require(:event).permit(:name, :description, :website, :kind, :frequency) + params.require(:event).permit(:name, :city, :country_code) end end diff --git a/app/controllers/speakers_controller.rb b/app/controllers/speakers_controller.rb index be2e2c0b..25efb5dc 100644 --- a/app/controllers/speakers_controller.rb +++ b/app/controllers/speakers_controller.rb @@ -1,6 +1,6 @@ class SpeakersController < ApplicationController skip_before_action :authenticate_user! - before_action :set_speaker, only: %i[show edit update destroy] + before_action :set_speaker, only: %i[show edit update] # GET /speakers def index @@ -16,26 +16,10 @@ def show # fresh_when(@speaker) end - # GET /speakers/new - def new - @speaker = Speaker.new - end - # GET /speakers/1/edit def edit end - # POST /speakers - def create - @speaker = Speaker.new(speaker_params) - - if @speaker.save - redirect_to @speaker, notice: "Speaker was successfully created." - else - render :new, status: :unprocessable_entity - end - end - # PATCH/PUT /speakers/1 def update suggestion = @speaker.create_suggestion_from(params: speaker_params, user: Current.user) @@ -46,17 +30,11 @@ def update end end - # DELETE /speakers/1 - def destroy - @speaker.destroy! - redirect_to speakers_url, notice: "Speaker was successfully destroyed.", status: :see_other - end - private # Use callbacks to share common setup or constraints between actions. def set_speaker - @speaker = Speaker.includes(:talks).find_by(slug: params[:slug]) + @speaker = Speaker.includes(:talks).find_by!(slug: params[:slug]) end # Only allow a list of trusted parameters through. diff --git a/app/controllers/talks_controller.rb b/app/controllers/talks_controller.rb index 2b917990..0973b059 100644 --- a/app/controllers/talks_controller.rb +++ b/app/controllers/talks_controller.rb @@ -1,17 +1,18 @@ class TalksController < ApplicationController include Pagy::Backend skip_before_action :authenticate_user! - before_action :set_talk, only: %i[show edit update destroy] + before_action :set_talk, only: %i[show edit update] # GET /talks def index + session[:talks_page] = params[:page] || 1 @from_talk_id = session[:from_talk_id] session[:from_talk_id] = nil if params[:q].present? talks = Talk.pagy_search(params[:q]) - @pagy, @talks = pagy_meilisearch(talks, items: 9) + @pagy, @talks = pagy_meilisearch(talks, items: 9, page: session[:talks_page]&.to_i || 1) else - @pagy, @talks = pagy(Talk.all.order(date: :desc).includes(:speakers, :event), items: 9) + @pagy, @talks = pagy(Talk.all.order(date: :desc).includes(:speakers, :event), items: 9, page: session[:talks_page]&.to_i || 1) end end @@ -19,7 +20,7 @@ def index def show speaker_slug = params[:speaker_slug] session[:from_talk_id] = @talk.id - @back_path = speaker_slug.present? ? speaker_path(speaker_slug) : talks_path + @back_path = speaker_slug.present? ? speaker_path(speaker_slug, page: session[:talks_page]) : talks_path(page: session[:talks_page]) @talks = Talk.order("RANDOM()").excluding(@talk).limit(6) set_meta_tags(@talk) end @@ -28,17 +29,6 @@ def show def edit end - # POST /talks - def create - @talk = Talk.new(talk_params) - - if @talk.save - redirect_to @talk, notice: "Talk was successfully created." - else - render :new, status: :unprocessable_entity - end - end - # PATCH/PUT /talks/1 def update suggestion = @talk.create_suggestion_from(params: talk_params, user: Current.user) @@ -49,17 +39,13 @@ def update end end - # DELETE /talks/1 - def destroy - @talk.destroy! - redirect_to talks_url, notice: "Talk was successfully destroyed.", status: :see_other - end - private # Use callbacks to share common setup or constraints between actions. def set_talk @talk = Talk.includes(:speakers, :event).find_by(slug: params[:slug]) + + redirect_to talks_path, status: :moved_permanently if @talk.blank? end # Only allow a list of trusted parameters through. diff --git a/app/helpers/icon_helper.rb b/app/helpers/icon_helper.rb index a39ed760..b1298ce1 100644 --- a/app/helpers/icon_helper.rb +++ b/app/helpers/icon_helper.rb @@ -9,9 +9,9 @@ module IconHelper xl: "h-10 w-10" } - def heroicon(icon_name, size: :md, **options) - classes = SIZE_CLASSES[size] - inline_svg_tag "icons/heroicons/outline/#{icon_name.to_s.tr("_", "-")}.svg", class: classes + def heroicon(icon_name, size: :md, variant: :outline, **options) + classes = class_names(SIZE_CLASSES[size], options[:class]) + inline_svg_tag "icons/heroicons/#{variant}/#{icon_name.to_s.tr("_", "-")}.svg", class: classes end def icon(icon_name, size: :md, **options) diff --git a/app/helpers/talks_helper.rb b/app/helpers/talks_helper.rb index 69434fe3..5edbaed4 100644 --- a/app/helpers/talks_helper.rb +++ b/app/helpers/talks_helper.rb @@ -1,7 +1,2 @@ module TalksHelper - def view_transition_style(talk_id:, from_talk_id:, name:) - return unless from_talk_id && talk_id == from_talk_id.to_i - - "view-transition-name: #{name}" - end end diff --git a/app/javascript/controllers/application.js b/app/javascript/controllers/application.js index d6fe5ebe..c030eb8c 100644 --- a/app/javascript/controllers/application.js +++ b/app/javascript/controllers/application.js @@ -1,9 +1,9 @@ -import { Application } from "@hotwired/stimulus"; +import { Application } from '@hotwired/stimulus' -const application = Application.start(); +const application = Application.start() // Configure Stimulus development experience -application.debug = false; -window.Stimulus = application; +application.debug = false +window.Stimulus = application -export { application }; +export { application } diff --git a/app/javascript/controllers/auto_submit_controller.js b/app/javascript/controllers/auto_submit_controller.js index d10b01b1..e374820f 100644 --- a/app/javascript/controllers/auto_submit_controller.js +++ b/app/javascript/controllers/auto_submit_controller.js @@ -1,22 +1,22 @@ -import { Controller } from "@hotwired/stimulus"; -import { useDebounce } from "stimulus-use"; +import { Controller } from '@hotwired/stimulus' +import { useDebounce } from 'stimulus-use' export default class extends Controller { - static debounces = ["submit"]; + static debounces = ['submit'] - initialize() { - useDebounce(this); + initialize () { + useDebounce(this) - this.element.addEventListener("keydown", () => this.submit()); - this.element.addEventListener("search", () => this.submit()); + this.element.addEventListener('keydown', () => this.submit()) + this.element.addEventListener('search', () => this.submit()) } - disconnect() { - this.element.removeEventListener("keydown", () => this.submit()); - this.element.removeEventListener("search", () => this.submit()); + disconnect () { + this.element.removeEventListener('keydown', () => this.submit()) + this.element.removeEventListener('search', () => this.submit()) } - submit() { - this.element.requestSubmit(); + submit () { + this.element.requestSubmit() } } diff --git a/app/javascript/controllers/index.js b/app/javascript/controllers/index.js index c0e98c72..fa48c732 100644 --- a/app/javascript/controllers/index.js +++ b/app/javascript/controllers/index.js @@ -1,5 +1,5 @@ -import { application } from "./application"; -import { registerControllers } from "stimulus-vite-helpers"; +import { application } from './application' +import { registerControllers } from 'stimulus-vite-helpers' -const controllers = import.meta.globEager("./**/*_controller.js"); -registerControllers(application, controllers); +const controllers = import.meta.globEager('./**/*_controller.js') +registerControllers(application, controllers) diff --git a/app/javascript/controllers/page_transition_missing_controller.js b/app/javascript/controllers/page_transition_missing_controller.js index df9a356a..b7e0d898 100644 --- a/app/javascript/controllers/page_transition_missing_controller.js +++ b/app/javascript/controllers/page_transition_missing_controller.js @@ -1,32 +1,32 @@ -import { Controller } from "@hotwired/stimulus"; +import { Controller } from '@hotwired/stimulus' -const ONE_DAY = 24 * 60 * 60 * 1000; // 24 hours in milliseconds +const ONE_DAY = 24 * 60 * 60 * 1000 // 24 hours in milliseconds export default class extends Controller { - connect() { + connect () { if (!document.startViewTransition && !this.isDismissed) { - this.element.classList.remove("hidden"); + this.element.classList.remove('hidden') } } - dismiss() { - this.element.classList.add("hidden"); - this.#setCookie("page_transition_missing_dismissed", "true", 1); + dismiss () { + this.element.classList.add('hidden') + this.#setCookie('page_transition_missing_dismissed', 'true', 1) } - #setCookie(name, value, days) { - const expires = new Date(); - expires.setTime(expires.getTime() + days * ONE_DAY); + #setCookie (name, value, days) { + const expires = new Date() + expires.setTime(expires.getTime() + days * ONE_DAY) document.cookie = name + - "=" + + '=' + encodeURIComponent(value) + - ";expires=" + + ';expires=' + expires.toUTCString() + - ";path=/"; + ';path=/' } - get isDismissed() { - return document.cookie.includes("page_transition_missing_dismissed=true"); + get isDismissed () { + return document.cookie.includes('page_transition_missing_dismissed=true') } } diff --git a/app/javascript/controllers/transition_controller.js b/app/javascript/controllers/transition_controller.js index d743e592..7b320525 100644 --- a/app/javascript/controllers/transition_controller.js +++ b/app/javascript/controllers/transition_controller.js @@ -1,24 +1,25 @@ -import { Controller } from "@hotwired/stimulus"; -import { useTransition } from "stimulus-use"; +import { Controller } from '@hotwired/stimulus' +import { useTransition } from 'stimulus-use' export default class extends Controller { static values = { - enterActive: { type: String, default: "transition ease-in duration-500" }, - enterFrom: { type: String, default: "transform opacity-0" }, - enterTo: { type: String, default: "transform opacity-100" }, - leaveActive: { type: String, default: "transition ease-in duration-300" }, - leaveFrom: { type: String, default: "transform opacity-100" }, - leaveTo: { type: String, default: "transform opacity-0" }, - hiddenClass: { type: String, default: "hidden" }, + enterActive: { type: String, default: 'transition ease-in duration-500' }, + enterFrom: { type: String, default: 'transform opacity-0' }, + enterTo: { type: String, default: 'transform opacity-100' }, + leaveActive: { type: String, default: 'transition ease-in duration-300' }, + leaveFrom: { type: String, default: 'transform opacity-100' }, + leaveTo: { type: String, default: 'transform opacity-0' }, + hiddenClass: { type: String, default: 'hidden' }, transitioned: { type: Boolean, default: false }, removeToClasses: { type: Boolean, default: false }, enterAfter: { type: Number, default: -1 }, - leaveAfter: Number, - }; - static targets = ["content"]; + leaveAfter: Number + } + + static targets = ['content'] - connect() { - if (this.isPreview) return; + connect () { + if (this.isPreview) return useTransition(this, { element: this.elementToTransition, @@ -30,20 +31,20 @@ export default class extends Controller { leaveTo: this.leaveToValue, hiddenClass: this.hiddenClassValue, transitioned: this.transitionedValue, - leaveAfter: this.leaveAfterValue, - }); + leaveAfter: this.leaveAfterValue + }) if (this.enterAfterValue >= 0) { setTimeout(() => { - console.log("enter"); - this.enter(); - }, this.enterAfterValue); + console.log('enter') + this.enter() + }, this.enterAfterValue) } } // getters - get elementToTransition() { - return this.hasContentTarget ? this.contentTarget : this.element; + get elementToTransition () { + return this.hasContentTarget ? this.contentTarget : this.element } } diff --git a/app/javascript/controllers/video_player_controller.js b/app/javascript/controllers/video_player_controller.js index 8f747c3e..076c15e5 100644 --- a/app/javascript/controllers/video_player_controller.js +++ b/app/javascript/controllers/video_player_controller.js @@ -1,20 +1,20 @@ -import { Controller } from "@hotwired/stimulus"; -import "vlitejs/dist/vlite.css"; -import Vlitejs from "vlitejs"; -import VlitejsYoutube from "vlitejs/dist/providers/youtube"; +import { Controller } from '@hotwired/stimulus' +import 'vlitejs/dist/vlite.css' +import Vlitejs from 'vlitejs' +import VlitejsYoutube from 'vlitejs/dist/providers/youtube' -Vlitejs.registerProvider("youtube", VlitejsYoutube); +Vlitejs.registerProvider('youtube', VlitejsYoutube) export default class extends Controller { - static values = { poster: String, src: String, provider: String }; - static targets = ["player"]; + static values = { poster: String, src: String, provider: String } + static targets = ['player'] - connect() { + connect () { this.player = new Vlitejs(this.playerTarget, { - provider: this.hasProviderValue ? this.providerValue : "youtube", + provider: this.hasProviderValue ? this.providerValue : 'youtube', options: { - poster: this.posterValue, - }, - }); + poster: this.posterValue + } + }) } } diff --git a/app/javascript/controllers/view_transition_controller.js b/app/javascript/controllers/view_transition_controller.js deleted file mode 100644 index 5d5ef511..00000000 --- a/app/javascript/controllers/view_transition_controller.js +++ /dev/null @@ -1,16 +0,0 @@ -import { Controller } from "@hotwired/stimulus"; - -export default class extends Controller { - static values = { name: String, fade: Boolean }; - - connect() { - this.element.addEventListener("click", this.click.bind(this)); - } - - async click(event) { - const img = - event.currentTarget.querySelector("img") || - this.element.querySelector("div.video"); - img.style.viewTransitionName = this.nameValue; - } -} diff --git a/app/javascript/controllers/view_transition_page_cleaner_controller.js b/app/javascript/controllers/view_transition_page_cleaner_controller.js deleted file mode 100644 index f56669c7..00000000 --- a/app/javascript/controllers/view_transition_page_cleaner_controller.js +++ /dev/null @@ -1,14 +0,0 @@ -import { Controller } from "@hotwired/stimulus"; - -export default class extends Controller { - connect() { - requestAnimationFrame(() => { - const elementsWithViewTransitionName = document.querySelectorAll( - "[style*='view-transition-name']" - ); - elementsWithViewTransitionName.forEach((element) => { - element.style.viewTransitionName = ""; - }); - }); - } -} diff --git a/app/javascript/entrypoints/application.js b/app/javascript/entrypoints/application.js index b8f1d6d0..1303843b 100644 --- a/app/javascript/entrypoints/application.js +++ b/app/javascript/entrypoints/application.js @@ -1,7 +1,8 @@ // Example: Load Rails libraries in Vite. // -import * as Turbo from "@hotwired/turbo"; -Turbo.start(); +import '@hotwired/turbo-rails' + +import Turn from '@domchristie/turn' // import ActiveStorage from "@rails/activestorage"; // ActiveStorage.start(); @@ -10,26 +11,19 @@ Turbo.start(); // const channels = import.meta.globEager('./**/*_channel.js') // Example: Import a stylesheet in app/frontend/index.css -import "../../assets/stylesheets/application.tailwind.css"; +import '../../assets/stylesheets/application.tailwind.css' -addEventListener("turbo:before-render", (event) => { - if (document.startViewTransition) { - event.preventDefault(); +import '~/controllers' - document.startViewTransition(() => { - event.detail.resume(); - }); - } -}); +// Page transitions +Turn.start() -addEventListener("turbo:before-frame-render", (event) => { +document.addEventListener('turbo:before-frame-render', (event) => { if (document.startViewTransition) { - event.preventDefault(); + event.preventDefault() document.startViewTransition(() => { - event.detail.resume(); - }); + event.detail.resume() + }) } -}); - -import "~/controllers"; +}) diff --git a/app/javascript/entrypoints/chartkick.js b/app/javascript/entrypoints/chartkick.js new file mode 100644 index 00000000..a065c649 --- /dev/null +++ b/app/javascript/entrypoints/chartkick.js @@ -0,0 +1 @@ +import 'chartkick/chart.js' diff --git a/app/models/ahoy/event.rb b/app/models/ahoy/event.rb index 1d9059c1..7e30d802 100644 --- a/app/models/ahoy/event.rb +++ b/app/models/ahoy/event.rb @@ -19,5 +19,5 @@ class Ahoy::Event < ApplicationRecord belongs_to :visit belongs_to :user, optional: true - serialize :properties, JSON + serialize :properties, coder: JSON end diff --git a/app/models/event.rb b/app/models/event.rb index 9c415cf0..836f5c7a 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -15,6 +15,7 @@ # # rubocop:enable Layout/LineLength class Event < ApplicationRecord + include Suggestable include Sluggable slug_from :name diff --git a/app/models/speaker.rb b/app/models/speaker.rb index c957b72d..c84d6260 100644 --- a/app/models/speaker.rb +++ b/app/models/speaker.rb @@ -37,4 +37,17 @@ def github_avatar_url(size: 200) def broadcast_about broadcast_update_to self, target: dom_id(self, :about), partial: "speakers/about", locals: {speaker: self} end + + def valid_website_url + return "#" if website.blank? + + # if it already starts with https://, return as is + return website if website.start_with?("https://") + + # if it starts with http://, convert it to https:// + return website.sub("http://", "https://") if website.start_with?("http://") + + # otherwise, prepend https:// + "https://#{website}" + end end diff --git a/app/models/speaker_talk.rb b/app/models/speaker_talk.rb index ca563f1a..d6e173fa 100644 --- a/app/models/speaker_talk.rb +++ b/app/models/speaker_talk.rb @@ -15,4 +15,6 @@ class SpeakerTalk < ApplicationRecord # associations belongs_to :speaker, counter_cache: :talks_count belongs_to :talk + + validates :speaker_id, uniqueness: {scope: :talk_id} end diff --git a/app/models/talk.rb b/app/models/talk.rb index dc7e5544..7042ff94 100644 --- a/app/models/talk.rb +++ b/app/models/talk.rb @@ -16,6 +16,11 @@ # created_at :datetime not null # updated_at :datetime not null # event_id :integer +# thumbnail_xs :string default(""), not null +# thumbnail_xl :string default(""), not null +# date :date +# like_count :integer +# view_count :integer # # rubocop:enable Layout/LineLength class Talk < ApplicationRecord diff --git a/app/views/analytics/dashboards/daily_page_views.html.erb b/app/views/analytics/dashboards/daily_page_views.html.erb new file mode 100644 index 00000000..361ebd6f --- /dev/null +++ b/app/views/analytics/dashboards/daily_page_views.html.erb @@ -0,0 +1,4 @@ +<%= turbo_frame_tag "daily_page_views" do %> +

Daily page views

+ <%= area_chart @daily_page_views, id: :daily_page_views_chart %> +<% end %> diff --git a/app/views/analytics/dashboards/daily_visits.html.erb b/app/views/analytics/dashboards/daily_visits.html.erb new file mode 100644 index 00000000..1e7e1712 --- /dev/null +++ b/app/views/analytics/dashboards/daily_visits.html.erb @@ -0,0 +1,4 @@ +<%= turbo_frame_tag "daily_visits" do %> +

Daily visits

+ <%= area_chart @daily_visits, id: :daily_visits_chart %> +<% end %> diff --git a/app/views/analytics/dashboards/show.html.erb b/app/views/analytics/dashboards/show.html.erb new file mode 100644 index 00000000..6c4b1daf --- /dev/null +++ b/app/views/analytics/dashboards/show.html.erb @@ -0,0 +1,13 @@ + +<% content_for :head do %> + <%= vite_javascript_tag "chartkick" %> +<% end %> + +
+

Open analytics

+ +
+ <%= turbo_frame_tag "daily_visits", src: daily_visits_analytics_dashboards_path, lazy: true %> + <%= turbo_frame_tag "daily_page_views", src: daily_page_views_analytics_dashboards_path, lazy: true %> +
+
diff --git a/app/views/events/_event.html.erb b/app/views/events/_event.html.erb index 087dc933..e32675f9 100644 --- a/app/views/events/_event.html.erb +++ b/app/views/events/_event.html.erb @@ -26,7 +26,7 @@ <% if action_name != "show" %> <%= link_to "Show this event", event, class: "rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> - <%= link_to 'Edit this event', edit_event_path(event), class: "rounded-lg py-3 ml-2 px-5 bg-gray-100 inline-block font-medium" %> + <%= link_to "Edit this event", edit_event_path(event), class: "rounded-lg py-3 ml-2 px-5 bg-gray-100 inline-block font-medium" %>
<% end %> diff --git a/app/views/events/index.html.erb b/app/views/events/index.html.erb index 06048e0e..30dc83ab 100644 --- a/app/views/events/index.html.erb +++ b/app/views/events/index.html.erb @@ -5,7 +5,6 @@

Events

- <%= link_to 'New event', new_event_path, class: "rounded-lg py-3 px-5 bg-blue-600 text-white block font-medium" %>
diff --git a/app/views/events/new.html.erb b/app/views/events/new.html.erb index 7120ec4b..dc49c08a 100644 --- a/app/views/events/new.html.erb +++ b/app/views/events/new.html.erb @@ -3,5 +3,5 @@ <%= render "form", event: @event %> - <%= link_to 'Back to events', events_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%= link_to "Back to events", events_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb index 7517a6ea..4e0cca34 100644 --- a/app/views/events/show.html.erb +++ b/app/views/events/show.html.erb @@ -6,6 +6,6 @@ <%= render @event %> - <%= link_to 'Back to events', events_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%= link_to "Back to events", events_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index b3e0d8e4..b27d3578 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -2,15 +2,15 @@ - <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= display_meta_tags site: "Ruby Video" %> <%= vite_client_tag %> - <%= vite_javascript_tag 'application' %> - <%= vite_stylesheet_tag 'application.css' %> + <%= vite_javascript_tag "application" %> + <%= vite_stylesheet_tag "application.css" %> + <%= yield :head %> @@ -20,5 +20,6 @@
<%= yield %>
+ <%= render "shared/footer" %> diff --git a/app/views/page/home.html.erb b/app/views/page/home.html.erb index 73534b5d..42505e89 100644 --- a/app/views/page/home.html.erb +++ b/app/views/page/home.html.erb @@ -21,7 +21,7 @@ <%= link_to talks_path, class: "button" do %> Explore talks <% end %> - <%= link_to "https://github.com/adrienpoly/rubyvideo/blob/main/docs/contributing.md", target: "_blank" ,class: "button secondary flex items-center gap-2" do %> + <%= link_to "https://github.com/adrienpoly/rubyvideo/blob/main/docs/contributing.md", target: "_blank", class: "button secondary flex items-center gap-2" do %> Enriching this database <% end %> @@ -30,46 +30,41 @@
<%= image_tag @speakers_avatar_url[0].first, - alt: "picture profile of #{@speakers_avatar_url[0]}", - srcset: ["#{@speakers_avatar_url[0].second} 2x"], - class: "aspect-[2/3] w-full rounded-xl bg-gray-900/5 object-cover shadow-lg" - %> + alt: "picture profile of #{@speakers_avatar_url[0]}", + srcset: ["#{@speakers_avatar_url[0].second} 2x"], + class: "aspect-[2/3] w-full rounded-xl bg-gray-900/5 object-cover shadow-lg" %>
<%= image_tag @speakers_avatar_url[1].first, - alt: "picture profile of #{@speakers_avatar_url[1]}", - srcset: ["#{@speakers_avatar_url[1].second} 2x"], - class: "aspect-[2/3] w-full rounded-xl bg-gray-900/5 object-cover shadow-lg" - %> + alt: "picture profile of #{@speakers_avatar_url[1]}", + srcset: ["#{@speakers_avatar_url[1].second} 2x"], + class: "aspect-[2/3] w-full rounded-xl bg-gray-900/5 object-cover shadow-lg" %>
<%= image_tag @speakers_avatar_url[2].first, - alt: "picture profile of #{@speakers_avatar_url[2]}", - srcset: ["#{@speakers_avatar_url[2].second} 2x"], - class: "aspect-[2/3] w-full rounded-xl bg-gray-900/5 object-cover shadow-lg" - %> + alt: "picture profile of #{@speakers_avatar_url[2]}", + srcset: ["#{@speakers_avatar_url[2].second} 2x"], + class: "aspect-[2/3] w-full rounded-xl bg-gray-900/5 object-cover shadow-lg" %>
<%= image_tag @speakers_avatar_url[3].first, - alt: "picture profile of #{@speakers_avatar_url[3]}", - srcset: ["#{@speakers_avatar_url[3].second} 2x"], - class: "aspect-[2/3] w-full rounded-xl bg-gray-900/5 object-cover shadow-lg" - %> + alt: "picture profile of #{@speakers_avatar_url[3]}", + srcset: ["#{@speakers_avatar_url[3].second} 2x"], + class: "aspect-[2/3] w-full rounded-xl bg-gray-900/5 object-cover shadow-lg" %>
<%= image_tag @speakers_avatar_url[4].first, - alt: "picture profile of #{@speakers_avatar_url[4]}", - srcset: ["#{@speakers_avatar_url[4].second} 2x"], - class: "aspect-[2/3] w-full rounded-xl bg-gray-900/5 object-cover shadow-lg" - %> + alt: "picture profile of #{@speakers_avatar_url[4]}", + srcset: ["#{@speakers_avatar_url[4].second} 2x"], + class: "aspect-[2/3] w-full rounded-xl bg-gray-900/5 object-cover shadow-lg" %>
@@ -79,4 +74,3 @@ - diff --git a/app/views/page/uses.html.erb b/app/views/page/uses.html.erb new file mode 100644 index 00000000..e69de29b diff --git a/app/views/sessions/new.html.erb b/app/views/sessions/new.html.erb index e8e38152..701b9d03 100644 --- a/app/views/sessions/new.html.erb +++ b/app/views/sessions/new.html.erb @@ -21,7 +21,6 @@
-
diff --git a/app/views/shared/_footer.html.erb b/app/views/shared/_footer.html.erb new file mode 100644 index 00000000..4bff8c01 --- /dev/null +++ b/app/views/shared/_footer.html.erb @@ -0,0 +1,21 @@ + diff --git a/app/views/shared/_navbar.html.erb b/app/views/shared/_navbar.html.erb index bff37810..8d2b068b 100644 --- a/app/views/shared/_navbar.html.erb +++ b/app/views/shared/_navbar.html.erb @@ -7,25 +7,17 @@ diff --git a/app/views/shared/navbar/_link.html.erb b/app/views/shared/navbar/_link.html.erb new file mode 100644 index 00000000..159f2442 --- /dev/null +++ b/app/views/shared/navbar/_link.html.erb @@ -0,0 +1,5 @@ +<% active = current_page?(path) %> +<%= content_tag :li, class: class_names(active: active) do %> + <%= link_to link_title, path %> + <%= content_tag :div, "", data: {turn_exit: !active.to_s, turn_enter: active.to_s} %> +<% end %> diff --git a/app/views/speakers/_about.html.erb b/app/views/speakers/_about.html.erb index 395531fd..e663c941 100644 --- a/app/views/speakers/_about.html.erb +++ b/app/views/speakers/_about.html.erb @@ -11,7 +11,7 @@ <% end %> <% if speaker.website.present? %> - Website: <%= link_to speaker.website, speaker.website, target: "_blank" %> + Website: <%= link_to speaker.website, speaker.valid_website_url, target: "_blank" %> <% end %> <% if speaker.bio.present? %> diff --git a/app/views/speakers/edit.html.erb b/app/views/speakers/edit.html.erb index dd00914f..6e2e33dd 100644 --- a/app/views/speakers/edit.html.erb +++ b/app/views/speakers/edit.html.erb @@ -1,5 +1,5 @@ -
-

Editing speaker

+
+

Editing speaker

<%= render "form", speaker: @speaker %>
diff --git a/app/views/speakers/index.html.erb b/app/views/speakers/index.html.erb index 931f3cf3..0b0f7af8 100644 --- a/app/views/speakers/index.html.erb +++ b/app/views/speakers/index.html.erb @@ -1,7 +1,5 @@ -<%= cache @speakers do %> -
-
- <%= render @speakers, cache: true %> -
+
+
+ <%= render @speakers %>
-<% end %> +
diff --git a/app/views/speakers/new.html.erb b/app/views/speakers/new.html.erb index 03e7de30..e2138565 100644 --- a/app/views/speakers/new.html.erb +++ b/app/views/speakers/new.html.erb @@ -3,5 +3,5 @@ <%= render "form", speaker: @speaker %> - <%= link_to 'Back to speakers', speakers_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%= link_to "Back to speakers", speakers_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
diff --git a/app/views/speakers/show.html.erb b/app/views/speakers/show.html.erb index 38211dda..149a7170 100644 --- a/app/views/speakers/show.html.erb +++ b/app/views/speakers/show.html.erb @@ -3,10 +3,9 @@
<% if @speaker.github.present? %> <%= image_tag @speaker.github_avatar_url(size: 200), - class: "rounded-full mx-auto", - alt: "Github picture profile of #{@speaker.github}", - loading: :lazy - %> + class: "rounded-full mx-auto", + alt: "Github picture profile of #{@speaker.github}", + loading: :lazy %> <% end %>

<%= @speaker.name %>

<%= render "speakers/about", speaker: @speaker %> @@ -18,7 +17,7 @@
<% end %> <% if Current.user&.admin? %> - <%= button_to 'fetch from Github', speakers_enhance_path(@speaker), method: :patch, class: "button" %> + <%= button_to "fetch from Github", speakers_enhance_path(@speaker), method: :patch, class: "button" %> <% end %>
@@ -26,13 +25,13 @@
<%= render partial: "talks/card", - collection: @talks, - as: :talk, - locals: { - picture_profile: false, - from_talk_id: @from_talk_id, - speaker_slug: @speaker.slug - } %> + collection: @talks, + as: :talk, + locals: { + picture_profile: false, + from_talk_id: @from_talk_id, + speaker_slug: @speaker.slug + } %>
diff --git a/app/views/talks/_card.html.erb b/app/views/talks/_card.html.erb index 289d00b5..53681d69 100644 --- a/app/views/talks/_card.html.erb +++ b/app/views/talks/_card.html.erb @@ -1,37 +1,48 @@
- <%= link_to talk_path(talk, speaker_slug: local_assigns.fetch(:speaker_slug, nil)), class: "flex aspect-video", data: { controller: "view-transition", view_transition_name_value: "banner-img" } do %> + <%= link_to talk_path(talk, speaker_slug: local_assigns.fetch(:speaker_slug, nil)), class: "flex aspect-video" do %> <%= image_tag talk.thumbnail_sm, - srcset: ["#{talk.thumbnail_lg} 2x"], - id: dom_id(talk), - height: 174, - width: 310, - alt: "talk by #{talk.speakers.join(", ")}: #{talk.title}", - style: view_transition_style(talk_id: talk.id, from_talk_id: local_assigns.fetch(:from_talk_id, nil), name: "banner-img"), - class: "rounded-lg w-full object-cover" - %> + srcset: ["#{talk.thumbnail_lg} 2x"], + id: dom_id(talk), + height: 174, + width: 310, + alt: "talk by #{talk.speakers.join(", ")}: #{talk.title}", + style: "view-transition-name: #{dom_id(talk, :image)}", + class: "rounded-lg w-full object-cover" %> <% end %>
<% if talk.speakers.last&.github&.present? && local_assigns.fetch(:picture_profile, true) %> <%= image_tag talk.speakers.last.github_avatar_url(size: 64), - class: "rounded-full w-8 h-8 mr-2", - alt: "Github picture profile of #{talk.speakers.last.github}", - loading: :lazy - %> + class: "rounded-full w-8 h-8 mr-2 mt-1", + alt: "Github picture profile of #{talk.speakers.last.github}", + loading: :lazy %> <% end %>
<%= link_to talk do %> - <%= content_tag :h2, talk.title, class: "py-2 text-base" %> + <%= content_tag :h2, talk.title, class: "text-base" %> <% end %>
<% if talk.event %> +
+ <%= heroicon :map_pin, size: :sm, class: "shrink-0 grow-0" %> + <%= content_tag :div, talk.event.name %> +
<%#= link_to talk.event.name, talk.event %> - <%= content_tag :div, talk.event.name %> - <% end %> - <% talk.speakers.each do |speaker| %> - <%= link_to speaker.name, speaker_path(speaker) %> <% end %> + +
+ <% if talk.speakers.length > 1 %> + <%= heroicon :users, size: :sm, class: "shrink-0 grow-0 my-1" %> + <% elsif talk.speakers.length == 1 %> + <%= heroicon :user, size: :sm, class: "shrink-0 grow-0 my-1" %> + <% end %> + +
+ <% speaker_names = talk.speakers.shuffle.map { |speaker| link_to speaker.name, speaker_path(speaker) } %> + <%= sanitize speaker_names.join(", ") %> +
+
diff --git a/app/views/talks/_card_horizontal.html.erb b/app/views/talks/_card_horizontal.html.erb index 49c705f4..2d21bcd9 100644 --- a/app/views/talks/_card_horizontal.html.erb +++ b/app/views/talks/_card_horizontal.html.erb @@ -2,12 +2,8 @@
<%= link_to talk_path(talk), - class: "flex aspect-video shrink-0 relative", - data: { - controller: "view-transition", - view_transition_name_value: "card-horizontal-img" - } do %> - <%= image_tag talk.thumbnail_sm, srcset: ["#{talk.thumbnail_lg} 2x"], id: dom_id(talk), class: "w-full h-auto object-cover", loading: :lazy %> + class: "flex aspect-video shrink-0 relative" do %> + <%= image_tag talk.thumbnail_sm, srcset: ["#{talk.thumbnail_lg} 2x"], id: dom_id(talk), class: "w-full h-auto object-cover", style: "view-transition-name: #{dom_id(talk, :image)}", loading: :lazy %> <% end %> <%= content_tag :div, talk.title, class: "text-sm text-gray line-clamp-2 mt-1" %>
diff --git a/app/views/talks/_form.html.erb b/app/views/talks/_form.html.erb index 40de76ba..01c87e08 100644 --- a/app/views/talks/_form.html.erb +++ b/app/views/talks/_form.html.erb @@ -28,6 +28,6 @@
<%= form.submit "Suggest modifications" %> - <%= link_to "Cancel", @talk, class: "tertiary", role: "button" %> + <%= link_to "Cancel", talk, class: "tertiary", role: "button" %>
<% end %> diff --git a/app/views/talks/_talk.html.erb b/app/views/talks/_talk.html.erb index 1e9a055f..6825a223 100644 --- a/app/views/talks/_talk.html.erb +++ b/app/views/talks/_talk.html.erb @@ -1,24 +1,21 @@ <%= content_tag :div, id: dom_id(talk) do %>
> + class: "aspect-video banner-img card-horizontal-img relative", + style: "view-transition-name: #{dom_id(talk, :image)}", + data: { + controller: "video-player", + video_player_poster_value: talk.thumbnail_lg, + video_player_provider_value: "youtube", + video_player_src_value: talk.video_id + } + ) %>> <%= content_tag :div, "", - class: "image", - id: dom_id(talk, :youtube), - data: { video_player_target: "player", - youtube_id: talk.video_id - } %> + class: "image", + id: dom_id(talk, :youtube), + data: {video_player_target: "player", + youtube_id: talk.video_id} %>
@@ -43,7 +40,7 @@ <% if action_name != "show" %> <%= link_to "Show this talk", talk, class: "rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> - <%= link_to 'Edit this talk', edit_talk_path(talk), class: "rounded-lg py-3 ml-2 px-5 bg-gray-100 inline-block font-medium" %> + <%= link_to "Edit this talk", edit_talk_path(talk), class: "rounded-lg py-3 ml-2 px-5 bg-gray-100 inline-block font-medium" %> <% end %>
<% end %> diff --git a/app/views/talks/edit.html.erb b/app/views/talks/edit.html.erb index b929a934..f9a78a91 100644 --- a/app/views/talks/edit.html.erb +++ b/app/views/talks/edit.html.erb @@ -1,5 +1,5 @@ -
-

Suggest modification to this talk

+
+

Suggest modification to this talk

<%= render "form", talk: @talk %>
diff --git a/app/views/talks/index.html.erb b/app/views/talks/index.html.erb index 8f67d00c..ccab3378 100644 --- a/app/views/talks/index.html.erb +++ b/app/views/talks/index.html.erb @@ -1,16 +1,16 @@

Talks

- <%= form_with url: talks_path, method: :get, data: { controller: "auto-submit", turbo_frame: "talks", turbo_action: "advance" } do |form| %> + <%= form_with url: talks_path, method: :get, data: {controller: "auto-submit", turbo_frame: "talks", turbo_action: "advance"} do |form| %> <%= form.search_field :q, placeholder: "Search a talk (experimental)", class: "w-full" %> <% end %> <%= turbo_frame_tag "talks", target: "_top" do %> - diff --git a/app/views/talks/new.html.erb b/app/views/talks/new.html.erb index 2012c065..15ebc8a7 100644 --- a/app/views/talks/new.html.erb +++ b/app/views/talks/new.html.erb @@ -3,5 +3,5 @@ <%= render "form", talk: @talk %> - <%= link_to 'Back to talks', talks_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %> + <%= link_to "Back to talks", talks_path, class: "ml-2 rounded-lg py-3 px-5 bg-gray-100 inline-block font-medium" %>
diff --git a/app/views/talks/show.html.erb b/app/views/talks/show.html.erb index 7d426b3c..a87fa15b 100644 --- a/app/views/talks/show.html.erb +++ b/app/views/talks/show.html.erb @@ -11,12 +11,12 @@ <%= link_to edit_talk_path(@talk), class: "button secondary" do %>
<%= heroicon :pencil_square %> - edit + Edit
<% end %>
diff --git a/bin/lint b/bin/lint new file mode 100755 index 00000000..779f7e0a --- /dev/null +++ b/bin/lint @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +# Exit when any command fails +set -e + +# Check Ruby code formatting +echo "Checking Ruby code formatting..." +bundle exec standardrb --fix + +# Check Ruby code formatting +echo "Checking JS code formatting..." +yarn standard --fix + +# Check erb file formatting +echo "Checking erb file formatting..." +bundle exec erblint --lint-all --autocorrect diff --git a/channel.yaml b/channel.yaml deleted file mode 100644 index cce3eb59..00000000 --- a/channel.yaml +++ /dev/null @@ -1,258 +0,0 @@ ---- -kind: youtube#playlistListResponse -etag: CtacY4ocyOm58xxNEtV1N-AoXXk -pageInfo: - totalResults: 7 - resultsPerPage: 25 -items: -- kind: youtube#playlist - etag: _R_8vKTF7Ejsc3T_ENs8eYvxu0Y - id: PLbHJudTY1K0dERpqJUEFOFSsMGvR6st9U - snippet: - publishedAt: '2023-01-10T00:59:25Z' - channelId: UCpFXaEz3vKJ45XjW5m5pbow - title: 'RubyConf 2022: Mini and Houston' - description: Recordings of the RubyConf 2022 Houston and Mini conferences. - thumbnails: - default: - url: https://i.ytimg.com/vi/1GorXHiB7nw/default.jpg - width: 120 - height: 90 - medium: - url: https://i.ytimg.com/vi/1GorXHiB7nw/mqdefault.jpg - width: 320 - height: 180 - high: - url: https://i.ytimg.com/vi/1GorXHiB7nw/hqdefault.jpg - width: 480 - height: 360 - standard: - url: https://i.ytimg.com/vi/1GorXHiB7nw/sddefault.jpg - width: 640 - height: 480 - maxres: - url: https://i.ytimg.com/vi/1GorXHiB7nw/maxresdefault.jpg - width: 1280 - height: 720 - channelTitle: Ruby Central - localized: - title: 'RubyConf 2022: Mini and Houston' - description: Recordings of the RubyConf 2022 Houston and Mini conferences. - contentDetails: - itemCount: 80 -- kind: youtube#playlist - etag: nfiPIAnH9rS_t4qWyt7jHtf1QOo - id: PLbHJudTY1K0f1WgIbKCc0_M-XMraWwCmk - snippet: - publishedAt: '2022-06-01T22:18:58Z' - channelId: UCpFXaEz3vKJ45XjW5m5pbow - title: RailsConf 2022 - description: The largest official gathering of the year, RailsConf brings together - top talent, companies, and project representatives from around the world. Learn - and build with the best in sessions, workshops, keynotes and parties. - thumbnails: - default: - url: https://i.ytimg.com/vi/DzyGdOd_6-Y/default.jpg - width: 120 - height: 90 - medium: - url: https://i.ytimg.com/vi/DzyGdOd_6-Y/mqdefault.jpg - width: 320 - height: 180 - high: - url: https://i.ytimg.com/vi/DzyGdOd_6-Y/hqdefault.jpg - width: 480 - height: 360 - standard: - url: https://i.ytimg.com/vi/DzyGdOd_6-Y/sddefault.jpg - width: 640 - height: 480 - maxres: - url: https://i.ytimg.com/vi/DzyGdOd_6-Y/maxresdefault.jpg - width: 1280 - height: 720 - channelTitle: Ruby Central - localized: - title: RailsConf 2022 - description: The largest official gathering of the year, RailsConf brings together - top talent, companies, and project representatives from around the world. - Learn and build with the best in sessions, workshops, keynotes and parties. - contentDetails: - itemCount: 67 -- kind: youtube#playlist - etag: cX1dmirCExGW43Pnn54ul1KbQOU - id: PLbHJudTY1K0f0oMhWtY-UyzOb7tUlaHps - snippet: - publishedAt: '2021-12-16T16:29:05Z' - channelId: UCpFXaEz3vKJ45XjW5m5pbow - title: RubyConf 2021 - description: Focused on fostering the Ruby programming language and the robust - community that has sprung up around it, RubyConf brings together Rubyists both - established and new to discuss emerging ideas, collaborate, and socialize in - some of the best locations in the US. - thumbnails: - default: - url: https://i.ytimg.com/vi/paZ5_3F22V8/default.jpg - width: 120 - height: 90 - medium: - url: https://i.ytimg.com/vi/paZ5_3F22V8/mqdefault.jpg - width: 320 - height: 180 - high: - url: https://i.ytimg.com/vi/paZ5_3F22V8/hqdefault.jpg - width: 480 - height: 360 - standard: - url: https://i.ytimg.com/vi/paZ5_3F22V8/sddefault.jpg - width: 640 - height: 480 - maxres: - url: https://i.ytimg.com/vi/paZ5_3F22V8/maxresdefault.jpg - width: 1280 - height: 720 - channelTitle: Ruby Central - localized: - title: RubyConf 2021 - description: Focused on fostering the Ruby programming language and the robust - community that has sprung up around it, RubyConf brings together Rubyists - both established and new to discuss emerging ideas, collaborate, and socialize - in some of the best locations in the US. - contentDetails: - itemCount: 103 -- kind: youtube#playlist - etag: tHRqysl3DTHbqvF1X0ZsoKKk_I0 - id: PLbHJudTY1K0c9QhfXrzXgq9G4YYHuq-3o - snippet: - publishedAt: '2021-11-08T19:23:35Z' - channelId: UCpFXaEz3vKJ45XjW5m5pbow - title: RubyConf 2021 Viewing Playlist - Room 607 - description: '' - thumbnails: - default: - url: https://i.ytimg.com/vi/DYc5X-in_oM/default.jpg - width: 120 - height: 90 - medium: - url: https://i.ytimg.com/vi/DYc5X-in_oM/mqdefault.jpg - width: 320 - height: 180 - high: - url: https://i.ytimg.com/vi/DYc5X-in_oM/hqdefault.jpg - width: 480 - height: 360 - standard: - url: https://i.ytimg.com/vi/DYc5X-in_oM/sddefault.jpg - width: 640 - height: 480 - maxres: - url: https://i.ytimg.com/vi/DYc5X-in_oM/maxresdefault.jpg - width: 1280 - height: 720 - channelTitle: Ruby Central - localized: - title: RubyConf 2021 Viewing Playlist - Room 607 - description: '' - contentDetails: - itemCount: 4 -- kind: youtube#playlist - etag: mA4dnbnVwmlKdpqcrkFCXeukhCY - id: PLbHJudTY1K0cawo3AfY5Bp6oUPH65MnKz - snippet: - publishedAt: '2021-05-28T17:45:03Z' - channelId: UCpFXaEz3vKJ45XjW5m5pbow - title: RailsConf 2021 Workshops - description: '' - thumbnails: - default: - url: https://i.ytimg.com/vi/Sid39aN_SKk/default.jpg - width: 120 - height: 90 - medium: - url: https://i.ytimg.com/vi/Sid39aN_SKk/mqdefault.jpg - width: 320 - height: 180 - high: - url: https://i.ytimg.com/vi/Sid39aN_SKk/hqdefault.jpg - width: 480 - height: 360 - standard: - url: https://i.ytimg.com/vi/Sid39aN_SKk/sddefault.jpg - width: 640 - height: 480 - channelTitle: Ruby Central - localized: - title: RailsConf 2021 Workshops - description: '' - contentDetails: - itemCount: 11 -- kind: youtube#playlist - etag: OqLeaChyKZuUYRBp7t8yFqdHxd8 - id: PLbHJudTY1K0c8N1-PPyiQxlHNzJIzyJv6 - snippet: - publishedAt: '2021-04-09T18:48:00Z' - channelId: UCpFXaEz3vKJ45XjW5m5pbow - title: RailsConf 2021 - description: Talks Presented at RailsConf 2021 - thumbnails: - default: - url: https://i.ytimg.com/vi/N5g7oruepIg/default.jpg - width: 120 - height: 90 - medium: - url: https://i.ytimg.com/vi/N5g7oruepIg/mqdefault.jpg - width: 320 - height: 180 - high: - url: https://i.ytimg.com/vi/N5g7oruepIg/hqdefault.jpg - width: 480 - height: 360 - standard: - url: https://i.ytimg.com/vi/N5g7oruepIg/sddefault.jpg - width: 640 - height: 480 - maxres: - url: https://i.ytimg.com/vi/N5g7oruepIg/maxresdefault.jpg - width: 1280 - height: 720 - channelTitle: Ruby Central - localized: - title: RailsConf 2021 - description: Talks Presented at RailsConf 2021 - contentDetails: - itemCount: 75 -- kind: youtube#playlist - etag: Znon31dHuRVaKH17_E3Xvv5DOUk - id: PLbHJudTY1K0cyDs1ZwFLzlfQqvkDKt17N - snippet: - publishedAt: '2020-12-18T18:44:44Z' - channelId: UCpFXaEz3vKJ45XjW5m5pbow - title: RubyConf 2020 - description: The RubyConf 2020 Conference, presented by Ruby Central. - thumbnails: - default: - url: https://i.ytimg.com/vi/FTWKackp1Js/default.jpg - width: 120 - height: 90 - medium: - url: https://i.ytimg.com/vi/FTWKackp1Js/mqdefault.jpg - width: 320 - height: 180 - high: - url: https://i.ytimg.com/vi/FTWKackp1Js/hqdefault.jpg - width: 480 - height: 360 - standard: - url: https://i.ytimg.com/vi/FTWKackp1Js/sddefault.jpg - width: 640 - height: 480 - maxres: - url: https://i.ytimg.com/vi/FTWKackp1Js/maxresdefault.jpg - width: 1280 - height: 720 - channelTitle: Ruby Central - localized: - title: RubyConf 2020 - description: The RubyConf 2020 Conference, presented by Ruby Central. - contentDetails: - itemCount: 25 diff --git a/config/cable.yml b/config/cable.yml index b4b09b6e..042fe987 100644 --- a/config/cable.yml +++ b/config/cable.yml @@ -1,11 +1,8 @@ development: - adapter: redis - url: redis://localhost:6379/1 + adapter: litecable test: adapter: test production: - adapter: redis - url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> - channel_prefix: rubyvideo_production + adapter: litecable diff --git a/config/deploy.yml b/config/deploy.yml index 8fbfa205..8d0396e2 100644 --- a/config/deploy.yml +++ b/config/deploy.yml @@ -20,11 +20,13 @@ registry: # Inject ENV variables into containers (secrets come from .env). env: + clear: + RUBY_YJIT_ENABLE: 1 secret: - RAILS_MASTER_KEY - APPSIGNAL_PUSH_API_KEY - MEILI_MASTER_KEY - - GITHUB_TOKEN + - RUBYVIDEO_GITHUB_TOKEN # Use a different ssh user than root ssh: user: root diff --git a/config/environments/development.rb b/config/environments/development.rb index 3f0cf3f8..7dd91ac0 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -24,7 +24,7 @@ config.action_controller.perform_caching = true config.action_controller.enable_fragment_cache_logging = true - config.cache_store = :litecache, {path: "./storage/cache.db"} + config.cache_store = :litecache, {path: "./storage/cache.development.db"} config.public_file_server.headers = { "Cache-Control" => "public, max-age=#{2.days.to_i}" } diff --git a/config/environments/test.rb b/config/environments/test.rb index 64aaa69c..1f45fbb8 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -27,7 +27,8 @@ # Show full error reports and disable caching. config.consider_all_requests_local = true config.action_controller.perform_caching = false - config.cache_store = :null_store + config.cache_store = :memory_store + # config.cache_store = :litecache, {path: "./storage/cache.test.db"} when new version of litestack is released # Raise exceptions instead of rendering exception templates. config.action_dispatch.show_exceptions = false diff --git a/config/initializers/pagy.rb b/config/initializers/pagy.rb index 6c797ce1..42e1da5c 100644 --- a/config/initializers/pagy.rb +++ b/config/initializers/pagy.rb @@ -1 +1,4 @@ require "pagy/extras/meilisearch" +require "pagy/extras/overflow" + +Pagy::DEFAULT[:overflow] = :last_page diff --git a/config/litecable.yml b/config/litecable.yml new file mode 100644 index 00000000..7ad2fc9b --- /dev/null +++ b/config/litecable.yml @@ -0,0 +1 @@ +path: "./storage/cable.db" diff --git a/config/litlecable.yml b/config/litlecable.yml deleted file mode 100644 index cb19addf..00000000 --- a/config/litlecable.yml +++ /dev/null @@ -1 +0,0 @@ -path: ./storage/cable.db diff --git a/config/routes.rb b/config/routes.rb index 1fde9d9c..4826f22b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,7 +2,10 @@ # Rails.application.routes.draw do - get "page/home" + # static pages + get "uses", to: "page#uses" + + # authentication get "/auth/failure", to: "sessions/omniauth#failure" get "/auth/:provider/callback", to: "sessions/omniauth#create" post "/auth/:provider/callback", to: "sessions/omniauth#create" @@ -21,6 +24,13 @@ resource :password_reset, only: [:new, :edit, :create, :update] end + # resources + namespace :analytics do + resource :dashboards, only: [:show] do + get :daily_page_views + get :daily_visits + end + end resources :talks, param: :slug, only: [:index, :show, :update, :edit] resources :speakers, param: :slug, only: [:index, :show, :update, :edit] resources :events, param: :slug, only: [:index, :show, :update, :edit] @@ -28,6 +38,7 @@ resources :enhance, only: [:update], param: :slug end + # admin namespace :admin, if: -> { Current.user & admin? } do resources :suggestions, only: %i[index update destroy] end diff --git a/data/railsconf/birmingham-on-rails-2020/videos.yml b/data/railsconf/birmingham-on-rails-2020/videos.yml index 2be2cab6..add9e54d 100644 --- a/data/railsconf/birmingham-on-rails-2020/videos.yml +++ b/data/railsconf/birmingham-on-rails-2020/videos.yml @@ -1,8 +1,8 @@ --- -- title: 'Birmingham on Rails 2020 - Closing Keynote: Lucky You by Sandi Mets' - raw_title: 'Birmingham on Rails 2020 - Closing Keynote: Lucky You by Sandi Mets' +- title: 'Birmingham on Rails 2020 - Closing Keynote: Lucky You by Sandi Metz' + raw_title: 'Birmingham on Rails 2020 - Closing Keynote: Lucky You by Sandi Metz' speakers: - - Sandi Mets + - Sandi Metz event_name: Birmingham on Rails 2020 thumbnail_xs: https://i.ytimg.com/vi/3EUnauHNikw/default.jpg thumbnail_sm: https://i.ytimg.com/vi/3EUnauHNikw/mqdefault.jpg @@ -10,7 +10,7 @@ thumbnail_lg: https://i.ytimg.com/vi/3EUnauHNikw/sddefault.jpg thumbnail_xl: https://i.ytimg.com/vi/3EUnauHNikw/maxresdefault.jpg published_at: '2020-02-19' - description: 'Birmingham on Rails 2020 - Closing Keynote: Lucky You by Sandi Mets' + description: 'Birmingham on Rails 2020 - Closing Keynote: Lucky You by Sandi Metz' video_id: 3EUnauHNikw - title: The Story of Rails! raw_title: Birmingham on Rails 2020 - The Story of Rails! by Ratnadeep Deshmane diff --git a/data/railsconf/playlists.yml b/data/railsconf/playlists.yml index c8200742..62f2cf70 100644 --- a/data/railsconf/playlists.yml +++ b/data/railsconf/playlists.yml @@ -109,3 +109,12 @@ year: "2022" videos_count: 67 slug: railsconf-2022 +- id: PLbHJudTY1K0cOM1jfOsQLYPTLxQf1Ui1C + title: RailsConf 2023 + description: + RailsConf, hosted by Ruby Central, is the world’s largest and longest-running + gathering of Ruby on Rails enthusiasts, practitioners, and companies. + published_at: "2023-07-14" + year: "2023" + videos_count: 58 + slug: railsconf-2023 diff --git a/data/railsconf/railsconf-2023/videos.yml b/data/railsconf/railsconf-2023/videos.yml new file mode 100644 index 00000000..11639ac8 --- /dev/null +++ b/data/railsconf/railsconf-2023/videos.yml @@ -0,0 +1,1111 @@ +--- +- title: Functional Patterns in Ruby + raw_title: RailsConf 2023 - Functional Patterns in Ruby by John Crepezzi + speakers: + - John Crepezzi + description: + I recently started working primarily in a statically-typed functional + programming language (OCaml). While learning, I spent a lot of time trying to + fit OCaml into a Ruby-shaped box. While there are plenty of things that I miss + about Ruby day-to-day, there are also a lot of good lessons to take away! No, + I’m not talking about static typing, or some rant on how nil is an anti-pattern. + This talk instead will dig into concepts from around the functional world and + how they can be modeled in Ruby for cleaner, more future-proof code. + thumbnail_xs: https://i.ytimg.com/vi/3ndcqh9fTGA/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/3ndcqh9fTGA/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/3ndcqh9fTGA/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/3ndcqh9fTGA/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/3ndcqh9fTGA/maxresdefault.jpg + published_at: "2023-07-10" + video_id: 3ndcqh9fTGA +- title: Who Wants to be a Ruby Engineer? + raw_title: RailsConf 2023 - Who Wants to be a Ruby Engineer? by Drew Bragg + speakers: + - Drew Bragg + description: + 'Welcome to the Ruby game show where contestants try to guess the output + of a small bit of Ruby code. Sound easy? Here''s the challenge: the snippets come + from some of the weirdest parts of the Ruby language. The questions aren''t easy, + but et enough right to be crowned a "Strange" Ruby Engineer and win a fabulous + prize.' + thumbnail_xs: https://i.ytimg.com/vi/4VT0aDEDd28/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/4VT0aDEDd28/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/4VT0aDEDd28/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/4VT0aDEDd28/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/4VT0aDEDd28/maxresdefault.jpg + published_at: "2023-07-10" + video_id: 4VT0aDEDd28 +- title: Building an offline experience with a Rails-powered PWA + raw_title: + RailsConf 2023 - Building an offline experience with a Rails-powered + PWA by Alicia Rojas + speakers: + - Alicia Rojas + description: + Progressive web applications (PWAs) allow us to provide rich offline + experiences as native apps would, while still being easy to use and share, as + web apps are. Come to learn how to turn your regular Rails application into a + PWA, taking advantage of the new front-end tools that come with Rails by default + since version 7. Entry-level developers are welcome! + thumbnail_xs: https://i.ytimg.com/vi/4cQuxQdWkPE/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/4cQuxQdWkPE/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/4cQuxQdWkPE/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/4cQuxQdWkPE/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/4cQuxQdWkPE/maxresdefault.jpg + published_at: "2023-07-10" + video_id: 4cQuxQdWkPE +- title: Accessible by default + raw_title: RailsConf 2023 - Accessible by default by Joel Hawksley + speakers: + - Joel Hawksley + description: + It's one thing to build a new application that meets the latest accessibility + standards, but it's another thing to update an existing application to meet them. + In this talk, we'll share how we're using automated accessibility scanning, preview-driven + development, and an accessibility-first form builder to make GitHub's 15-year-old, + 1,400-controller Ruby on Rails monolith accessible. + thumbnail_xs: https://i.ytimg.com/vi/4j2zlvE_Yj8/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/4j2zlvE_Yj8/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/4j2zlvE_Yj8/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/4j2zlvE_Yj8/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/4j2zlvE_Yj8/maxresdefault.jpg + published_at: "2023-07-10" + video_id: 4j2zlvE_Yj8 +- title: ActiveRecord::Encryption; Stop Hackers from Reading your Data + raw_title: + RailsConf 2023 - ActiveRecord::Encryption; Stop Hackers from... by Matthew + Langlois, Kylie Stradley + speakers: + - Matthew Langlois + - Kylie Stradley + description: |- + ActiveRecord::Encryption; Stop Hackers from Reading your Data by Matthew Langlois, Kylie Stradley + + Have you ever wondered how to encrypt data in your Rails application but weren’t sure where to get started? We’ll briefly talk about why you would want to encrypt data, and then discuss how you can get started with encrypting columns in your Rails application including pitfalls and successes we encountered while implementing ActiveRecord::Encryption at GitHub. Attendees will be confident in making a decision to implement ActiveRecord::Encryption in their application. + thumbnail_xs: https://i.ytimg.com/vi/4mZNP_Dgi2w/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/4mZNP_Dgi2w/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/4mZNP_Dgi2w/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/4mZNP_Dgi2w/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/4mZNP_Dgi2w/maxresdefault.jpg + published_at: "2023-07-10" + video_id: 4mZNP_Dgi2w +- title: Applying microservices patterns to a modular monolith + raw_title: + RailsConf 2023 - Applying microservices patterns to a modular monolith + by Guillermo Aguirre + speakers: + - Guillermo Aguirre + description: |- + Dealing with legacy monoliths can be challenging due to accumulated technical debt. When faced with this situation, we usually start looking at different strategies to solve this, like microservices, engines, and modularization, just to name a few. + + When choosing to follow a modular approach, I explored applying microservices patterns to our modular monolith. In this talk, I’ll share my experience in adopting this approach, focusing on ensuring data consistency and distributed transactions, as well as the pitfalls and insights I discovered along the way. + thumbnail_xs: https://i.ytimg.com/vi/4zrQAJ0RlI4/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/4zrQAJ0RlI4/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/4zrQAJ0RlI4/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/4zrQAJ0RlI4/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/4zrQAJ0RlI4/maxresdefault.jpg + published_at: "2023-07-10" + video_id: 4zrQAJ0RlI4 +- title: "Bridging the Gap: Creating Trust Between Non-Technical Stakeholders and Engineering Teams" + raw_title: + "RailsConf 2023 - Bridging the Gap: Creating Trust Between Non-Technical... + by Kevin Gorham" + speakers: + - Kevin Gorham + description: |- + Bridging the Gap: Creating Trust Between Non-Technical Stakeholders and Engineering Teams by Kevin Gorham + + In this talk, we'll explore how to build trust between non-technical stakeholders and engineering teams, using data and analysis to effectively communicate progress. We'll discuss practical tactics for leveraging the Pivotal Tracker API and Google Apps Scripts to extract relevant metrics, analyze data, and provide insightful analysis, as well as how to communicate that information. Join us to learn how to build trust, and how it can improve project success and create better outcomes for all parties involved. + thumbnail_xs: https://i.ytimg.com/vi/5gSRKyuO7qY/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/5gSRKyuO7qY/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/5gSRKyuO7qY/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/5gSRKyuO7qY/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/5gSRKyuO7qY/maxresdefault.jpg + published_at: "2023-07-10" + video_id: 5gSRKyuO7qY +- title: "Forecasting the Future: An Introduction to Machine Learning for Weather Prediction" + raw_title: + "RailsConf 2023 - Forecasting the Future: An Introduction to Machine + Learning for... by Landon Gray" + speakers: + - Landon Gray + description: |- + Forecasting the Future: An Introduction to Machine Learning for Weather Prediction in Native Ruby by Landon Gray + + Have you ever considered building a machine learning model in Ruby? It may surprise you to learn that you can train, build, and deploy ML models in Ruby. But what are the benefits of using Ruby over other languages? + + One of the biggest advantages of using Ruby for machine learning is accessibility. You're no longer limited to specific languages or tools when exploring AI and ML concepts. It's time for Rubyists to dive into the world of machine learning! - + + In this talk, we'll build a model that predicts the weather and explore the tools and libraries available for your own native Ruby Machine Learning projects. + + Whether you're a seasoned Rubyist or just starting out, don't miss this opportunity to discover the possibilities of machine learning in Ruby. + thumbnail_xs: https://i.ytimg.com/vi/656z7Hu0HtY/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/656z7Hu0HtY/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/656z7Hu0HtY/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/656z7Hu0HtY/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/656z7Hu0HtY/maxresdefault.jpg + published_at: "2023-07-10" + video_id: 656z7Hu0HtY +- title: The End of Legacy Code + raw_title: RailsConf 2023 - The End of Legacy Code by Daniel Huss + speakers: + - Daniel Huss + description: + "Legacy code. Did you just shiver with dread? \n\nWe know it when we + see it, but we don't know how it got there, or why it looks like... this. \n\nWhat + if we could change our relationship with legacy code, and shed the weight the + name brings with it? What if legacy code disappeared? \n\nThrow away everything + you've ever learned, embrace the mindset of Eternal Onboarding, and watch as our + problems with \"Legacy Code\" melt away." + thumbnail_xs: https://i.ytimg.com/vi/6msn5oGT7Q8/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/6msn5oGT7Q8/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/6msn5oGT7Q8/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/6msn5oGT7Q8/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/6msn5oGT7Q8/maxresdefault.jpg + published_at: "2023-07-10" + video_id: 6msn5oGT7Q8 +- title: Demystifying the Unionizing Process + raw_title: RailsConf 2023 - Demystifying the Unionizing Process by Colin Fleming + speakers: + - Colin Fleming + description: + Unionization has come up among workers at both the largest and smallest + companies in the USA, especially post-pandemic. In this talk, we'll talk about + why workplaces decide to unionize or not, learn more about the actual process, + and think about what this means for software developers in particular. + thumbnail_xs: https://i.ytimg.com/vi/8qSmTXFG2Pc/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/8qSmTXFG2Pc/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/8qSmTXFG2Pc/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/8qSmTXFG2Pc/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/8qSmTXFG2Pc/maxresdefault.jpg + published_at: "2023-07-10" + video_id: 8qSmTXFG2Pc +- title: How to Upstream Your Code to Rails + raw_title: RailsConf 2023 - How to Upstream Your Code to Rails by Hartley McGuire + speakers: + - Hartley McGuire + description: + Contributing to Rails for the first time can be intimidating! What + makes a good contribution? What does the review process look like? Why should + I even bother in the first place? In this talk, we will answer all of these questions + and more as we learn about contributing to the Rails framework. We will follow + along with a real story of upstreaming a new feature, and learning about the hurdles + encountered along the way, both expected and unexpected. + thumbnail_xs: https://i.ytimg.com/vi/Ai64DuHt4CU/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/Ai64DuHt4CU/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/Ai64DuHt4CU/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/Ai64DuHt4CU/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/Ai64DuHt4CU/maxresdefault.jpg + published_at: "2023-07-10" + video_id: Ai64DuHt4CU +- title: A custom design pattern for building dynamic ActiveRecord queries + raw_title: + RailsConf 2023 - A custom design pattern for building dynamic ActiveRecord + queries by Justin Daniel + speakers: + - Justin Daniel + description: + "The pain is familiar to long-time developers of enterprise Rails applications. + Database queries through ActiveRecord are an essential part of our application. + And making these queries performant, dynamic, and readable is hard. \n\nWe can + solve the above problems. With the right abstractions we can write code that composes + queries that are performant, dynamic, and readable. Our approach uses a domain + specific language built on top of ActiveRecord that you can adapt to your own + application. We do not need a whole new library or framework. We just need query + objects and builders." + thumbnail_xs: https://i.ytimg.com/vi/CWqISNM1RfY/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/CWqISNM1RfY/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/CWqISNM1RfY/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/CWqISNM1RfY/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/CWqISNM1RfY/maxresdefault.jpg + published_at: "2023-07-10" + video_id: CWqISNM1RfY +- title: A Picture Is Worth a 1000 Lines of Code + raw_title: RailsConf 2023 - A Picture Is Worth a 1000 Lines of Code by Rich Steinmetz + speakers: + - Rich Steinmetz + description: |- + Let me show you how I turned my "two left hands" into eight superpower tentacles, going from "I can't draw" to visualizing more and less abstract concepts all over the internet. + + A simple visual framework can let you do the same rather quickly because this is what your brain is wired to do: process and generate images. + + The coding education industry and workplace communication mainly consist of simplified code examples, boring text walls, and sometimes never-ending speeches from the loudest people in meetings. + + All it takes to make abstract concepts visible is identifying your visual thinking type and empowering yourself with a reproducible process to make your communication more understandable, memorable, unique, collaborative, and fun. + thumbnail_xs: https://i.ytimg.com/vi/ChsqAlhnjsI/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/ChsqAlhnjsI/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/ChsqAlhnjsI/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/ChsqAlhnjsI/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/ChsqAlhnjsI/maxresdefault.jpg + published_at: "2023-07-10" + video_id: ChsqAlhnjsI +- title: "Rails on Ruby: How Ruby Makes Rails Great" + raw_title: "RailsConf 2023 - Rails on Ruby: How Ruby Makes Rails Great by Noel Rappin" + speakers: + - Noel Rappin + description: + Ruby puts the Ruby in “Ruby on Rails”! It’s the Ruby language that + makes Rails flexible, powerful, and with a developer-friendly API. How does Rails + take advantage of Ruby’s flexibility and metaprogramming to make it so useful? + And how can you take advantage of those features in your Rails app? We’ll go over + a few specific Ruby features, like how Rails uses Modules, or `define_method` + or `instance_eval`. You’ll be able to use these features to make your app as powerful + as Rails itself. + thumbnail_xs: https://i.ytimg.com/vi/EBFWAGkIFZM/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/EBFWAGkIFZM/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/EBFWAGkIFZM/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/EBFWAGkIFZM/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/EBFWAGkIFZM/maxresdefault.jpg + published_at: "2023-07-10" + video_id: EBFWAGkIFZM +- title: "Keynote: Aaron Patterson" + raw_title: "RailsConf 2023 - Keynote: Aaron Patterson" + speakers: + - "Aaron Patterson" + description: "Keynote: Aaron Patterson" + thumbnail_xs: https://i.ytimg.com/vi/LcDNedD-8mU/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/LcDNedD-8mU/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/LcDNedD-8mU/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/LcDNedD-8mU/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/LcDNedD-8mU/maxresdefault.jpg + published_at: "2023-07-10" + video_id: LcDNedD-8mU +- title: How Rails fosters a diverse and competitive tech ecosystem in the era of big tech + raw_title: + RailsConf 2023 - How Rails fosters a diverse and competitive tech ecosystem + in... by Jordan Trevino + speakers: + - Jordan Trevino + description: |- + How Rails fosters a diverse and competitive tech ecosystem in the era of big tech by Jordan Trevino + + Join us for a discussion on how Rails technology patterns and practices help foster a more diverse and competitive tech ecosystem amidst the proliferation of patterns popularized by big tech. We develop an economic and organizational critique of such approaches as microservices and single-page apps. + thumbnail_xs: https://i.ytimg.com/vi/Lo1rn0XCSDw/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/Lo1rn0XCSDw/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/Lo1rn0XCSDw/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/Lo1rn0XCSDw/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/Lo1rn0XCSDw/maxresdefault.jpg + published_at: "2023-07-10" + video_id: Lo1rn0XCSDw +- title: An imposter's guide to growth in engineering + raw_title: + RailsConf 2023 - An imposter's guide to growth in engineering by Ebun + Segun + speakers: + - Ebun Segun + description: + This session will explore the imposter syndrome that hits mid to upper + level engineers when thrust into a new project, show how this can be useful for + moving to the growth zone, and walk through practical steps to apply when facing + imposter syndrome. + thumbnail_xs: https://i.ytimg.com/vi/MH8j1_uthhk/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/MH8j1_uthhk/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/MH8j1_uthhk/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/MH8j1_uthhk/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/MH8j1_uthhk/maxresdefault.jpg + published_at: "2023-07-10" + video_id: MH8j1_uthhk +- title: "Rails Performance Monitoring 101: A Primer for Junior Developers" + raw_title: + "RailsConf 2023 - Rails Performance Monitoring 101: A Primer for Junior + Developers by Rishi Jain" + speakers: + - Rishi Jain + description: |- + Congratulations! You are fresh off your Rails boot camp and you just got hired by a startup that just went viral. Your first task is to figure out why their Rails application is slow. Now what? + + This talk will give you the tools you need to quickly find what's wrong in your application. You will learn a top-down approach for triaging performance issues and scaling your hot Rails app. + thumbnail_xs: https://i.ytimg.com/vi/OF5YhG-91ao/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/OF5YhG-91ao/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/OF5YhG-91ao/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/OF5YhG-91ao/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/OF5YhG-91ao/maxresdefault.jpg + published_at: "2023-07-10" + video_id: OF5YhG-91ao +- title: + "Beyond CRUD: the PostgreSQL techniques your Rails app is missing. Shayon + Mukherjee" + raw_title: + "RailsConf 2023 - Beyond CRUD: the PostgreSQL techniques your Rails app + is missing. Shayon Mukherjee" + speakers: + - Shayon Mukherjee + description: + "Being part of gnarly production outages isn’t uncommon. In this talk, + I will share short entertaining stories about a few head scratching production + outages we faced and how we used efficient and simple PostgreSQL features in Rails + to build scalable solutions. \n\nI will also discuss how and when to use certain + PostgreSQL concepts in Rails, such as optimistic and pessimistic locking, using + real-life examples that power core customer features.\n\nFinally, I will discuss + uses of Postgres mutex to manage concurrent access to shared resources and wrap + up by sharing our own experiences and lessons from other production outages. This + will help you avoid common operational pitfalls and improve your application's + reliability and query patterns." + thumbnail_xs: https://i.ytimg.com/vi/OQUTBLhP2QI/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/OQUTBLhP2QI/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/OQUTBLhP2QI/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/OQUTBLhP2QI/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/OQUTBLhP2QI/maxresdefault.jpg + published_at: "2023-07-10" + video_id: OQUTBLhP2QI +- title: "Faster websites: integrating next-gen images in your Rails apps" + raw_title: + "RailsConf 2023 - Faster websites: integrating next-gen images in your... + by JP Balarini" + speakers: + - JP Balarini + description: + "Faster and cheaper websites: integrating next-gen images in your Rails + apps by JP Balarini \n\nDid you know loading images accounts for nearly 50% of + your website’s total load time? Also, every additional second of load time results + in a 5% decrease in conversion rates, which directly impacts your business. What + if I told you there’s a simple way to decrease loading time?\n\nThis talk will + explore the latest and most effective options for web images that significantly + reduce website size without compromising quality. We’ll discuss how using next-gen + images can significantly impact website loading times, user conversion, and SEO. + \n\nWe’ll also go through the different challenges that I faced while integrating + next-gen images into a Rails project and how I solved them. A new gem will be + presented that streamlines the process of using WebP images with Ruby on Rails." + thumbnail_xs: https://i.ytimg.com/vi/Pdnpen6jPDM/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/Pdnpen6jPDM/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/Pdnpen6jPDM/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/Pdnpen6jPDM/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/Pdnpen6jPDM/maxresdefault.jpg + published_at: "2023-07-10" + video_id: Pdnpen6jPDM +- title: Hotwiring My React Brain + raw_title: RailsConf 2023 - Hotwiring My React Brain by Aji Slater + speakers: + - Aji Slater + description: + "Hi. Have you been writing Rails API-mode json backends for React front + ends for the last few years? Me too. \n\nHave you been daydreaming about the days + when you could just write a view template and render some html server-side? Me + too. \n\nHave you been wondering if it's possible to have rich, snappy UIs with + only Rails, and very little js? Me too. \n\nAre you now working on a fully Hotwire + and Turbo app, having to re-learn everything you've grown comfortable with in + front-end development? Me.. huh? no? \n\nWell come along and I'll show you how + I re-implemented my conception of the client side with Rails' Hotwire view layer." + thumbnail_xs: https://i.ytimg.com/vi/PvAf3vZp1b8/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/PvAf3vZp1b8/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/PvAf3vZp1b8/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/PvAf3vZp1b8/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/PvAf3vZp1b8/maxresdefault.jpg + published_at: "2023-07-10" + video_id: PvAf3vZp1b8 +- title: Let's Standardize Rails, Once and For All! + raw_title: + RailsConf 2023 - Let's Standardize Rails, Once and For All! by Justin + Searls, Meagan Waller + speakers: + - Justin Searls + - Meagan Waller + description: |- + Four years ago, I arbitrarily configured every RuboCop rule and published it as a gem called "standard". 135 releases later, feedback from the community has gradually transformed Standard into a linter & formatter ruleset that most Rubyists can get behind. Today, Standard is delivering on its promise: helping teams stay focused on their work instead of arguing over syntax. + + The time has come to once again configure the unconfigurable by creating a standard-rails based on rubocop-rails. But this time, we'll skip the years of debating rules on GitHub. Instead, we're holding a community straw poll at RailsConf! + + Join us for a town hall-style event where we'll review what each rubocop-rails rule does, hear its pros and cons, and put it to a vote. We'll enshrine the consensus picks in the first public release of standard-rails. By showing up, you'll not only be establishing conventions to promote safe and consistent code, you'll be sharpening the focus of Rails developers around the world! + thumbnail_xs: https://i.ytimg.com/vi/QVilOzkLdlI/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/QVilOzkLdlI/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/QVilOzkLdlI/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/QVilOzkLdlI/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/QVilOzkLdlI/maxresdefault.jpg + published_at: "2023-07-10" + video_id: QVilOzkLdlI +- title: Building a world class engineering organization — learning from cave + paintings and horsey land art + raw_title: + RailsConf 2023 - Building a world class engineering organization — learning + from... by Shane Becker + speakers: + - Shane Becker + description: + "Building a world class engineering organization — learning from cave + paintings and horsey land art by Shane Becker\n\nHuman built things survive for + a Very Long Time™ by one of two ways: materials or maintenance. \n\nWhat we can + learn from Stonehenge, Lascaux cave paintings, Brewarrina Aboriginal Fish Traps, + the White Horse of Uffington, Iranian windmills, and Japanese Shinto shrines?\n\nIf + we knew for certain that our Rails apps would be in use in ten years (or a hundred!), + what would future us wish that we would've done now to build a better future?" + thumbnail_xs: https://i.ytimg.com/vi/R7JqiVPuKD8/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/R7JqiVPuKD8/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/R7JqiVPuKD8/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/R7JqiVPuKD8/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/R7JqiVPuKD8/maxresdefault.jpg + published_at: "2023-07-10" + video_id: R7JqiVPuKD8 +- title: "Terms of Deployment: The Process of Evaluating Hatchbox, Fly and Render for Developers" + raw_title: + "RailsConf 2023 - Terms of Deployment: The Process of Evaluating Hatchbox, + Fly and... by Jordan Burke" + speakers: + - Jordan Burke + description: |- + Terms of Deployment: The Process of Evaluating Hatchbox, Fly, and Render for Developers by Jordan Burke + + Heroku has long been the mainstay deployment platform for Rails developers and agencies, but with several new options for hosting out there, is it still the best solution? We take a quick look at how we evaluated switching some of our clients’ applications to Hatchbox.io, Render, and fly.io. how we made those decisions, and how we will make those determinations in the future. + thumbnail_xs: https://i.ytimg.com/vi/RHv7hJGOUr0/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/RHv7hJGOUr0/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/RHv7hJGOUr0/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/RHv7hJGOUr0/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/RHv7hJGOUr0/maxresdefault.jpg + published_at: "2023-07-10" + video_id: RHv7hJGOUr0 +- title: "Deep End Diving: Getting Up to Speed on New Codebases" + raw_title: + "RailsConf 2023 - Deep End Diving: Getting Up to Speed on New Codebases + by Allison Hill" + speakers: + - Allison Hill + description: + One of the beautiful things about software engineering is that we’re + always learning. At all career stages, there are always new gems, open source + tools, and company-specific tech stacks to get up to speed on. It can be overwhelming + sometimes! The good news is that there are concrete strategies you can use to + make plunging into a new project an exciting rush (rather than a panic-inducing + nightmare). With a little bit of focus put into the right areas, you can help + every new team member- from the most junior dev to top dog seniors- jump in and + contribute faster. + thumbnail_xs: https://i.ytimg.com/vi/RxgHgzByNPs/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/RxgHgzByNPs/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/RxgHgzByNPs/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/RxgHgzByNPs/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/RxgHgzByNPs/maxresdefault.jpg + published_at: "2023-07-10" + video_id: RxgHgzByNPs +- title: Exploring the Power of Turbo Streams and ActionCable + raw_title: + RailsConf 2023 - Exploring the Power of Turbo Streams and ActionCable + by Kevin Liebholz + speakers: + - Kevin Liebholz + description: + Dive into the world of Turbo Streams and ActionCable with the Dragon + Rider Eragon and his majestic dragon, Saphira, as we build a real-time tic-tac-toe + game. We will utilize Turbo Stream broadcasting and ActionCable customization + to create the game for our heroes, adding constraints of rising difficulty one + after the other. Are you an advanced coder? Or are you a beginner? As long as + you are looking to explore new applications of Hotwire’s Turbo or simply learn + about it, we’re a match! + thumbnail_xs: https://i.ytimg.com/vi/S--B3BGIk3M/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/S--B3BGIk3M/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/S--B3BGIk3M/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/S--B3BGIk3M/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/S--B3BGIk3M/maxresdefault.jpg + published_at: "2023-07-10" + video_id: S--B3BGIk3M +- title: Hacking Your Emotional API + raw_title: RailsConf 2023 - Hacking Your Emotional API by John Sawers + speakers: + - John Sawers + description: |- + Feelings are messy and uncomfortable, so why can't we just ignore them? Because emotional skills are critical for working well on a team, and for the quality of our work. + + In this talk you’ll learn how emotions are affecting you by modeling them as an API and looking at the code. + + I cover how poor handling of emotions impacts cognition, memory, and communication. + + Then I dive into my toolkit for handling emotions, full of practical advice and new ways of thinking. + thumbnail_xs: https://i.ytimg.com/vi/UftGecVyvSk/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/UftGecVyvSk/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/UftGecVyvSk/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/UftGecVyvSk/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/UftGecVyvSk/maxresdefault.jpg + published_at: "2023-07-10" + video_id: UftGecVyvSk +- title: Building a more effective, bidirectional mentor-mentee relationship + raw_title: + RailsConf 2023 - Building a more effective, bidirectional mentor-... + by Andy Andrea, William Frey + speakers: + - Andy Andrea + - William Frey + description: |- + Building a more effective, bidirectional mentor-mentee relationship by Andy Andrea, William Frey + + Mentorship is such a key part of our industry that most of us will act as both mentor and mentee many times over the course of our careers. However, unlike our other important skills that get honed through processes like code review or retrospectives, there are often few mechanisms to help us grow as mentors and mentees. + + We’ll cover common problems that occur as both a mentee and mentor and cover strategies, skills and concepts for how to deal with them that originate not only from our own experiences but from research in the fields of education, psychology and business. We’ll cover concepts that won’t only build your skills but improve the value you get from being a mentor or mentee and show you how to make an evidence-backed business case for expanding mentorship at your place of work. + thumbnail_xs: https://i.ytimg.com/vi/Uv2I3ECnzuY/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/Uv2I3ECnzuY/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/Uv2I3ECnzuY/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/Uv2I3ECnzuY/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/Uv2I3ECnzuY/maxresdefault.jpg + published_at: "2023-07-10" + video_id: Uv2I3ECnzuY +- title: 10x your teamwork through pair programming + raw_title: + RailsConf 2023 - 10x your teamwork through pair programming by Michael + Milewski, Selena Small + speakers: + - Michael Milewski + - Selena Small + description: + A roller coaster journey of how to get the most out of pair programming. + Live on stage acting out highs, lows, do’s and don’ts of pair programming. Laughs + and tears are guaranteed as the audience connect on the difficulties and ultimately + the rewards that can be reaped through effective pairing. + thumbnail_xs: https://i.ytimg.com/vi/W8y0odUwks8/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/W8y0odUwks8/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/W8y0odUwks8/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/W8y0odUwks8/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/W8y0odUwks8/maxresdefault.jpg + published_at: "2023-07-10" + video_id: W8y0odUwks8 +- title: "Keynote: Investing in the Ruby community" + raw_title: + "RailsConf 2023 - Keynote: Investing in the Ruby community by Rafael + Mendonça França" + speakers: + - Rafael Mendonça França + description: + This is a tale of how a developer's passion for Ruby lead them to assist + companies make investments in the Ruby community. Come and watch a captivating + love story featuring gems, train tracks and ice cream. + thumbnail_xs: https://i.ytimg.com/vi/XohX3nlVIdc/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/XohX3nlVIdc/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/XohX3nlVIdc/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/XohX3nlVIdc/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/XohX3nlVIdc/maxresdefault.jpg + published_at: "2023-07-10" + video_id: XohX3nlVIdc +- title: Using Rails Engines to Supercharge Your Team + raw_title: + RailsConf 2023 - Using Rails Engines to Supercharge Your Team by Austin + Story + speakers: + - Austin Story + description: |- + Rails engines are self-contained modules that can be used inside of a larger Ruby on Rails application to encapsulate complex functionality and expose it with a tight, well defined API. + + When implemented properly on the right domains, they can give your team a major speed boost. + + In this talk we will break down how Doximity used a Rails engine as a key ingredient to successfully rollout GraphQL Federation to our organizations. + thumbnail_xs: https://i.ytimg.com/vi/ZE9dKoBIr48/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/ZE9dKoBIr48/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/ZE9dKoBIr48/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/ZE9dKoBIr48/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/ZE9dKoBIr48/maxresdefault.jpg + published_at: "2023-07-10" + video_id: ZE9dKoBIr48 +- title: Go Passwordless with WebAuthn in Ruby + raw_title: RailsConf 2023 - Go Passwordless with WebAuthn in Ruby by Braulio Martinez + speakers: + - Braulio Martinez + description: + "Nowadays, passwords are still our most common authentication method. + However, they are not secure enough and have terrible UX. \n\nTherefore, big industry + players in the FIDO Alliance like Google, Mozilla, Apple, Amazon (among others) + collaborated together to find a solution. WebAuthn was born and eventually became + a W3C standard enabling users to authenticate on the web using public-key cryptography + together with biometrics.\n\nThis talk will allow you to learn what WebAuthn is + and how it works. You’ll also see how any Ruby app can easily get the level of + authentication security and UX users deserve." + thumbnail_xs: https://i.ytimg.com/vi/ZsGphXQ9kfw/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/ZsGphXQ9kfw/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/ZsGphXQ9kfw/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/ZsGphXQ9kfw/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/ZsGphXQ9kfw/maxresdefault.jpg + published_at: "2023-07-10" + video_id: ZsGphXQ9kfw +- title: Strategies for saying no + raw_title: RailsConf 2023 - Strategies for saying no by Elle Meredith + speakers: + - Elle Meredith + description: + You have been working hard to meet a deadline and then you receive + an email from your boss, asking you to take on a new project. You're at capacity + with your time, resources, and focus, but you still feel obliged to say "yes". + This scenario is common for most of us. We don't want to say "no" because we don't + want to disappoint people or let them down. This is even a bigger problem when + you start leading people. Saying no enables you to focus on what's important and + prevent burnout. In this talk, you will take away tools and strategies to become + more confident around saying no. + thumbnail_xs: https://i.ytimg.com/vi/_2zWwwjnuUA/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/_2zWwwjnuUA/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/_2zWwwjnuUA/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/_2zWwwjnuUA/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/_2zWwwjnuUA/maxresdefault.jpg + published_at: "2023-07-10" + video_id: _2zWwwjnuUA +- title: Building Ruby Head for your Rails App + raw_title: RailsConf 2023 - Building Ruby Head for your Rails App by Maple Ong + speakers: + - Maple Ong + description: + "Tired of upgrading to the latest Ruby version every new year? Just + have the latest Ruby version already running! Ruby head is the latest commit to + the main branch of Ruby on Github. It’s dangerous to run our Rails app on Ruby + head, but we can run Ruby head on application tests. \n\nWe'll build Ruby head + on a Docker image and run it with tests on Buildkite. Along the way, we'll learn + about using Docker, jemalloc (an an alternate malloc implementation) and why it's + important to your team and the Ruby community to do this work." + thumbnail_xs: https://i.ytimg.com/vi/bLTqSh3Jon0/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/bLTqSh3Jon0/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/bLTqSh3Jon0/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/bLTqSh3Jon0/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/bLTqSh3Jon0/maxresdefault.jpg + published_at: "2023-07-10" + video_id: bLTqSh3Jon0 +- title: "Breaking the Grind: Crafting Your Ideal Software Engineering Career Build" + raw_title: + "RailsConf 2023 - Breaking the Grind: Crafting Your Ideal Software Engineering... + by Ole Michaelis" + speakers: + - Ole Michaelis + description: |- + Breaking the Grind: Crafting Your Ideal Software Engineering Career Build by Ole Michaelis + + Explore the world of software engineering skills through the lens of role-playing games to find the most effective builds for advancing your career. This talk metaphorically approaches (MMO)RPG skill trees by looking at different career paths in software engineering, unlocking new skills, and leveling up existing ones to branch out into new areas of expertise. We'll examine a variety of paths — including programming paradigms, software delivery, organizational development, and team management. LFG for adventure, and uncover the vast possibilities of building a career as a software engineer! + thumbnail_xs: https://i.ytimg.com/vi/bhagIbz3T0A/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/bhagIbz3T0A/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/bhagIbz3T0A/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/bhagIbz3T0A/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/bhagIbz3T0A/maxresdefault.jpg + published_at: "2023-07-10" + video_id: bhagIbz3T0A +- title: A pragmatic and simple approach to fixing a memory leak + raw_title: + RailsConf 2023 - A pragmatic and simple approach to fixing a memory leak + by Vincent Rolea + speakers: + - Vincent Rolea + description: + "Memory leaks do not come by often in modern Rails applications. But + when they do, the road to a fix can be tortuous: it often requires extensive knowledge + of memory management in Ruby, experience on profiling tools as well as properly + setup application monitoring. \n\nAs a developer working on Product, one does + not always have the bandwidth to learn about the subject, and setup custom tools: + project deadlines could be nearing, or your expertise needed on a shiny new project + that just came in. In this talk, I’ll walk you through a real memory leak issue + we encountered on one of our background worker, and how we fixed it with no custom + tooling using simple technics." + thumbnail_xs: https://i.ytimg.com/vi/bvdWPGQ8cEA/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/bvdWPGQ8cEA/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/bvdWPGQ8cEA/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/bvdWPGQ8cEA/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/bvdWPGQ8cEA/maxresdefault.jpg + published_at: "2023-07-10" + video_id: bvdWPGQ8cEA +- title: Don’t be afraid of the scary red error messages; they’re actually our friends + raw_title: + RailsConf 2023 - Don’t be afraid of the scary red error messages;... + by Shana Moore, Kait Sewell + speakers: + - Shana Moore + - Kait Sewell + description: |- + Don’t be afraid of the scary red error messages; they’re actually our friends. by Shana Moore, Kait Sewell + + How to use failures, errors and tests to enhance understanding and deliver quality code to clients. By not restricting ourselves to always perform perfectly we give ourselves the ability to discover new solutions. In this beginner-friendly talk we’ll walk through our missteps with light hearted reflection and share how to make a habit of growing from failure. Additionally, we hope to help the audience walk away with an actionable framework for handling the errors they'll encounter along the way. + thumbnail_xs: https://i.ytimg.com/vi/eS7OMjZaGoQ/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/eS7OMjZaGoQ/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/eS7OMjZaGoQ/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/eS7OMjZaGoQ/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/eS7OMjZaGoQ/maxresdefault.jpg + published_at: "2023-07-10" + video_id: eS7OMjZaGoQ +- title: Rails as a piece of birthday cake + raw_title: RailsConf 2023 - Rails as a piece of birthday cake by Vladimir Dementyev + speakers: + - Vladimir Dementyev + description: + "Ruby on Rails as a framework follows the Model-View-Controller design + pattern. Three core elements, like the number of layers in a traditional birthday + cake, are enough to “cook” web applications. However, on the long haul, the Rails + cake often resembles a crumble cake with the layers smeared and crumb-bugs all + around the kitchen-codebase.\n \nSimilarly to birthday cakes, adding new layers + is easier to do and maintain as the application grows than increasing the existing + layers in size.\n \nHow to extract from or add new layers to a Rails application? + What considerations should be taken into account? Why is rainbow cake the king + of layered cakes? Join my talk to learn about the layering Rails approach to keep + applications healthy and maintainable." + thumbnail_xs: https://i.ytimg.com/vi/fANjY7Hn_ig/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/fANjY7Hn_ig/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/fANjY7Hn_ig/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/fANjY7Hn_ig/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/fANjY7Hn_ig/maxresdefault.jpg + published_at: "2023-07-10" + video_id: fANjY7Hn_ig +- title: "Keynote: Leading through Change - When two cultures combine" + raw_title: + "RailsConf 2023 - Keynote: Leading through Change - When two cultures + combine by Shani Boston" + speakers: + - Shani Boston + description: + "Keynote: Leading through Change - When two cultures combine by Shani + Boston" + thumbnail_xs: https://i.ytimg.com/vi/hYFdPM3dUbk/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/hYFdPM3dUbk/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/hYFdPM3dUbk/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/hYFdPM3dUbk/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/hYFdPM3dUbk/maxresdefault.jpg + published_at: "2023-07-10" + video_id: hYFdPM3dUbk +- title: Off to the races + raw_title: RailsConf 2023 - Off to the races by Kyle d'Oliveira + speakers: + - Kyle d'Oliveira + description: + Race conditions are a natural hazard whenever working with shared resources. + If you have multiple processes such as using a database, or a microservice architecture, + there are likely some race conditions that are hiding in your code. As usage scales + up, they will become more and more common. They are difficult to detect, challenging + to reproduce and test, and sometimes downright hard to prove that it is fixed. + In this talk, we will dive into what a race condition is, how it can show up in + Rails applications, and some strategies on how to test them to give confidence + that they are fixed. + thumbnail_xs: https://i.ytimg.com/vi/jEDX3yswrcM/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/jEDX3yswrcM/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/jEDX3yswrcM/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/jEDX3yswrcM/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/jEDX3yswrcM/maxresdefault.jpg + published_at: "2023-07-10" + video_id: jEDX3yswrcM +- title: Lightning Talks + raw_title: RailsConf 2023 - Lightning Talks + speakers: + description: + A lightning talk is a short presentation (up to 5 mins) on your chosen + topic. + thumbnail_xs: https://i.ytimg.com/vi/k55B4ydueGE/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/k55B4ydueGE/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/k55B4ydueGE/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/k55B4ydueGE/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/k55B4ydueGE/maxresdefault.jpg + published_at: "2023-07-10" + video_id: k55B4ydueGE +- title: Offsite planning for Everyone + raw_title: RailsConf 2023 - Offsite planning for Everyone by Allison McMillan + speakers: + - Allison McMillan + description: + Over the past couple of years, we’ve all needed to sharpen the tools + in our virtual toolbelt. More companies than ever are providing employees with + the opportunity to work remotely… but how can we keep those individuals connected + - to each other and to the mission of the company and their team? Effective in-person + offsites are challenging and now we’re working to achieve the same alignment, + engagements, and happiness for our employees virtually as well. It may seem impossible, + but it’s not! In this session, you’ll learn about how to plan an effective offsite + (in-person or remote) and what specific planning considerations can be made to + make your virtual offsite just as good, if not better, than an in-person one. + Skeptics welcome!! + thumbnail_xs: https://i.ytimg.com/vi/ofqnAOiRwOw/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/ofqnAOiRwOw/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/ofqnAOiRwOw/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/ofqnAOiRwOw/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/ofqnAOiRwOw/maxresdefault.jpg + published_at: "2023-07-10" + video_id: ofqnAOiRwOw +- title: Migrating Shopify’s Core Rails Monolith to Trilogy + raw_title: + RailsConf 2023 - Migrating Shopify’s Core Rails Monolith to Trilogy by + Adrianna Chang + speakers: + - Adrianna Chang + description: |- + Trilogy is a client library for MySQL-compatible databases. It was open sourced along with an Active Record adapter by GitHub this past year. With promises of improved performance, better portability and compatibility, and fewer dependencies, Shopify’s Rails Infrastructure team decided to migrate our core Rails monolith from Mysql2 to Trilogy. + + In this talk, we’ll embark on a journey with database clients, Active Record adapters, and open source contributions. We’ll learn about MySQL protocols, dig into how the Active Record adapter manages the Trilogy client under the hood, and look at some of the missing features we implemented as we moved from Mysql2 to Trilogy. Finally, we’ll discuss the end result of migrating to Trilogy, and the impact it had on Shopify’s monolith in production. + thumbnail_xs: https://i.ytimg.com/vi/tHiIhZPKClI/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/tHiIhZPKClI/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/tHiIhZPKClI/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/tHiIhZPKClI/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/tHiIhZPKClI/maxresdefault.jpg + published_at: "2023-07-10" + video_id: tHiIhZPKClI +- title: A Ruby Community Podcast Live! + raw_title: + RailsConf 2023 - A Ruby Community Podcast Live! by Brittany Martin, Jason + Charnes & Paul Bahr + speakers: + - Brittany Martin + - Jason Charnes + - Paul Bahr + description: |- + Join Brittany Martin (The Ruby on Rails Podcast), Jason Charnes (Remote Ruby) and Paul Bahr (Peachtree Sound) as they interview guests from the community on a live podcast. + + Guest #1: Aaron Patterson, Senior Staff Engineer at Shopify + Guest #2: Irina Nazarova, CEO of Evil Martians + Guest #3: Voted on by the community in an online poll + Guest #4: Voted on by the community live at this session + + Audience questions and voting are welcome and encouraged! + thumbnail_xs: https://i.ytimg.com/vi/tNiqYktR8xo/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/tNiqYktR8xo/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/tNiqYktR8xo/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/tNiqYktR8xo/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/tNiqYktR8xo/maxresdefault.jpg + published_at: "2023-07-10" + video_id: tNiqYktR8xo +- title: RailsConr 2023 - Forging Your Path to Senior Developer + raw_title: RailsConr 2023 - Forging Your Path to Senior Developer by Ifat Ribon + speakers: + - Ifat Ribon + description: + You've mastered syntax and conventions, your team trusts your code, + and you're working on more complicated features. On more challenging tasks, you + often pair with your team lead, a senior developer who seems to know everything. + You think to yourself, that's who I want to be, how do I get there? Fear not, + mid-developer, that senior developer you admire was once in your shoes! This talk + will illuminate the path you're on, providing you guidance on following those + footsteps, or trailblazing your own, to achieve your objective of becoming a senior + developer. + thumbnail_xs: https://i.ytimg.com/vi/v0OLIzH3UAc/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/v0OLIzH3UAc/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/v0OLIzH3UAc/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/v0OLIzH3UAc/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/v0OLIzH3UAc/maxresdefault.jpg + published_at: "2023-07-10" + video_id: v0OLIzH3UAc +- title: + "Building Workplaces for Caregivers: Supporting Parents in Tech, Kinsey Durham + Grace" + raw_title: + "RailsConf 2023 - Building Workplaces for Caregivers: Supporting Parents + in Tech, Kinsey Durham Grace" + speakers: + - Kinsey Durham Grace + description: + We need to support parents in our organizations and ensure we keep + working parents happy and in the workplace. When parents are supported at work, + it’s better for them, their families and for our businesses. This talk walks through + the environment we are currently in and what tangible steps that we can all take + on our teams and for ourselves as parents in order to ensure that we are supported + in the workplace. The Rails community is always a leader in this space, so let’s + ensure our workplaces are the best that they can be. + thumbnail_xs: https://i.ytimg.com/vi/vMn4LGLNc4M/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/vMn4LGLNc4M/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/vMn4LGLNc4M/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/vMn4LGLNc4M/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/vMn4LGLNc4M/maxresdefault.jpg + published_at: "2023-07-10" + video_id: vMn4LGLNc4M +- title: "Merged PRs: An Untapped Resource for Practice and Exploration" + raw_title: + "RailsConf 2023 - Merged PRs: An Untapped Resource for Practice and Exploration + by Thomas Countz" + speakers: + - Thomas Countz + description: + "Debugging is one of the most powerful and necessary tools in a developer's + toolkit, and what better way to hone our Rails debugging skills than by using + real-world examples from the Rails codebase itself? \n\nIn this talk, we'll explore + how using merged PRs from the Rails codebase can help improve your debugging skills, + increase your familiarity with the framework, and build your confidence in navigating + complex issues. By leveraging the wealth of knowledge and experience within the + Rails community, you'll come away from this talk with a newfound appreciation + for the power of collaboration and the importance of community-driven development." + thumbnail_xs: https://i.ytimg.com/vi/vdZbQHz4pfk/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/vdZbQHz4pfk/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/vdZbQHz4pfk/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/vdZbQHz4pfk/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/vdZbQHz4pfk/maxresdefault.jpg + published_at: "2023-07-10" + video_id: vdZbQHz4pfk +- title: Teaching Capybara Testing - An Illustrated Adventure + raw_title: + RailsConf 2023 - Teaching Capybara Testing - An Illustrated Adventure + by Brandon Weaver + speakers: + - Brandon Weaver + description: |- + 100%! Red the lemur was so excited to have 100% test coverage, finally, after unit testing all of his Ruby code. With that, he was done, the code was tested, and he could call it a day. + + That was until a magical Capybara entered through his window and asked a question that changed his perceptions forever more: + + "But what about your end to end tests?" + + ...and when he did, everything broke, and he was enlightened. + + Join us on an illustrated adventure through the basics of end to end testing with Capybara. + thumbnail_xs: https://i.ytimg.com/vi/wWPxLJJlnmU/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/wWPxLJJlnmU/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/wWPxLJJlnmU/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/wWPxLJJlnmU/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/wWPxLJJlnmU/maxresdefault.jpg + published_at: "2023-07-10" + video_id: wWPxLJJlnmU +- title: The Math Every Programmer Needs + raw_title: RailsConf 2023 - The Math Every Programmer Needs by Joël Quenneville + speakers: + - Joël Quenneville + description: |- + Leave your fear of math behind along with the equations and symbols, we're headed to Ruby-land! On this whirlwind tour, we’ll explore how to write better conditionals with Boolean algebra, figure out how many test cases we need with combinatorics, a mental model for breaking down large tasks with graph theory, and more. + + You’ll leave this talk equipped to better do your job with some ideas, techniques, and mental models from the wonderfully practical world of discrete math. + thumbnail_xs: https://i.ytimg.com/vi/wzYYT40T8G8/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/wzYYT40T8G8/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/wzYYT40T8G8/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/wzYYT40T8G8/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/wzYYT40T8G8/maxresdefault.jpg + published_at: "2023-07-10" + video_id: wzYYT40T8G8 +- title: Zero downtime Rails upgrades + raw_title: RailsConf 2023 - Zero downtime Rails upgrades by Ali Ibrahim + speakers: + - Ali Ibrahim + description: |- + No one likes working on Rails upgrades, and who can blame them? They can be thankless, time-consuming, and—worst of all—unpredictable. How long will they take? When can we get back to feature work? What’ll break when they’re deployed? It’s tempting to say, “Let’s do it later,” but later is usually never. Instead of living in fear of the big, scary Rails upgrade, your team can set up systems for incremental change that let you: + + * continue feature work + * deliver predictable results + * seamlessly jump into the next upgrade (because there’s always a next upgrade) + + And I’m gonna show you how. + + In the years since I’ve worked on upgrading Rails at GitHub, I’ve refined this approach to Rails upgrades and successfully implemented it at several organizations. In this talk, you’ll learn everything you need to burn down uncertainty and boldly go into your next Rails upgrade. + thumbnail_xs: https://i.ytimg.com/vi/zHK-quUz-5M/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/zHK-quUz-5M/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/zHK-quUz-5M/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/zHK-quUz-5M/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/zHK-quUz-5M/maxresdefault.jpg + published_at: "2023-07-10" + video_id: zHK-quUz-5M +- title: Upgrading the Ruby Community + raw_title: RailsConf 2023 - Upgrading the Ruby Community by Pat Allan + speakers: + - Pat Allan + description: + From MINASWAN to Rails Camps, conference guides to Ruby Together, there’s + a long history of the Ruby community being wonderfully welcoming, thoughtful, + fun and supportive. Let’s make it even better, and discuss ways to have a persistent, + positive impact in the wider tech industry and beyond. + thumbnail_xs: https://i.ytimg.com/vi/10evYV5qT7c/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/10evYV5qT7c/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/10evYV5qT7c/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/10evYV5qT7c/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/10evYV5qT7c/maxresdefault.jpg + published_at: "2023-07-10" + video_id: 10evYV5qT7c +- title: Managing the Burnout Burndown + raw_title: RailsConf 2023 - Managing the Burnout Burndown by Anjuan Simmons + speakers: + - Anjuan Simmons + description: |- + In addition to managing backlogs and burndown charts, technology leaders have to follow an ever-changing software landscape, manage team dynamics, and navigate office politics. It’s no surprise that this leads to burnout. This talk will provide tools to help manage stress and reduce burnout. + + Developers are, almost by definition, highly capable and strongly driven individuals. These traits are indispensable to success in creating working code, but they are also the very traits that makes developers susceptible to burn out. People who can get things done often find themselves overwhelmed by their to-do lists. + + This talk will combine the understanding from the trenches of Anjuan Simmons (who has been a developer and engineering manager for more than 20 years) with the academic understanding of his wife, Dr. Aneika Simmons. Together, they will provide a framework for reducing burnout and consistently keeping stress levels in a managed state. + thumbnail_xs: https://i.ytimg.com/vi/BDnWcZobdrA/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/BDnWcZobdrA/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/BDnWcZobdrA/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/BDnWcZobdrA/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/BDnWcZobdrA/maxresdefault.jpg + published_at: "2023-07-10" + video_id: BDnWcZobdrA +- title: Taylor’s Guide to Big Rewrites + raw_title: RailsConf 2023 - Taylor’s Guide to Big Rewrites by Andy Croll + speakers: + - Andy Croll + description: |- + Taylorism, is a system of management advocated by Fred W. Taylor. The task of management, as he saw it, is to find the best way for the worker to do the job, with proper tools and training, and to provide incentives for good performance. + + There are certain things you’re meant to do in software projects and business. And certain things you’re not. A big rewrite of your app is one of the things you aren’t meant to do. + + Except that’s what we did with a team of 4 engineers, over an 18 month period, successfully migrating 2,500 customer’s data. + + How can we apply the learnings of Taylor, to a massive application rewrite? What did we do and what can you learn when you’re faced with a wild and woolly project? What about our business practises as well as our code helped us make a success of one of software’s shibboleths? + thumbnail_xs: https://i.ytimg.com/vi/G1QbH2QZX08/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/G1QbH2QZX08/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/G1QbH2QZX08/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/G1QbH2QZX08/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/G1QbH2QZX08/maxresdefault.jpg + published_at: "2023-07-10" + video_id: G1QbH2QZX08 +- title: How We Implemented Internal Salary Transparency (And Why It Matters) + raw_title: + RailsConf 2023 - How We Implemented Internal Salary Transparency ... + by Hilary Stohs Krause + speakers: + - Hilary Stohs Krause + description: + "How We Implemented Internal Salary Transparency (And Why It Matters) + by \nHilary Stohs-Krause\n\nMoney can be a prickly topic in the workplace, but + data shows it’s a conversation that many employees actively want started. Salary + transparency increases trust and job satisfaction, but getting there is easier + said than done. Here’s how we took the plunge, and what we learned along the way." + thumbnail_xs: https://i.ytimg.com/vi/MfGRm8Dm68g/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/MfGRm8Dm68g/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/MfGRm8Dm68g/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/MfGRm8Dm68g/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/MfGRm8Dm68g/maxresdefault.jpg + published_at: "2023-07-10" + video_id: MfGRm8Dm68g +- title: Keynote + raw_title: RailsConf 2023 - Keynote by Eileen Uchitelle + speakers: + - Eileen Uchitelle + description: Keynote by Eileen Uchitelle + thumbnail_xs: https://i.ytimg.com/vi/TKulocPqV38/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/TKulocPqV38/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/TKulocPqV38/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/TKulocPqV38/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/TKulocPqV38/maxresdefault.jpg + published_at: "2023-07-10" + video_id: TKulocPqV38 +- title: "Keynote: The Power of Improv: Unlocking Your Creative Potential as a.." + raw_title: + "RailsConf 2023 - Keynote: The Power of Improv: Unlocking Your Creative + Potential as a.. by Gary Ware" + speakers: + - Gary Ware + description: |- + Keynote: The Power of Improv: Unlocking Your Creative Potential as a Developer by Gary Ware + + This interactive keynote will explore how improvisation can help you maximize your strengths as a developer. We'll discuss the key elements of improvisation and how they can be used in your day to day life. We will also do a few quick activities to allow you to practice in real time in a low-stakes environment. By the end of this session, you will have gained valuable insight into how embracing an improvisational mindset can supercharge your ability to be more creative, collaborate with others, and get more enjoyment from your career. + thumbnail_xs: https://i.ytimg.com/vi/g6wrSpFFgmQ/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/g6wrSpFFgmQ/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/g6wrSpFFgmQ/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/g6wrSpFFgmQ/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/g6wrSpFFgmQ/maxresdefault.jpg + published_at: "2023-07-10" + video_id: g6wrSpFFgmQ +- title: + Mentorship Panel - Shana Moore, John Sawers, Ebun Segun, Erik Guzman & Adam + Cuppy + raw_title: + RailsConf 2023 - Mentorship Panel - Shana Moore, John Sawers, Ebun Segun, + Erik Guzman & Adam Cuppy + speakers: + - Shana Moore + - John Sawers + - Ebun Segun + - Erik Guzman + - Adam Cuppy + description: + Join us for a mentorship panel featuring four seasoned software developers + sharing their personal experiences as mentors and mentees. Attendees can expect + to gain insights on building mentor-mentee relationships and practical tips for + maximizing them while discovering the benefits of mentorship, how to approach + potential mentors, and effective communication strategies. + thumbnail_xs: https://i.ytimg.com/vi/lXhTh3BUuJE/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/lXhTh3BUuJE/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/lXhTh3BUuJE/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/lXhTh3BUuJE/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/lXhTh3BUuJE/maxresdefault.jpg + published_at: "2023-07-10" + video_id: lXhTh3BUuJE +- title: Mentorship in Three Acts + raw_title: RailsConf 2023 - Mentorship in Three Acts by Adam Cuppy + speakers: + - Adam Cuppy + description: + "\"Mentorship (ˈmɛntɔːˌʃɪp) Noun. a period during which a person receives + guidance from a mentor.\" Yeah, it seems clear enough.\n\nMore and more, teams + rely on mentorship to raise the skills of their under-experienced people. But + mentorship is not a catch-all solution and has its risks. Without training, poorly + structured mentorship can hurt the culture and stifle growth more than help. \n\nSo, + we need a model—a system. A process to lean into that makes it a helpful tool + and not a blunt hammer. This talk will cover the three stages of integrating a + mentorship program and how to help a hesitant team." + thumbnail_xs: https://i.ytimg.com/vi/nOhGMcjL0jk/default.jpg + thumbnail_sm: https://i.ytimg.com/vi/nOhGMcjL0jk/mqdefault.jpg + thumbnail_md: https://i.ytimg.com/vi/nOhGMcjL0jk/hqdefault.jpg + thumbnail_lg: https://i.ytimg.com/vi/nOhGMcjL0jk/sddefault.jpg + thumbnail_xl: https://i.ytimg.com/vi/nOhGMcjL0jk/maxresdefault.jpg + published_at: "2023-07-10" + video_id: nOhGMcjL0jk diff --git a/data/speakers.yml b/data/speakers.yml index 9dbcc471..ae4c37b7 100644 --- a/data/speakers.yml +++ b/data/speakers.yml @@ -1,4 +1,386 @@ --- +- name: Xavier Noria + twitter: '' + github: fxn + bio: '' + website: '' + slug: xavier-noria +- name: Joel Hawksley + twitter: joelhawksley + github: joelhawksley + bio: Staff Software Engineer at @github, creator of ViewComponent. + website: https://hawksley.org + slug: joel-hawksley +- name: David Hill + twitter: '' + github: dajohi + bio: '' + website: '' + slug: david-hill +- name: Chris Salzberg + twitter: '' + github: shioyama + bio: '' + website: '' + slug: chris-salzberg +- name: Brad Urani + twitter: '' + github: bradurani + bio: '' + website: '' + slug: brad-urani +- name: Cameron Dutro + twitter: '' + github: camertron + bio: '' + website: https://twitter.com/camertron + slug: cameron-dutro +- name: Aaron Patterson + twitter: tenderlove + github: tenderlove + bio: "\U0001F498\U0001F499\U0001F49C\U0001F497\U0001F49A❤\U0001F493\U0001F49B\U0001F49A\U0001F497" + website: https://tenderlovemaking.com/ + slug: aaron-patterson +- name: Thomas Countz + twitter: '' + github: Thomascountz + bio: '' + website: '' + slug: thomas-countz +- name: Casey Watts + twitter: '' + github: caseywatts + bio: '' + website: '' + slug: casey-watts +- name: John DeWyze + twitter: '' + github: dewyze + bio: '' + website: '' + slug: john-dewyze +- name: Mina Slater + twitter: '' + github: minaslater + bio: '' + website: '' + slug: mina-slater +- name: Charles Oliver Nutter + twitter: '' + github: headius + bio: '' + website: '' + slug: charles-oliver-nutter +- name: Annie Lydens + twitter: '' + github: aelydens + bio: '' + website: '' + slug: annie-lydens +- name: Jenny Allar + twitter: '' + github: JennyAllar + bio: '' + website: '' + slug: jenny-allar +- name: Andy Glass + twitter: '' + github: Andrewglass1 + bio: '' + website: andyglass.net + slug: andy-glass +- name: Chuck Lauer Vose + twitter: '' + github: vosechu + bio: '' + website: '' + slug: chuck-lauer-vose +- name: Nathan Griffith + twitter: smudgethefirst + github: smudge + bio: professional code deleter + website: http://ngriffith.com + slug: nathan-griffith +- name: Jamie Gaskins + twitter: '' + github: jgaskins + bio: '' + website: '' + slug: jamie-gaskins +- name: Colin Loretz + twitter: '' + github: colinloretz + bio: '' + website: '' + slug: colin-loretz +- name: Eileen Uchitelle + twitter: '' + github: eileencodes + bio: '' + website: '' + slug: eileen-uchitelle +- name: Cristian Planas + twitter: '' + github: Gawyn + bio: '' + website: '' + slug: cristian-planas +- name: Gui Vieira + twitter: '' + github: guialbuk + bio: Senior Software Developer + website: '' + slug: gui-vieira +- name: Ian Norris + twitter: icStatic + github: IanNorris + bio: Hi, I work for Rare Ltd as a Senior Software Engineer. Here are some of my + personal projects. + website: www.inorris.com + slug: ian-norris +- name: Melissa Hunt Glickman + twitter: '' + github: mhuntglickman + bio: '' + website: '' + slug: melissa-hunt-glickman +- name: Kevin Murphy + twitter: kevin_j_m + github: kevin-j-m + bio: '' + website: https://kevinjmurphy.com/ + slug: kevin-murphy +- name: Andy Andrea + twitter: '' + github: andycandrea + bio: '' + website: '' + slug: andy-andrea +- name: Ashley Ellis Pierce + twitter: '' + github: aellispierce + bio: '' + website: '' + slug: ashley-ellis-pierce +- name: Betty Li + twitter: '' + github: bettymakes + bio: Developer at @Shopify + website: '' + slug: betty-li +- name: Justin Bowen + twitter: '' + github: TonsOfFun + bio: '' + website: '' + slug: justin-bowen +- name: Nick Schwaderer + twitter: '' + github: Schwad + bio: '' + website: '' + slug: nick-schwaderer +- name: Andrea Fomera + twitter: '' + github: afomera + bio: '' + website: '' + slug: andrea-fomera +- name: Amy Newell + twitter: '' + github: amynewell + bio: '' + website: '' + slug: amy-newell +- name: Kevin Lesht + twitter: '' + github: klesht + bio: '' + website: '' + slug: kevin-lesht +- name: Wrapbook + twitter: '' + github: wrapbook + bio: '' + website: '' + slug: wrapbook +- name: Zaid Zawaideh + twitter: '' + github: zawaideh + bio: '' + website: '' + slug: zaid-zawaideh +- name: Jessica Lawrence + twitter: '' + github: jmlawrence1971 + bio: '' + website: '' + slug: jessica-lawrence +- name: Ontra + twitter: '' + github: Ontra-ai + bio: '' + website: https://ontra.ai + slug: ontra +- name: Carrick Rogers + twitter: '' + github: carrickr + bio: '' + website: '' + slug: carrick-rogers +- name: Weedmaps + twitter: '' + github: GhostGroup + bio: '' + website: weedmaps.com + slug: weedmaps +- name: Jake Anderson + twitter: '' + github: JediJakeIsCOOL + bio: "Software Developer -\r\nWannabe Jedi - Tries to be funny and sometimes succeeds " + website: jakeandersonwebdevelopment.com + slug: jake-anderson +- name: Andrew Atkinson + twitter: andatki + github: andyatkinson + bio: '' + website: andyatkinson.com + slug: andrew-atkinson +- name: Thijs Cadier + twitter: '' + github: thijsc + bio: '' + website: '' + slug: thijs-cadier +- name: Kevin Menard + twitter: '' + github: nirvdrum + bio: '' + website: '' + slug: kevin-menard +- name: Stephen Prater + twitter: '' + github: stephenprater + bio: '' + website: '' + slug: stephen-prater +- name: Daniel Magliola + twitter: dmagliola + github: dmagliola + bio: "Life-long coder, expert procrastinator, obsessed with code performance and + weird Lego machinery.\r\n\r\nOccasionally seen speaking at conferences." + website: http://danielmagliola.com + slug: daniel-magliola +- name: Daniel Colson + twitter: '' + github: composerinteralia + bio: '' + website: danieljamescolson.com + slug: daniel-colson +- name: John Crepezzi + twitter: '' + github: seejohnrun + bio: '' + website: '' + slug: john-crepezzi +- name: Vaidehi Joshi + twitter: vaidehijoshi + github: vaidehijoshi + bio: programmer, writer, teacher. + website: http://www.vaidehi.com + slug: vaidehi-joshi +- name: Andy Croll + twitter: '' + github: andycroll + bio: '' + website: '' + slug: andy-croll +- name: Adam Cuppy + twitter: '' + github: acuppy + bio: '' + website: '' + slug: adam-cuppy +- name: Joël Quenneville + twitter: '' + github: JoelQ + bio: '' + website: '' + slug: joel-quenneville +- name: Maeve Revels + twitter: '' + github: maeve + bio: '' + website: '' + slug: maeve-revels +- name: Alex Evanczuk + twitter: '' + github: alexevanczuk + bio: '' + website: '' + slug: alex-evanczuk +- name: David Copeland + twitter: '' + github: davetron5000 + bio: CTO @ Mood Health. Former Chief Software Architect at Stitch Fix. Author of + "Agile Web Development with Rails", and “The Senior Software Engineer" + website: http://www.naildrivin5.com + slug: david-copeland +- name: Sean Marcia + twitter: '' + github: seanmarcia + bio: '' + website: '' + slug: sean-marcia +- name: Maple Ong + twitter: '' + github: wildmaples + bio: '' + website: '' + slug: maple-ong +- name: Atob + twitter: '' + github: Atober + bio: '' + website: '' + slug: atob +- name: Justin Powers + twitter: '' + github: dangerp + bio: '' + website: '' + slug: justin-powers +- name: Eric Weinstein + twitter: '' + github: ericqweinstein + bio: Director, Engineering at HashiCorp. I enjoy writing Clojure, Elixir, Elm, Haskell, + Idris, and Ruby. + website: http://ericweinste.in/ + slug: eric-weinstein +- name: Vladimir Dementyev + twitter: palkan_tula + github: palkan + bio: "Code & Cats & Rock'n'Roll!\r\n" + website: https://twitter.com/palkan_tula + slug: vladimir-dementyev +- name: Jason Charnes + twitter: '' + github: jasoncharnes + bio: '' + website: '' + slug: jason-charnes +- name: Brandon Weaver + twitter: '' + github: baweaver + bio: Ruby and Javascript at Gusto + website: https://ruby.social/@baweaver + slug: brandon-weaver +- name: Chelsea Kaufman + twitter: '' + github: c-kaufman + bio: '' + website: '' + slug: chelsea-kaufman - name: David Heinemeier Hansson twitter: '' github: dhh @@ -20,13 +402,15 @@ - name: Nick Quaranto twitter: qrush github: qrush - bio: A short, sturdy creature fond of drink and industry. Started rubygems.org a while back. Still writing Ruby 13 years later. + bio: A short, sturdy creature fond of drink and industry. Started rubygems.org a + while back. Still writing Ruby 13 years later. website: http://quaran.to slug: nick-quaranto - name: Obie Fernandez twitter: obie github: obie - bio: Consultant, 25+ year veteran of professional software development, serial entrepreneur, and best-selling author. Currently serving as Founder & CEO of RCRDSHP + bio: Consultant, 25+ year veteran of professional software development, serial entrepreneur, + and best-selling author. Currently serving as Founder & CEO of RCRDSHP website: http://obiefernandez.com slug: obie-fernandez - name: Ezra Zygmuntowicz @@ -86,19 +470,22 @@ - name: Olivier Lacan twitter: '' github: olivierlacan - bio: 'Shields.io creator, @rails & @ruby contributor, built Code School, maintaining @keepachangelog. ' + bio: 'Shields.io creator, @rails & @ruby contributor, built Code School, maintaining + @keepachangelog. ' website: http://olivierlacan.com slug: olivier-lacan - name: Michael Hartl twitter: mhartl github: mhartl - bio: Author of the @railstutorial, founder of @learnenough, @softcover, and Tau Day. + bio: Author of the @railstutorial, founder of @learnenough, @softcover, and Tau + Day. website: https://www.michaelhartl.com/ slug: michael-hartl - name: Andy Maleh twitter: AndyObtiva github: AndyObtiva - bio: Lexoper. Fukuoka Ruby Winner. RailsConf / RubyConf / Agile / EclipseCon / EclipseWorld Speaker. MS in SE from DePaul / BS in CS from McGill. Drummer/Snowboarder + bio: Lexoper. Fukuoka Ruby Winner. RailsConf / RubyConf / Agile / EclipseCon / EclipseWorld + Speaker. MS in SE from DePaul / BS in CS from McGill. Drummer/Snowboarder website: https://andymaleh.blogspot.com slug: andy-maleh - name: Thomas Pomfret @@ -164,13 +551,14 @@ - name: Will Leinweber twitter: '' github: will - bio: '                    ه҈ͣفͤ҈ͥ҉ͦ҈ͧ҉ͨ҈ͩ҉ͪ҈ͫ҉ͬ҈ͭ҉ͮ҈ͯ҉ͨ҈ͬ҉ͧ҈ͣ҉ͨ҈ͧ҉ͯ҈ͮ҉ͭ҈ͤ҉ͦ҈ͥ҉ͧ҈ͩ҉ͭ҈ͨ҉ͣ҈ͪ҉ͧ҈ͭ҉ͩ҈ͤ҉ͮ҈ͯ҉ͬ҈ͭ҉ͦ҈ͨ҉ͥ҈ͯ҉ͧ҈ͫ҉ͭ҈ͯ҉ͦ҈ͥ҉ͧ҈ͩ҉ͭ҈ͨ҉ͣ҈ͪ҉ͧ҈ͭ҉ͩ҈ͤ҉ͮ҈ͯ҉ͧ҈ͣ҉ͨ҈ͧ҉ͯ҈ͮ҉ͭ҈ͤ҉' + bio: "                    ه҈ͣفͤ҈ͥ҉ͦ҈ͧ҉ͨ҈ͩ҉ͪ҈ͫ҉ͬ҈ͭ҉ͮ҈ͯ҉ͨ҈ͬ҉ͧ҈ͣ҉ͨ҈ͧ҉ͯ҈ͮ҉ͭ҈ͤ҉ͦ҈ͥ҉ͧ҈ͩ҉ͭ҈ͨ҉ͣ҈ͪ҉ͧ҈ͭ҉ͩ҈ͤ҉ͮ҈ͯ҉ͬ҈ͭ҉ͦ҈ͨ҉ͥ҈ͯ҉ͧ҈ͫ҉ͭ҈ͯ҉ͦ҈ͥ҉ͧ҈ͩ҉ͭ҈ͨ҉ͣ҈ͪ҉ͧ҈ͭ҉ͩ҈ͤ҉ͮ҈ͯ҉ͧ҈ͣ҉ͨ҈ͧ҉ͯ҈ͮ҉ͭ҈ͤ҉" website: http://bitfission.com slug: will-leinweber - name: Richard Huang twitter: flyerhzm github: flyerhzm - bio: "Founder at synvert.net and awesomecode.io\r\n\r\nSpeaker of RailsConf and RubyConf" + bio: "Founder at synvert.net and awesomecode.io\r\n\r\nSpeaker of RailsConf and + RubyConf" website: https://synvert.net slug: richard-huang - name: Mike Moore @@ -182,7 +570,8 @@ - name: Mark Bates twitter: '' github: markbates - bio: Mark Bates is a full stack web developer with over 18 years of experience building high quality scalable applications for companies. + bio: Mark Bates is a full stack web developer with over 18 years of experience building + high quality scalable applications for companies. website: http://www.metabates.com slug: mark-bates - name: Sarah Mei @@ -194,13 +583,15 @@ - name: Josh Kalderimis twitter: '' github: joshk - bio: "Previously VP of Product at @travis-ci and VP of Product at @replicatedcom / \r\nContinuously Shaking It Off" + bio: "Previously VP of Product at @travis-ci and VP of Product at @replicatedcom + / \r\nContinuously Shaking It Off" website: '' slug: josh-kalderimis - name: Lance Ball twitter: lanceball github: lance - bio: "I write software, cook food, exercise, take pictures, grow things.\r\n\r\nRed Hat\r\nHe/him/his\r\n" + bio: "I write software, cook food, exercise, take pictures, grow things.\r\n\r\nRed + Hat\r\nHe/him/his\r\n" website: https://lanceball.dev slug: lance-ball - name: Kenta Murata @@ -218,7 +609,8 @@ - name: David Czarnecki twitter: CzarneckiD github: czarneckid - bio: Engineering @wbgamesny • Gamer • Foodie • Author • Marathoner • Snowboarder • Beekeeper + bio: Engineering @wbgamesny • Gamer • Foodie • Author • Marathoner • Snowboarder + • Beekeeper website: https://davidczarnecki.com slug: david-czarnecki - name: Matt Sanders @@ -257,12 +649,6 @@ bio: Ruby and Elixir enthusiast living in the Seattle area. website: http://www.daniel-azuma.com/ slug: daniel-azuma -- name: Aaron Patterson - twitter: tenderlove - github: tenderlove - bio: "\U0001F498\U0001F499\U0001F49C\U0001F497\U0001F49A❤\U0001F493\U0001F49B\U0001F49A\U0001F497" - website: https://tenderlovemaking.com/ - slug: aaron-patterson - name: Rich Hickey twitter: '' github: richhickey @@ -290,7 +676,9 @@ - name: Zach Briggs twitter: '' github: theotherzach - bio: Zach Briggs has farmed, sorted mail 2nd shift, fixed industrial equipment, and created predictive models. Now he's slinging JavaScript, CSS, and Ruby for Bravo. + bio: Zach Briggs has farmed, sorted mail 2nd shift, fixed industrial equipment, + and created predictive models. Now he's slinging JavaScript, CSS, and Ruby for + Bravo. website: theotherzach.com slug: zach-briggs - name: John Duff @@ -302,7 +690,8 @@ - name: Allan Grant twitter: allangrant github: allangrant - bio: Hacker/Entrepreneur. Coding since 1990. Started a few companies, like Hired.com and Talkable.com. More than a little crazy. + bio: Hacker/Entrepreneur. Coding since 1990. Started a few companies, like Hired.com + and Talkable.com. More than a little crazy. website: http://www.talkable.com slug: allan-grant - name: Carl Lerche @@ -404,7 +793,8 @@ - name: Brandon Black twitter: brndnblck github: brndnblck - bio: "Software Engineering Leader, Founder, Coffee and K9 Enthusiast \U0001F43E ☕️" + bio: "Software Engineering Leader, Founder, Coffee and K9 Enthusiast \U0001F43E + ☕️" website: http://brblck.com slug: brandon-black - name: Shai Rosenfeld @@ -422,7 +812,8 @@ - name: Pat Allen twitter: layer8packet github: pallen182 - bio: Network guy trying to learn some coding to help build new/better skills. Host of Breaking Down the Bytes Podcast. Here to learn. + bio: Network guy trying to learn some coding to help build new/better skills. Host + of Breaking Down the Bytes Podcast. Here to learn. website: https://breakingbytespod.io slug: pat-allen - name: Yoko Harada @@ -434,7 +825,8 @@ - name: Richard Schneeman twitter: schneems github: schneems - bio: "Ruby core contributor. Learn how to contribute to open source with my app CodeTriage (free) and my book How to Open Source (paid), links below \U0001F447\U0001F3FB" + bio: "Ruby core contributor. Learn how to contribute to open source with my app + CodeTriage (free) and my book How to Open Source (paid), links below \U0001F447\U0001F3FB" website: https://www.schneems.com slug: richard-schneeman - name: Ben Orenstein @@ -452,7 +844,8 @@ - name: Prem Sichanugrist twitter: '' github: sikachu - bio: "I contribute to open source projects, mostly in Ruby.\r\nPGP: 889C 472F 2DA2 8377" + bio: "I contribute to open source projects, mostly in Ruby.\r\nPGP: 889C 472F 2DA2 + 8377" website: https://sikac.hu slug: prem-sichanugrist - name: Ryan Twomey @@ -488,7 +881,8 @@ - name: Michael Murphy twitter: mmstick github: mmstick - bio: System76 product engineer, Pop!_OS maintainer, Linux software developer, Rust programmer + bio: System76 product engineer, Pop!_OS maintainer, Linux software developer, Rust + programmer website: '' slug: michael-murphy - name: Terence Lee @@ -524,7 +918,8 @@ - name: Nicholas Henry twitter: nicholasjhenry github: nicholasjhenry - bio: Independent Contractor, developing tailored business applications with Elixir and PostgreSQL. + bio: Independent Contractor, developing tailored business applications with Elixir + and PostgreSQL. website: https://www.linkedin.com/in/nicholasjhenry/ slug: nicholas-henry - name: Liana Leahy @@ -548,7 +943,8 @@ - name: Akira Matsuda twitter: a_matsuda github: amatsuda - bio: "@ruby / @rails committer,\r\nAuthor of @kaminari,\r\nFounder of @asakusarb,\r\nChief Organizer of @rubykaigi " + bio: "@ruby / @rails committer,\r\nAuthor of @kaminari,\r\nFounder of @asakusarb,\r\nChief + Organizer of @rubykaigi " website: https://twitter.com/a_matsuda slug: akira-matsuda - name: Bradly Feeley @@ -560,7 +956,8 @@ - name: Coraline Ada Ehmke twitter: CoralineAda github: CoralineAda - bio: Internationally acclaimed speaker, developer, writer, and podcaster. Creator of Contributor Covenant and Hippocratic License. Ruby Hero. Big time troublemaker. + bio: Internationally acclaimed speaker, developer, writer, and podcaster. Creator + of Contributor Covenant and Hippocratic License. Ruby Hero. Big time troublemaker. website: http://where.coraline.codes/ slug: coraline-ada-ehmke - name: Starr Horne @@ -578,7 +975,8 @@ - name: Pete Hodgson twitter: ph1 github: moredip - bio: Independent consultant helping engineering teams tackle thorny problems. Formerly Earnest, ThoughtWorks + bio: Independent consultant helping engineering teams tackle thorny problems. Formerly + Earnest, ThoughtWorks website: thepete.net slug: pete-hodgson - name: Jeremy Green @@ -602,7 +1000,8 @@ - name: Rosie Hoyem twitter: '' github: rosiehoyem - bio: Urban planner turned energy policy wonk turned Rails developer turned data scientist. Proud graduate of the FlatironSchool and Metis. + bio: Urban planner turned energy policy wonk turned Rails developer turned data + scientist. Proud graduate of the FlatironSchool and Metis. website: https://rosiehoyem.herokuapp.com slug: rosie-hoyem - name: Sonja Hall @@ -638,7 +1037,8 @@ - name: Jessica Eldredge twitter: '' github: jessabean - bio: 'Front-end engineer, little free library enthusiast, extroverted introvert. I still like CSS. ' + bio: 'Front-end engineer, little free library enthusiast, extroverted introvert. + I still like CSS. ' website: https://jessabean.dev slug: jessica-eldredge - name: Cameron Daigle @@ -668,7 +1068,8 @@ - name: Justin Searls twitter: searls github: searls - bio: I catch bugs and make bugs and strive to catch more bugs than I make. I co-founded @testdouble, which is a really good software consultancy I think. + bio: I catch bugs and make bugs and strive to catch more bugs than I make. I co-founded + @testdouble, which is a really good software consultancy I think. website: justin.searls.co slug: justin-searls - name: Eric Saxby @@ -692,15 +1093,10 @@ - name: Leah Silber twitter: wifelette github: wifelette - bio: 'Co-founder and CEO at @tildeio, EmberConf and RustConf Organizer, @emberjs Core Team, @jQuery Core Team alum, RailsConf alum, and all around technophile. ' + bio: 'Co-founder and CEO at @tildeio, EmberConf and RustConf Organizer, @emberjs + Core Team, @jQuery Core Team alum, RailsConf alum, and all around technophile. ' website: '' slug: leah-silber -- name: Sean Marcia - twitter: '' - github: seanmarcia - bio: '' - website: https://rubyforgood.org - slug: sean-marcia - name: Nickolas Means twitter: nmeans github: nmeans @@ -710,7 +1106,8 @@ - name: Jason Clark twitter: jaclark github: jasonclark - bio: librarian, professor, hacker/developer, Semantic Web + metadata + archives geek, author, husband, dad - doing it all under the Big Sky. he/him + bio: librarian, professor, hacker/developer, Semantic Web + metadata + archives + geek, author, husband, dad - doing it all under the Big Sky. he/him website: www.jasonclark.info slug: jason-clark - name: Luke Francl @@ -728,7 +1125,7 @@ - name: Carlos Souza twitter: caike github: caike - bio: '@idopterlabs @wowica ' + bio: "@idopterlabs @wowica " website: https://csouza.me slug: carlos-souza - name: David Rogers @@ -782,7 +1179,7 @@ - name: Chris Hunt twitter: chrishunt github: chrishunt - bio: '@anrok, @stripe, @coinbase, @github, @square, @omgnetwork ' + bio: "@anrok, @stripe, @coinbase, @github, @square, @omgnetwork " website: http://www.chrishunt.co slug: chris-hunt - name: Greg Baugues @@ -794,15 +1191,10 @@ - name: Michael Norton twitter: '' github: Norton-Design - bio: "Software Engineer | \r\nReact, JavaScript, Python, Ruby, Node, Flask, Rails, Postgres, Sass" + bio: "Software Engineer | \r\nReact, JavaScript, Python, Ruby, Node, Flask, Rails, + Postgres, Sass" website: https://norton-design.github.io/ slug: michael-norton -- name: Xavier Noria - twitter: fxn - github: fxn - bio: Everlasting student · Rails Core · Fukuoka Ruby Award · Ruby Hero Award · Freelance · Life lover - website: https://hashref.com - slug: xavier-noria - name: Aaron Bedra twitter: abedra github: abedra @@ -845,12 +1237,6 @@ bio: '' website: chrismccord.com slug: chris-mccord -- name: Adam Cuppy - twitter: adamcuppy - github: acuppy - bio: Master of Smile Generation. Husband. Speaker. Software Engineer. - website: https://adamcuppy.com - slug: adam-cuppy - name: Bree Thomas twitter: '' github: breethomas @@ -878,13 +1264,15 @@ - name: Ryan Bigg twitter: ryanbigg github: radar - bio: Award-winning super-hero published author with a Ruby addiction, a love for TypeScript and React, and extreme fondness for Elixir. + bio: Award-winning super-hero published author with a Ruby addiction, a love for + TypeScript and React, and extreme fondness for Elixir. website: http://ryanbigg.com slug: ryan-bigg - name: Shibata Hiroshi twitter: hsbt github: hsbt - bio: "Full-time OSS developer. I'm a member of Ruby core team, RubyGems team and rbenv and ruby-build maintainer.\r\n" + bio: "Full-time OSS developer. I'm a member of Ruby core team, RubyGems team and + rbenv and ruby-build maintainer.\r\n" website: https://www.hsbt.org/ slug: shibata-hiroshi - name: Nate Berkopec @@ -923,16 +1311,11 @@ bio: "Managing partner at Dragonfly.\r\nPreviously @airbnb, @earndotcom, Metastable." website: http://haseebq.com slug: haseeb-qureshi -- name: Eileen Uchitelle - twitter: eileencodes - github: eileencodes - bio: "@Rails Core Team | \r\nRuby & Rails Infrastructure Team @shopify" - website: http://eileencodes.com - slug: eileen-uchitelle - name: Alex Kitchens twitter: '' github: alexcameron89 - bio: 'Lead Engineer at @stitchfix. I currently favor the RRTCC stack: Ruby, Rust, Tex-Mex, Coffee, Chocolate' + bio: 'Lead Engineer at @stitchfix. I currently favor the RRTCC stack: Ruby, Rust, + Tex-Mex, Coffee, Chocolate' website: http://alexkitchens.net slug: alex-kitchens - name: Krista Nelson @@ -950,7 +1333,8 @@ - name: Andrew Hao twitter: andrewhao github: andrewhao - bio: "Engineering at YouTube. Formerly @lyft, @carbonfive. Co-founder @Wejoinin. \r\n" + bio: "Engineering at YouTube. Formerly @lyft, @carbonfive. Co-founder @Wejoinin. + \r\n" website: http://www.g9labs.com slug: andrew-hao - name: Taylor Jones @@ -968,13 +1352,15 @@ - name: Michael Cain twitter: MCain310 github: Cain310 - bio: "Director of Blockchain @staratlasmeta \r\n Software Engineer | Bitcoin | RealEstate \U0001F596 \r\n\r\nBackend JS | Rust | Solana." + bio: "Director of Blockchain @staratlasmeta \r\n Software Engineer | Bitcoin | RealEstate + \U0001F596 \r\n\r\nBackend JS | Rust | Solana." website: www.linkedin.com/in/michael-cain-9902ba2 slug: michael-cain - name: Jess Rudder twitter: '' github: JessRudder - bio: I write code @github and talk code at http://youtube.com/compchomp. In my spare time I snap photos of random mammals while running really, really far. + bio: I write code @github and talk code at http://youtube.com/compchomp. In my spare + time I snap photos of random mammals while running really, really far. website: http://jessrudder.github.io slug: jess-rudder - name: Don Werve @@ -1004,7 +1390,8 @@ - name: Jesse James twitter: marginalchaos github: jrjamespdx - bio: 'He/Him, #blacklivesmatter, Software Architect and Team Lead Software Engineer, veteran, lover of gatos and doggos, and lifter of heavy things.' + bio: 'He/Him, #blacklivesmatter, Software Architect and Team Lead Software Engineer, + veteran, lover of gatos and doggos, and lifter of heavy things.' website: '' slug: jesse-james - name: Jonan Scheffler @@ -1037,16 +1424,11 @@ bio: 'Software is a team sport. ' website: '' slug: katie-walsh -- name: Vaidehi Joshi - twitter: vaidehijoshi - github: vaidehijoshi - bio: programmer, writer, teacher. - website: http://www.vaidehi.com - slug: vaidehi-joshi - name: Ju Liu twitter: arkh4m github: Arkham - bio: "Italian. I try to write code that doesn't suck. I rarely succeed. I like to climb \U0001F9D7" + bio: "Italian. I try to write code that doesn't suck. I rarely succeed. I like to + climb \U0001F9D7" website: https://juliu.is slug: ju-liu - name: Kevin Yank @@ -1064,15 +1446,10 @@ - name: Craig Buchek twitter: CraigBuchek github: booch - bio: Independent contractor, focusing on Ruby, Rails (especially rescue projects), Agile, and DevOps. More repos at @boochtek. + bio: Independent contractor, focusing on Ruby, Rails (especially rescue projects), + Agile, and DevOps. More repos at @boochtek. website: http://craigbuchek.com slug: craig-buchek -- name: Andy Glass - twitter: '' - github: Andrewglass1 - bio: '' - website: andyglass.net - slug: andy-glass - name: James Adam twitter: lazyatom github: lazyatom @@ -1133,12 +1510,6 @@ bio: '' website: http://paulzaich.com slug: paul-zaich -- name: Jamie Gaskins - twitter: jamie_gaskins - github: jgaskins - bio: '*not actually an axolotl' - website: https://zomglol.wtf/@jamie - slug: jamie-gaskins - name: Christian Bruckmayer twitter: bruckmayer github: ChrisBr @@ -1151,69 +1522,1511 @@ bio: Ruby Enthusiast website: '' slug: eric-hayes -- name: John Crepezzi - twitter: '' - github: seejohnrun - bio: I'm a developer @github where I develop software that helps developers develop software. - website: http://johncrepezzi.com - slug: john-crepezzi -- name: Andy Croll +- name: Ryan Biggs twitter: '' - github: andycroll - bio: CTO at CoverageBook, Rubyist, Conference Organizer, Author, Speaker, Bootstrapper & Parent of Twins. - website: http://andycroll.com/ - slug: andy-croll -- name: Melissa Hunt Glickman + github: RyanBiggs + bio: "Soon to be Computer Science graduate @ LJMU\r\n" + website: ryanbiggs.co.uk + slug: ryan-biggs +- name: Ryan Brunner twitter: '' - github: mhuntglickman - bio: 'Senior Full Stack Engineer and accomplished professional with a passion for delivering robust and reliable web applications. ' + github: ryanbrunner + bio: '' website: '' - slug: melissa-hunt-glickman -- name: Andy Andrea + slug: ryan-brunner +- name: Felix Dominguez twitter: '' - github: andycandrea - bio: https://gitlab.com/andy.andrea - website: https://www.linkedin.com/in/andycandrea - slug: andy-andrea -- name: Ashley Ellis Pierce + github: dacat + bio: '' + website: '' + slug: felix-dominguez +- name: Reid Morrison + twitter: reidmorrison + github: reidmorrison + bio: Pragmatic Ruby expert with over 15 years of experience designing and developing + scalable, performant, reliable, high quality software. + website: https://www.linkedin.com/in/reidmorrison/ + slug: reid-morrison +- name: Evan Dorn + twitter: '' + github: IdahoEv + bio: Scientist, engineer, developer and all around weirdo. + website: http://idahoev.com + slug: evan-dorn +- name: Jay Moorthi + twitter: '' + github: semipermeable + bio: '' + website: https://www.solanolabs.com + slug: jay-moorthi +- name: Rod Paddock + twitter: '' + github: rodpaddock + bio: '' + website: '' + slug: rod-paddock +- name: Sam Woodard twitter: '' - github: aellispierce + github: shwoodard + bio: '' + website: google.com + slug: sam-woodard +- name: Matt Rogish + twitter: '' + github: MattRogish + bio: '' + website: mattrogish.com + slug: matt-rogish +- name: Brad Wilkening + twitter: '' + github: bwilken bio: '' website: '' - slug: ashley-ellis-pierce -- name: Betty Li + slug: brad-wilkening +- name: Matt Conway twitter: '' - github: bettymakes - bio: Developer at @Shopify + github: wr0ngway + bio: '' + website: http://cloudtruth.com + slug: matt-conway +- name: Evan Phoenix + twitter: '' + github: evanphx + bio: '' + website: http://blog.fallingsnow.net + slug: evan-phoenix +- name: Joseph Ruscio + twitter: '' + github: josephruscio + bio: '' + website: https://www.heavybit.com/ + slug: joseph-ruscio +- name: Hampton Catlin + twitter: '' + github: HamptonMakes + bio: "CTO of @thriveworks. Co-creator of Sass CSS and Haml.\r\n" + website: https://tech.lgbt/@hampton + slug: hampton-catlin +- name: James Edward Gray + twitter: '' + github: JEG2 + bio: '' + website: http://graysoftinc.com/ + slug: james-edward-gray +- name: Josh Susser + twitter: '' + github: joshsusser + bio: '' + website: http://blog.hasmanythrough.com + slug: josh-susser +- name: David Brady + twitter: dbrady + github: dbrady + bio: I once wrote a perl script in Reno, just to watch it die(); + website: http://www.whydavewhy.com/ + slug: david-brady +- name: Justin Gordon + twitter: railsonmaui + github: justin808 + bio: Aloha! Older blog at RailsOnMaui.com. Created shakacode/react_on_rails! and + reactrails.com. CEO and founder of @shakacode! and HiChee.com + website: http://www.shakacode.com + slug: justin-gordon +- name: Nitin Dhaware + twitter: '' + github: nitinzd + bio: Founder and directer Neuro dynamic infotronics PVT,LTD + website: http://www.ndinfotronics.com + slug: nitin-dhaware +- name: Jess Szmajda + twitter: jszmajda + github: jszmajda + bio: '' website: '' - slug: betty-li -- name: Justin Bowen + slug: jess-szmajda +- name: Keith Pitt + twitter: keithpitt + github: keithpitt + bio: I'm very serious. I work at @buildkite. + website: http://keithpitt.com + slug: keith-pitt +- name: Mario Visic + twitter: '' + github: mariovisic + bio: "Hi \U0001F44B\r\n\r\nI'm passionate about software engineering and teaching. + I make video tutorials to teach programming through building simple 2d games :)" + website: www.mariovisic.com + slug: mario-visic +- name: Andrew Warner + twitter: '' + github: a-warner + bio: '' + website: https://www.strongopinionsweaklytyped.com/ + slug: andrew-warner +- name: Eric Roberts + twitter: '' + github: ericroberts + bio: '' + website: http://ericroberts.ca + slug: eric-roberts +- name: Declan Whelan + twitter: '' + github: dwhelan + bio: Technical coach + website: http://dpwhelan.com/blog + slug: declan-whelan +- name: Luke Melia + twitter: lukemelia + github: lukemelia + bio: '' + website: http://www.lukemelia.com/devblog + slug: luke-melia +- name: Javier Ramirez + twitter: '' + github: frjaraur + bio: "DevSecOps - System Architecture and Intregrations\r\nDocker Captain, always + learning :)" + website: https://codegazers.github.io/ + slug: javier-ramirez +- name: Stephan Hagemann + twitter: shageman + github: shageman + bio: '' + website: https://stephanhagemann.com + slug: stephan-hagemann +- name: John Athayde + twitter: johnathayde + github: jathayde + bio: '' + website: www.sfumatofarm.com + slug: john-athayde +- name: Alexander Dymo + twitter: '' + github: adymo + bio: '' + website: http://www.alexdymo.com + slug: alexander-dymo +- name: Chad Pytel + twitter: '' + github: cpytel + bio: Developer and CEO at thoughtbot + website: http://thoughtbot.com + slug: chad-pytel +- name: Corey Haines + twitter: coreyhaines + github: coreyhaines + bio: Magical! + website: www.coreyhaines.com + slug: corey-haines +- name: Ryan Resella + twitter: ryanresella + github: ryanatwork + bio: Staff Software Engineer at Change.org + website: ryanresella.com + slug: ryan-resella +- name: Tyler Montgomery + twitter: '' + github: ubermajestix + bio: '' + website: ubermajestix.com + slug: tyler-montgomery +- name: Nick Sieger + twitter: nicksieger + github: nicksieger + bio: '' + website: '' + slug: nick-sieger +- name: Rodrigo Franco + twitter: '' + github: caffo + bio: Software Engineer. Bookworm, Coffee Connoisseur and Dungeon Crawler Aficionado. + お宅. + website: http://rodrigofranco.com/ + slug: rodrigo-franco +- name: Adam Hawkins + twitter: ahawkins + github: ahawkins + bio: 'I build velocity; hopefully one day with @esselius. Podcast: https://smallbatches.fm' + website: https://hawkins.io + slug: adam-hawkins +- name: Todd Kaufman + twitter: '' + github: tkaufman + bio: '' + website: www.testdouble.com + slug: todd-kaufman +- name: Wen Tien Chang + twitter: '' + github: ihower + bio: 'web developer & founder of https://aihao.tw ' + website: https://ihower.tw + slug: wen-tien-chang +- name: Sebastian Sogamoso + twitter: sebsogamoso + github: sogamoso + bio: '' + website: https://sogamo.so + slug: sebastian-sogamoso +- name: Richard Lee + twitter: dlackty + github: dlackty + bio: "Google Developer Expert for @firebase & \r\n@line API Expert" + website: https://dlackty.com/ + slug: richard-lee +- name: Luis Ferreira + twitter: '' + github: lgpinguim + bio: Luis Ferreira - Computer engineer \ game developer + website: '' + slug: luis-ferreira +- name: Max Hawkins + twitter: '' + github: maxhawkins + bio: '' + website: http://www.maxhawkins.me + slug: max-hawkins +- name: Vipul A M + twitter: vipulnsward + github: vipulnsward + bio: "Founder @saeloun.\r\n@rails Issues Team.\r\nAuthor: @reactjs by Example." + website: https://www.saeloun.com/team/vipul + slug: vipul-a-m +- name: Hiroshi Shibata + twitter: hsbt + github: hsbt + bio: "Full-time OSS developer. I'm a member of Ruby core team, RubyGems team and + rbenv and ruby-build maintainer.\r\n" + website: https://www.hsbt.org/ + slug: hiroshi-shibata +- name: Ryan MacInnes twitter: '' - github: TonsOfFun + github: goddamnyouryan + bio: '' + website: http://www.goddamnyouryan.com + slug: ryan-macinnes +- name: Godfrey Chan + twitter: '' + github: chancancode + bio: '' + website: http://about.me/godfreychan + slug: godfrey-chan +- name: Rafael França + twitter: rafaelfranca + github: rafaelfranca bio: '' website: '' - slug: justin-bowen -- name: Nick Schwaderer - twitter: schwad_rb - github: Schwad - bio: Rubyist - website: https://schwad.github.io - slug: nick-schwaderer -- name: Andrea Fomera - twitter: afomera - github: afomera - bio: "Software Engineer \r\nLikes: Hiking, Mountain Biking, Painting" - website: https://afomera.dev - slug: andrea-fomera -- name: Kevin Lesht + slug: rafael-franca +- name: Dave Tapley + twitter: davetapley + github: davetapley + bio: '' + website: davetapley.com + slug: dave-tapley +- name: Simon Eskildsen + twitter: Sirupsen + github: sirupsen + bio: Scaling infrastructure for you. https://webscale.ca — Previously Principal + Infrastructure Engineer @Shopify + website: http://sirupsen.com + slug: simon-eskildsen +- name: John Backus + twitter: '' + github: backus + bio: '' + website: http://johnback.us/ + slug: john-backus +- name: Glenn Vanderburg + twitter: glv + github: glv + bio: '' + website: http://vanderburg.org/ + slug: glenn-vanderburg +- name: Maria Gutierrez + twitter: '' + github: mariagutierrez + bio: '' + website: '' + slug: maria-gutierrez +- name: Ben Klang + twitter: '' + github: bklang + bio: VP of Business Technology @powerhome. Real-Time Comms Revolutionary. Open Source + Hacker. Aspiring People-Person. + website: http://powerhrg.com + slug: ben-klang +- name: Caleb Thompson + twitter: '' + github: cdantetho + bio: "Technocentric entrepreneur in love with new technologies. \r\n\r\nCOO @brix-property + | CTO @Kontingence " + website: http://brix.property + slug: caleb-thompson +- name: Derek Prior + twitter: '' + github: derekprior + bio: '' + website: http://prioritized.net + slug: derek-prior +- name: Amy Unger + twitter: cdwort + github: cdwort + bio: Mistakes as a Service Provider + website: amyunger.com + slug: amy-unger +- name: Bryana Knight + twitter: '' + github: bryanaknight + bio: '' + website: '' + slug: bryana-knight +- name: Tony Drake + twitter: t27duck + github: t27duck + bio: Rails Developer. StimulusJS is ok too. + website: http://www.t27duck.com + slug: tony-drake +- name: Lance Ivy + twitter: '' + github: cainlevy + bio: Formerly @energyrm, @empaticoorg, @kickstarter, @uservoice + website: http://cainlevy.net/ + slug: lance-ivy +- name: Jake Worth + twitter: jwworth + github: jwworth + bio: Software engineer learning in public. @DrTreat, ex @framebridge and @hashrocket, + mentoring @CodePlatoon. + website: https://www.jakeworth.com + slug: jake-worth +- name: Ariel Caplan + twitter: '' + github: amcaplan + bio: '' + website: https://amcaplan.ninja + slug: ariel-caplan +- name: Christian Koch + twitter: '' + github: chriskoch + bio: CEO and co-founder of @scandio, Atlassian Enterprise Expert, Lecturer at hm.edu + website: http://www.scandio.de + slug: christian-koch +- name: Alex Boster + twitter: '' + github: tilthouse + bio: '' + website: '' + slug: alex-boster +- name: Cameron Jacoby twitter: '' - github: klesht + github: cameronjacoby bio: '' - website: http://kevinlesht.com - slug: kevin-lesht -- name: Andrew Atkinson - twitter: andatki - github: andyatkinson + website: '' + slug: cameron-jacoby +- name: Nathan Walls + twitter: base10 + github: base10 + bio: "Lead Software Engineer\r\n" + website: http://wallscorp.us/ + slug: nathan-walls +- name: Andrew Markle + twitter: '' + github: andrewmarkle bio: '' - website: andyatkinson.com - slug: andrew-atkinson + website: '' + slug: andrew-markle +- name: Jonathan Wallace + twitter: '' + github: wallace + bio: '' + website: http://blog.jonathanrwallace.com + slug: jonathan-wallace +- name: Andreas Fast + twitter: '' + github: afast + bio: '' + website: blog.moove-it.com + slug: andreas-fast +- name: Gianfranco Zas + twitter: '' + github: snmgian + bio: '' + website: '' + slug: gianfranco-zas +- name: Danielle Adams + twitter: adamzdanielle + github: danielleadams + bio: "(◕‿◕ ✿)" + website: danielle.lol + slug: danielle-adams +- name: Betsy Haibel + twitter: '' + github: bhaibel + bio: '' + website: '' + slug: betsy-haibel +- name: Derek Carter + twitter: '' + github: goozbach + bio: '' + website: http://blog.friocorte.com/ + slug: derek-carter +- name: Andrew Evans + twitter: AndrewEvans0102 + github: andrewevans0102 + bio: Husband, Father, Engineer, and Front End Developer at AWS. Follow me on http://rhythmandbinary.com + and http://andrewevans.dev. + website: https://rhythmandbinary.com + slug: andrew-evans +- name: Dave Ott + twitter: daveott + github: daveott + bio: '' + website: http://daveott.net + slug: dave-ott +- name: Dennis Eusebio + twitter: '' + github: thoughtandtheory + bio: '' + website: http://www.thoughtandtheory.com/ + slug: dennis-eusebio +- name: Gabi Stefanini + twitter: lastgabs + github: lastgabs + bio: '' + website: http://www.lastgabs.com + slug: gabi-stefanini +- name: Liz Certa + twitter: '' + github: ecerta + bio: '' + website: '' + slug: liz-certa +- name: David McDonald + twitter: '' + github: david-pm + bio: friendly neighborhood pinko programmer + website: davidpm.io + slug: david-mcdonald +- name: Mike Calhoun + twitter: '' + github: comike011 + bio: Where I lounge is my stomping grounds. + website: http://www.michaelcalhoun.com + slug: mike-calhoun +- name: Ryan Laughlin + twitter: rofreg + github: rofreg + bio: Developer, designer, and nonogram enthusiast. I'm co-founder and CTO at @splitwise. + website: https://rofreg.com + slug: ryan-laughlin +- name: Eric Hodel + twitter: '' + github: drbrain + bio: '' + website: http://blog.segment7.net + slug: eric-hodel +- name: Ezekiel Templin + twitter: '' + github: ezkl + bio: '' + website: https://ezkl.dev + slug: ezekiel-templin +- name: Kir Shatrov + twitter: '' + github: kirs + bio: '' + website: http://kirshatrov.com + slug: kir-shatrov +- name: Sean Griffin + twitter: '' + github: seanhaydongriffin + bio: '' + website: '' + slug: sean-griffin +- name: Loren Crawford + twitter: '' + github: loren-m-crawford + bio: '' + website: http://lorencrawford.herokuapp.com/ + slug: loren-crawford +- name: Mark Imbriaco + twitter: '' + github: imbriaco + bio: '' + website: '' + slug: mark-imbriaco +- name: Harisankar P S + twitter: '' + github: coderhs + bio: '' + website: hsps.in + slug: harisankar-p-s +- name: Emily Freeman + twitter: '' + github: emilyfreeman + bio: 'Author, DevOps for Dummies • AWS ' + website: http://www.emilyfreeman.io + slug: emily-freeman +- name: Alistair McKinnell + twitter: '' + github: amckinnell + bio: '' + website: www.valuablecode.com + slug: alistair-mckinnell +- name: Ben Halpern + twitter: bendhalpern + github: benhalpern + bio: "\r\n Founder of dev.to \U0001F469‍\U0001F4BB\U0001F468‍\U0001F4BB-> Now + open source! Come checkout our main repo at forem/forem \U0001F331" + website: https://dev.to/ben + slug: ben-halpern +- name: Tess Griffin + twitter: '' + github: tessgriffin + bio: Senior Software Engineer on GitHub Education + website: '' + slug: tess-griffin +- name: Gretchen Ziegler + twitter: '' + github: gretchenziegler + bio: '' + website: '' + slug: gretchen-ziegler +- name: Max Tiu + twitter: '' + github: maximumtiu + bio: Engineer, former Director @rubycentral + website: '' + slug: max-tiu +- name: Chris Hoffman + twitter: '' + github: chrishoffman + bio: '' + website: '' + slug: chris-hoffman +- name: Alex Wood + twitter: alexwwood + github: awood45 + bio: Developing open source tools for @aws Serverless Apps, and other related open + source work. + website: https://alexwood.codes + slug: alex-wood +- name: Leonardo Tegon + twitter: '' + github: tegon + bio: "Backend dev | Tech should serve people and not the other way around.\r\n\r\nPassionate + about music, dance, food, books, and sports." + website: '' + slug: leonardo-tegon +- name: Pete Holiday + twitter: '' + github: toomuchpete + bio: '' + website: http://www.peteholiday.com + slug: pete-holiday +- name: Laura Mosher + twitter: '' + github: lauramosher + bio: Software Engineer + website: https://lauramosher.com + slug: laura-mosher +- name: Brittany Martin + twitter: '' + github: regularlady + bio: Engineering Manager + website: https://brittanymartin.dev/ + slug: brittany-martin +- name: Ben Shippee + twitter: '' + github: benshippee + bio: '' + website: '' + slug: ben-shippee +- name: Michael Herold + twitter: mherold + github: michaelherold + bio: '' + website: https://michaeljherold.com + slug: michael-herold +- name: Cecy Correa + twitter: cecyc + github: cecyc + bio: "Software Engineer.\r\n\U0001F40D Python | \U0001F48E Ruby | #MICS at UC Berkeley" + website: https://www.cecy.dev/ + slug: cecy-correa +- name: Aly Fulton + twitter: '' + github: sinthetix + bio: '' + website: '' + slug: aly-fulton +- name: Graham Conzett + twitter: '' + github: conzett + bio: '' + website: grahamconzett.com + slug: graham-conzett +- name: Michael Crismali + twitter: '' + github: crismali + bio: '' + website: '' + slug: michael-crismali +- name: Ross Kaffenberger + twitter: rossta + github: rossta + bio: Principal Engineer at @stitchfix ∙ Previously @LearnZillion @challengepost + @weplay ∙ Teaching Ruby, Rails, JavaScript at rossta.net + website: https://rossta.net + slug: ross-kaffenberger +- name: Emil Ong + twitter: '' + github: emilong + bio: '' + website: '' + slug: emil-ong +- name: Jordan Raine + twitter: '' + github: jnraine + bio: '' + website: https://jordanraine.com + slug: jordan-raine +- name: Mike Schutte + twitter: '' + github: tmikeschu + bio: "learner, runner, make everything funner.\r\n\r\nblack lives matter. he/him." + website: https://tmikeschu.com + slug: mike-schutte +- name: Khash Sajadi + twitter: '' + github: khash + bio: Founder @cloud66. Eclectic but not exclusively. + website: http://www.cloud66.com + slug: khash-sajadi +- name: Vietor Davis + twitter: '' + github: vietord + bio: '' + website: '' + slug: vietor-davis +- name: Ryan Davis + twitter: the_zenspider + github: zenspider + bio: Founder of @seattlerb. Author of minitest & many other gems. NO Recruiters! + website: https://www.zenspider.com/ + slug: ryan-davis +- name: Chris Arcand + twitter: chrisarcand + github: chrisarcand + bio: Engineering Lead, Terraform Cloud @ HashiCorp + website: https://www.chrisarcand.com + slug: chris-arcand +- name: Jake Varghese + twitter: '' + github: jake3030 + bio: '' + website: blog.flvorful.com + slug: jake-varghese +- name: Sam Aarons + twitter: samaarons + github: saarons + bio: CTO/Co-Founder @Modern-Treasury. Krispy Kreme Enthusiast. + website: '' + slug: sam-aarons +- name: Edouard Chin + twitter: '' + github: Edouard-chin + bio: '' + website: https://catana.dev + slug: edouard-chin +- name: Chris LoPresto + twitter: chrislopresto + github: chrislopresto + bio: '' + website: https://chrislopresto.com + slug: chris-lopresto +- name: Sumeet Jain + twitter: sumeetjain + github: sumeetjain + bio: '' + website: http://sumeetjain.com + slug: sumeet-jain +- name: Dinah Shi + twitter: '' + github: dinahshi + bio: '' + website: '' + slug: dinah-shi +- name: Geoffrey Litt + twitter: '' + github: geoffreylitt + bio: '' + website: http://geoffreylitt.com + slug: geoffrey-litt +- name: Craig Kerstiens + twitter: '' + github: craigkerstiens + bio: '' + website: http://www.craigkerstiens.com + slug: craig-kerstiens +- name: Yehuda + twitter: wycats + github: wycats + bio: '' + website: http://yehudakatz.com + slug: yehuda +- name: Godfrey + twitter: '' + github: chancancode + bio: '' + website: http://about.me/godfreychan + slug: godfrey +- name: Krystan + twitter: krystanhonour + github: krystan + bio: 'A Software developer who plays with many languages ' + website: http://www.krystanhonour.com + slug: krystan +- name: Eleanor Kiefel Haggerty + twitter: '' + github: eleanorakh + bio: Engineering Manager at @buildkite + website: eleanorkh.com + slug: eleanor-kiefel-haggerty +- name: Molly Struve + twitter: molly_struve + github: mstruve + bio: Sr. Site Reliability Engineer at Netflix + website: https://twitter.com/molly_struve + slug: molly-struve +- name: Takashi Kokubun + twitter: k0kubun + github: k0kubun + bio: Optimizing Ruby's JIT compilers. + website: '' + slug: takashi-kokubun +- name: James Thompson + twitter: plainprogrammer + github: plainprogrammer + bio: Hands-on Software Architect + website: https://james.thomps.onl + slug: james-thompson +- name: Michael Toppa + twitter: mtoppa + github: toppa + bio: '' + website: http://www.toppaware.com + slug: michael-toppa +- name: John Beatty + twitter: john_d_beatty + github: beatty + bio: Engineer, Entrepreneur, Investor. Former co-founder/CEO of Clover. + website: https://www.johndbeatty.com + slug: john-beatty +- name: Thomas E Enebo + twitter: '' + github: enebo + bio: '' + website: http://blog.enebo.com/ + slug: thomas-e-enebo +- name: Kyle d'Oliveira + twitter: '' + github: doliveirakn + bio: "Pronouns: He/Him\r\n\r\nThis is my Bio\r\nI think it is a good one\r\nBut + I may be wrong" + website: '' + slug: kyle-d-oliveira +- name: Karl Entwistle + twitter: '' + github: karlentwistle + bio: Burrito enthusiast also enjoys pizza + website: http://twitter.com/karlentwistle + slug: karl-entwistle +- name: Genadi Samokovarov + twitter: '' + github: gsamokovarov + bio: '' + website: http://gsamokovarov.com + slug: genadi-samokovarov +- name: John Feminella + twitter: '' + github: fj + bio: '' + website: http://www.linkedin.com/in/johnxf + slug: john-feminella +- name: Philippe Creux + twitter: pcreux + github: pcreux + bio: '' + website: https://pcreux.com + slug: philippe-creux +- name: Chris Waters + twitter: '' + github: Waters000 + bio: Full stack web developer and IOS swift developer. + website: www.Hizzil.com + slug: chris-waters +- name: Alexandra Millatmal + twitter: '' + github: halfghaninne + bio: Senior Software Engineer @nytimes. Previously built a bespoke CMS at @newsela. + In love with the world outside of (impacted by, apart from, in spite of) tech. + website: https://alexandramillatmal.com + slug: alexandra-millatmal +- name: Steven Hicks + twitter: '' + github: pepopowitz + bio: '' + website: '' + slug: steven-hicks +- name: Rufo Sanchez + twitter: '' + github: rufo + bio: '' + website: '' + slug: rufo-sanchez +- name: Jennifer Tu + twitter: '' + github: jennifertarroja-tuht + bio: '' + website: '' + slug: jennifer-tu +- name: Ylan Segal + twitter: '' + github: ylansegal + bio: '' + website: http://ylan.segal-family.com + slug: ylan-segal +- name: Alex Reiff + twitter: '' + github: AlexReiff + bio: "-" + website: '' + slug: alex-reiff +- name: Ben Jacobson + twitter: bjacobso + github: bjacobso + bio: '' + website: http://benjacobson.com + slug: ben-jacobson +- name: Ben Bleything + twitter: bleything + github: bleything + bio: The Puget Sound Convergence Zone's leading expert on Clown Computering + website: http://bleything.net + slug: ben-bleything +- name: Eric Allen + twitter: InterwebAlchemy + github: ericrallen + bio: Interweb Alchemist | Developer Advocate @DataDog | Full Stack TypeScript | + DX | UX | AI + website: https://ericrallen.dev/ + slug: eric-allen +- name: Christopher Sexton + twitter: '' + github: csexton + bio: '' + website: http://www.codeography.com/ + slug: christopher-sexton +- name: Jeffrey Cohen + twitter: '' + github: jeffreycohenit + bio: '' + website: '' + slug: jeffrey-cohen +- name: Ryan Alexander + twitter: '' + github: notlion + bio: '' + website: http://onecm.com + slug: ryan-alexander +- name: Eric Tillberg + twitter: '' + github: Thrillberg + bio: '' + website: '' + slug: eric-tillberg +- name: Jesse Belanger + twitter: '' + github: jbelang + bio: '' + website: '' + slug: jesse-belanger +- name: Julien Fitzpatrick + twitter: _jbfitz + github: julienfitz + bio: they/them + website: https://dev.to/julienfitz + slug: julien-fitzpatrick +- name: Yoshinori Kawasaki + twitter: kawasy + github: luvtechno + bio: 'Full-time Father / Climber / Software Engineer / Former CTO @wantedly ' + website: https://www.wantedly.com/id/kawasy + slug: yoshinori-kawasaki +- name: Sonja Peterson + twitter: '' + github: sonjapeterson + bio: '' + website: '' + slug: sonja-peterson +- name: Matt Duszynski + twitter: bsdzunk + github: dzunk + bio: "The tower stands proudly, \r\nthe statue gazes out to sea. \r\nWhat great + work was not created, \r\nbut that the builder might see his reflection in the + world?" + website: matt.dus.zyn.ski + slug: matt-duszynski +- name: Jason Swett + twitter: jasonswett + github: jasonswett + bio: Software engineer, speaker, podcast host and writer specializing in Ruby on + Rails. + website: http://www.codewithjason.com/ + slug: jason-swett +- name: Ratnadeep Deshmane + twitter: rtdp + github: rtdp + bio: '' + website: http://rtdp.me + slug: ratnadeep-deshmane +- name: Anthony Crumley + twitter: '' + github: anthonycrumley + bio: '' + website: http://craftyco.de + slug: anthony-crumley +- name: Ben Greenberg + twitter: hummusonrails + github: hummusonrails + bio: "\U0001F44B Ben Greenberg: Software Engineer & Developer Advocate | Rust, Ruby + | Making tech accessible \U0001F310 bengreenberg.dev" + website: https://www.bengreenberg.dev + slug: ben-greenberg +- name: Alec Clarke + twitter: '' + github: alecclarke + bio: '' + website: '' + slug: alec-clarke +- name: Anna Rankin + twitter: '' + github: annarankin + bio: web developer and eternal doodler + website: http://annarank.in + slug: anna-rankin +- name: Chelsea Troy + twitter: HeyChelseaTroy + github: chelseatroy + bio: 'I write about code and folks seem to like it: chelseatroy.com' + website: http://www.chelseatroy.com + slug: chelsea-troy +- name: Brynn Gitt + twitter: '' + github: bgitt + bio: '' + website: '' + slug: brynn-gitt +- name: Oliver Sanford + twitter: '' + github: oliverjesse + bio: '' + website: '' + slug: oliver-sanford +- name: Ufuk Kayserilioglu + twitter: paracycle + github: paracycle + bio: '' + website: https://ufuk.dev + slug: ufuk-kayserilioglu +- name: Elayne Juten + twitter: '' + github: ejuten + bio: '' + website: '' + slug: elayne-juten +- name: Jason Meller + twitter: jmeller + github: terracatta + bio: "Founder, CEO of @kolide.\r\nAuthor of https://honest.security" + website: https://kolide.com + slug: jason-meller +- name: Jesse Spevack + twitter: '' + github: jesse-spevack + bio: Software Developer + website: http://www.verynormal.info + slug: jesse-spevack +- name: Kent Beck + twitter: KentBeck + github: KentBeck + bio: '' + website: www.kentbeck.com + slug: kent-beck +- name: Krystan HuffMenne + twitter: '' + github: gitKrystan + bio: "Senior Engineer at Auditboard\r\n\r\n(formerly @tildeio)" + website: '' + slug: krystan-huffmenne +- name: Mark Hutter + twitter: '' + github: mrkhutter + bio: '' + website: '' + slug: mark-hutter +- name: Chris Oliver + twitter: excid3 + github: excid3 + bio: '' + website: http://gorails.com + slug: chris-oliver +- name: Andrew Ek + twitter: '' + github: andrewek + bio: Principal Engineer, Launch Scout + website: '' + slug: andrew-ek +- name: Austin Story + twitter: '' + github: Austio + bio: 'I work a lot on Ruby, Elasticsearch, Javascript, Vue.js, Rails and some in + Golang. Past Lives: ada95, java, jquery, react and angular 1.x' + website: https://austio.com + slug: austin-story +- name: Damir Svrtan + twitter: '' + github: DamirSvrtan + bio: Senior Software Engineer @netflix. Former organizer of @rubyzg meetups. + website: http://damir.svrtan.me/ + slug: damir-svrtan +- name: Bryan Cantrill + twitter: '' + github: bcantrill + bio: '' + website: dtrace.org/blogs/bmc + slug: bryan-cantrill +- name: Gannon McGibbon + twitter: '' + github: gmcgibbon + bio: 'Developer @Shopify ' + website: http://gannon.io/ + slug: gannon-mcgibbon +- name: Henning Koch + twitter: '' + github: triskweline + bio: Rubyist by day, romantic at night. Creator of http://unpoly.com. CTO at https://makandra.com + (we make Rails LTS). + website: https://makandra.com + slug: henning-koch +- name: Jeannie Evans + twitter: '' + github: jmevans0211 + bio: '' + website: '' + slug: jeannie-evans +- name: Jemma Issroff + twitter: jemmaissroff + github: jemmaissroff + bio: '' + website: https://jemma.dev + slug: jemma-issroff +- name: Jessica Hilt + twitter: '' + github: jessicahilt + bio: '' + website: '' + slug: jessica-hilt +- name: Jonas Jabari + twitter: jonasjabari + github: jonasjabari + bio: '' + website: jonasjabari.dev + slug: jonas-jabari +- name: Josh Thompson + twitter: josh_works + github: josh-works + bio: 'Builder of many things. Communities, friendships, explanatory guides, software, + chairs. ' + website: https://josh.works + slug: josh-thompson +- name: Kerri Miller + twitter: '' + github: kerrizor + bio: "Developer and lackwit gadabout \U0001F496" + website: http://kerrizor.com + slug: kerri-miller +- name: Kevin Gilpin + twitter: '' + github: kgilpin + bio: '' + website: appland.com + slug: kevin-gilpin +- name: Kerstin Puschke + twitter: '' + github: titanoboa + bio: '' + website: '' + slug: kerstin-puschke +- name: Martin Jaime + twitter: '' + github: martinjaimem + bio: Computer Engineer + website: '' + slug: martin-jaime +- name: Nicole Carpenter + twitter: '' + github: NicoleCarpenter + bio: '' + website: '' + slug: nicole-carpenter +- name: Riaz Virani + twitter: '' + github: rvirani1 + bio: '' + website: riazv.me + slug: riaz-virani +- name: Ryan Boone + twitter: '' + github: falldowngoboone + bio: I'm a designer/developer based in the Dallas-Fort Worth area, and I love JavaScript, + warts and all. + website: '' + slug: ryan-boone +- name: Ryan Brushett + twitter: '' + github: RyanBrushett + bio: "I really like animals and music.\r\n\r\nI work at @Fullscript " + website: https://ryanbrushett.com + slug: ryan-brushett +- name: Santiago Bartesaghi + twitter: santib6_ + github: santib + bio: '' + website: santib.com + slug: santiago-bartesaghi +- name: Sumana Harihareswara + twitter: brainwane + github: brainwane + bio: Python programmer, manager, tech writer, mentor, release manager for hire. + @pypa member, @recursecenter alumna, @OpenTechStrategies colleague. + website: http://www.changeset.nyc + slug: sumana-harihareswara +- name: Takumasa Ochi + twitter: '' + github: aeroastro + bio: Satellite Engineer (both hardware and software) / Web Engineer / Game Developer + website: https://twitter.com/NekomimiMaster + slug: takumasa-ochi +- name: Tim Tyrrell + twitter: timtyrrell + github: timtyrrell + bio: '' + website: https://blog.tyrrell.io/ + slug: tim-tyrrell +- name: Will Jordan + twitter: '' + github: wjordan + bio: '' + website: https://willjordan.us + slug: will-jordan +- name: Yechiel Kalmenson + twitter: '' + github: achasveachas + bio: Software Engineer + website: https://yechiel.me + slug: yechiel-kalmenson +- name: Ramón Huidobro + twitter: '' + github: hola-soy-milk + bio: '' + website: https://ramonh.dev + slug: ramon-huidobro +- name: Emily Harber + twitter: thecodepixi + github: thecodepixi + bio: Ruby | Rails | React | GraphQL + website: thecodepixi.dev + slug: emily-harber +- name: Dorian Marie + twitter: '' + github: dgaboria + bio: '' + website: http://www.cef-cfr.ca/index.php?n=Membres.DorianGaboriau + slug: dorian-marie +- name: Brandon Shar + twitter: '' + github: BrandonShar + bio: '' + website: '' + slug: brandon-shar +- name: Sarah Sausan + twitter: '' + github: sarahsau + bio: " Rubyist, Cats enthusiast" + website: '' + slug: sarah-sausan +- name: Lauren Billington + twitter: '' + github: BLaurenB + bio: 'I like to turn powder into fancy cakes, strings into wearable clothing, ideas + into music, and turn code into meaningful software! ' + website: '' + slug: lauren-billington +- name: Denise Yu + twitter: deniseyu21 + github: deniseyu + bio: Professional dogeScript developer + website: https://deniseyu.io + slug: denise-yu +- name: Espartaco Palma + twitter: '' + github: esparta + bio: '' + website: https://esparta.co + slug: espartaco-palma +- name: Frederick Cheung + twitter: '' + github: fcheung + bio: '' + website: http://www.spacevatican.org + slug: frederick-cheung +- name: Corey Martin + twitter: '' + github: CoreyM21 + bio: New to coding but excited to learn! + website: '' + slug: corey-martin +- name: Anthony Eden + twitter: aeden + github: aeden + bio: 'Founder of DNSimple, vendor of duct tape, purveyor of UDP packets. Mastodon: + @aeden@ruby.social' + website: http://anthonyeden.com/ + slug: anthony-eden +- name: Rachel Mathew + twitter: '' + github: ronarachel + bio: '' + website: '' + slug: rachel-mathew +- name: Drew Bragg + twitter: DRBragg + github: DRBragg + bio: "Senior Developer @ Podia,\r\nPodcast Host @ podcast.drbragg.dev" + website: www.drbragg.dev + slug: drew-bragg +- name: Kylie Stradley + twitter: '' + github: KyFaSt + bio: "\U0001F408‍⬛\U0001F4AB" + website: https://kyfast.net + slug: kylie-stradley +- name: Guillermo Aguirre + twitter: guillermoap_ + github: guillermoap + bio: "Senior Full Stack Developer - Software Engineer \U0001F4BB " + website: '' + slug: guillermo-aguirre +- name: Kevin Gorham + twitter: '' + github: gmale + bio: '' + website: http://developerbits.blogspot.com + slug: kevin-gorham +- name: Landon Gray + twitter: '' + github: thedayisntgray + bio: '' + website: '' + slug: landon-gray +- name: Daniel Huss + twitter: '' + github: Daniel-N-Huss + bio: "Aspiring Technomancer, Refactoring Enjoyer.\r\n\r\nTDD, Ruby / Rails, React + / JavaScript" + website: '' + slug: daniel-huss +- name: Hartley McGuire + twitter: '' + github: skipkayhil + bio: '' + website: '' + slug: hartley-mcguire +- name: Justin Daniel + twitter: '' + github: justinddaniel + bio: 'My background is in science and education...I fell in love with programming + and that is my new career. ' + website: '' + slug: justin-daniel +- name: Rich Steinmetz + twitter: RichStoneIO + github: RichStone + bio: "Software Engineer @ Webinargeek \U0001F6E0 AHA-moments @ richstone.io \U0001F52E" + website: https://richstone.io + slug: rich-steinmetz +- name: Rishi Jain + twitter: rishi_raj_jain_ + github: rishi-raj-jain + bio: Previously, Technical Customer Success Manager @edgio. @storyblok Ambassador. + website: rishi.app + slug: rishi-jain +- name: Meagan Waller + twitter: meaganewaller + github: meaganewaller + bio: '' + website: https://meaganwaller.com + slug: meagan-waller +- name: Jordan Burke + twitter: '' + github: PendragonDevelopment + bio: "Senior Developer @headwayio\r\nGeneral Antilles @ wraithsquadrongaming.com" + website: http://headway.io + slug: jordan-burke +- name: Allison Hill + twitter: '' + github: AllisonSHill + bio: '' + website: AllisonSHill.github.io + slug: allison-hill +- name: Kevin Liebholz + twitter: '' + github: kevkev300 + bio: Creator, Strategist and Full-Stack Developer - Proudly coding @portagon - Alumni + of Le Wagon Barcelona + website: kevin-liebholz.me + slug: kevin-liebholz +- name: John Sawers + twitter: '' + github: johnksawers + bio: '' + website: johnksawers.com + slug: john-sawers +- name: William Frey + twitter: '' + github: Will-Frey + bio: '' + website: '' + slug: william-frey +- name: Michael Milewski + twitter: saramic + github: saramic + bio: '' + website: https://failure-driven.com/ + slug: michael-milewski +- name: Selena Small + twitter: '' + github: SelenaSmall + bio: I spend the majority of my free time researching and studying technologies + and concepts related to web and software development. + website: http://www.selenasmall.com + slug: selena-small +- name: Rafael Mendonça França + twitter: rafaelfranca + github: rafaelfranca + bio: '' + website: '' + slug: rafael-mendonca-franca +- name: Braulio Martinez + twitter: '' + github: brauliomartinezlm + bio: Senior Software Engineer. + website: https://cedarcode.com + slug: braulio-martinez +- name: Elle Meredith + twitter: aemeredith + github: elle + bio: '' + website: http://aemeredith.com + slug: elle-meredith +- name: Ole Michaelis + twitter: OleMchls + github: OleMchls + bio: Working @dnsimple, curator of @socoded and slidr.io – Passionate Software Engineer. + I ❤️ elixir, ruby, node, metrics, NoSQL and all bleeding edge stuff! + website: https://ole.mchls.works + slug: ole-michaelis +- name: Vincent Rolea + twitter: vincentrolea + github: virolea + bio: Senior Software Engineer + website: '' + slug: vincent-rolea +- name: Shana Moore + twitter: '' + github: ShanaLMoore + bio: '' + website: '' + slug: shana-moore +- name: Kait Sewell + twitter: '' + github: K8Sewell + bio: Artist and pyrotechnician venturing into the depths of code. + website: '' + slug: kait-sewell +- name: Allison McMillan + twitter: '' + github: asheren + bio: '' + website: http://www.daydreamsinruby.com + slug: allison-mcmillan +- name: Adrianna Chang + twitter: adriannakchang + github: adrianna-chang-shopify + bio: "Senior Production Engineer at @Shopify in Ottawa, ON.\r\nCarleton CS 2020 + grad | Dev Degree Alumna.\r\nShe / Her" + website: adriannachang.me + slug: adrianna-chang +- name: Paul Bahr + twitter: '' + github: paulbahr + bio: '' + website: '' + slug: paul-bahr +- name: Kinsey Durham Grace + twitter: KinseyAnnDurham + github: kinseydurhamgrace + bio: 'Enterprise Infrastructure Engineer at GitHub! I love writing code, fly fishing, + adventuring in the CO mountains and traveling. ' + website: '' + slug: kinsey-durham-grace +- name: Ali Ibrahim + twitter: ibrahim_0814 + github: ibrahim0814 + bio: Building things + website: '' + slug: ali-ibrahim +- name: Pat Allan + twitter: pat + github: pat + bio: Gelato connoisseur, pancake master, recovering events organiser, and web developer. + He/him. + website: https://freelancing-gods.com + slug: pat-allan +- name: Anjuan Simmons + twitter: anjuan + github: anjuan + bio: Technology Translator + website: http://www.AnjuanSimmons.com + slug: anjuan-simmons +- name: Gary Ware + twitter: '' + github: gware + bio: '' + website: http://www.bpcc.edu + slug: gary-ware +- name: Erik Guzman + twitter: talk2megooseman + github: talk2MeGooseman + bio: Experienced full-stack developers using Ruby on Rails and ReactJS. Open Source + Developer, Twitch development streamer https://twitch.tv/talk2megooseman + website: https://twitch.tv/talk2megooseman + slug: erik-guzman +- name: Shayon Mukherjee + twitter: shayonj + github: shayonj + bio: '' + website: '' + slug: shayon-mukherjee diff --git a/db/migrate/20230622202051_add_upvotes_and_views_to_talks.rb b/db/migrate/20230622202051_add_upvotes_and_views_to_talks.rb new file mode 100644 index 00000000..4513b9d0 --- /dev/null +++ b/db/migrate/20230622202051_add_upvotes_and_views_to_talks.rb @@ -0,0 +1,6 @@ +class AddUpvotesAndViewsToTalks < ActiveRecord::Migration[7.1] + def change + add_column :talks, :like_count, :integer + add_column :talks, :view_count, :integer + end +end diff --git a/db/migrate/20230720104208_add_uniq_index_speaker_talk.rb b/db/migrate/20230720104208_add_uniq_index_speaker_talk.rb new file mode 100644 index 00000000..dcb363da --- /dev/null +++ b/db/migrate/20230720104208_add_uniq_index_speaker_talk.rb @@ -0,0 +1,6 @@ +class AddUniqIndexSpeakerTalk < ActiveRecord::Migration[7.1] + def change + remove_index :speaker_talks, [:speaker_id, :talk_id], if_exists: true + add_index :speaker_talks, [:speaker_id, :talk_id], unique: true + end +end diff --git a/db/migrate/20230720151537_add_primary_key_to_speaker_talks.rb b/db/migrate/20230720151537_add_primary_key_to_speaker_talks.rb new file mode 100644 index 00000000..d8fccca7 --- /dev/null +++ b/db/migrate/20230720151537_add_primary_key_to_speaker_talks.rb @@ -0,0 +1,5 @@ +class AddPrimaryKeyToSpeakerTalks < ActiveRecord::Migration[7.1] + def change + add_column :speaker_talks, :id, :primary_key + end +end diff --git a/db/schema.rb b/db/schema.rb index 487e302e..57157f5e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2023_06_15_124332) do +ActiveRecord::Schema[7.1].define(version: 2023_07_20_151537) do create_table "ahoy_events", force: :cascade do |t| t.integer "visit_id" t.integer "user_id" @@ -102,12 +102,12 @@ t.index ["user_id"], name: "index_sessions_on_user_id" end - create_table "speaker_talks", id: false, force: :cascade do |t| + create_table "speaker_talks", force: :cascade do |t| t.integer "speaker_id", null: false t.integer "talk_id", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.index ["speaker_id", "talk_id"], name: "index_speaker_talks_on_speaker_id_and_talk_id" + t.index ["speaker_id", "talk_id"], name: "index_speaker_talks_on_speaker_id_and_talk_id", unique: true end create_table "speakers", force: :cascade do |t| @@ -151,6 +151,8 @@ t.string "thumbnail_xs", default: "", null: false t.string "thumbnail_xl", default: "", null: false t.date "date" + t.integer "like_count" + t.integer "view_count" t.index ["date"], name: "index_talks_on_date" t.index ["event_id"], name: "index_talks_on_event_id" t.index ["slug"], name: "index_talks_on_slug" diff --git a/db/seeds.rb b/db/seeds.rb index d0c103bb..50afd5b7 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -10,13 +10,15 @@ # open the yaml file in ../data/rails_conf_2021.yml -if Rails.env.development? - SpeakerTalk.delete_all - Speaker.delete_all - Talk.delete_all - Event.delete_all - Organisation.delete_all -end +# scp root@91.107.208.207:/var/lib/docker/volumes/storage/_data/production_rubyvideo.sqlite3 /storage/backup/production_rubyvideo.sqlite3 + +# if Rails.env.development? +# SpeakerTalk.delete_all +# Speaker.delete_all +# Talk.delete_all +# Event.delete_all +# Organisation.delete_all +# end speakers = YAML.load_file("#{Rails.root}/data/speakers.yml") organisations = YAML.load_file("#{Rails.root}/data/organisations.yml") @@ -32,51 +34,58 @@ end end -organisations.each do |organisation| - organisation = Organisation.find_or_create_by!(name: organisation["name"]) do |org| - org.website = organisation["website"] - # org.twitter = organisation["twitter"] - org.youtube_channel_name = organisation["youtube_channel_name"] - org.kind = organisation["kind"] - org.frequency = organisation["frequency"] - org.youtube_channel_id = organisation["youtube_channel_id"] - # org.language = organisation["language"] - end +MeiliSearch::Rails.deactivate! do + organisations.each do |organisation| + organisation = Organisation.find_or_create_by!(name: organisation["name"]) do |org| + org.website = organisation["website"] + # org.twitter = organisation["twitter"] + org.youtube_channel_name = organisation["youtube_channel_name"] + org.kind = organisation["kind"] + org.frequency = organisation["frequency"] + org.youtube_channel_id = organisation["youtube_channel_id"] + # org.language = organisation["language"] + end - events = YAML.load_file("#{Rails.root}/data/#{organisation.slug}/playlists.yml") + events = YAML.load_file("#{Rails.root}/data/#{organisation.slug}/playlists.yml") - events.each do |event| - event = Event.find_or_create_by!(name: event["title"]) do |evt| - evt.date = event["published_at"] - evt.organisation = organisation - end + events.each do |event| + event = Event.find_or_create_by!(name: event["title"]) do |evt| + evt.date = event["published_at"] + evt.organisation = organisation + end - puts event.slug - talks = YAML.load_file("#{Rails.root}/data/#{organisation.slug}/#{event.slug}/videos.yml") + puts event.slug + talks = YAML.load_file("#{Rails.root}/data/#{organisation.slug}/#{event.slug}/videos.yml") - talks.each do |talk_data| - next if talk_data["title"].blank? || videos_to_ignore.include?(talk_data["video_id"]) + talks.each do |talk_data| + next if talk_data["title"].blank? || videos_to_ignore.include?(talk_data["video_id"]) - talk = Talk.find_or_create_by!(title: talk_data["title"], event: event) do |tlk| - tlk.description = talk_data["description"] - tlk.year = talk_data["year"] - tlk.video_id = talk_data["video_id"] - tlk.video_provider = :youtube - tlk.date = talk_data["published_at"] - tlk.thumbnail_xs = talk_data["thumbnail_xs"] || "" - tlk.thumbnail_sm = talk_data["thumbnail_sm"] || "" - tlk.thumbnail_md = talk_data["thumbnail_md"] || "" - tlk.thumbnail_lg = talk_data["thumbnail_lg"] || "" - tlk.thumbnail_xl = talk_data["thumbnail_xl"] || "" - tlk.slug = talk_data["raw_title"].parameterize - end + talk = Talk.find_or_create_by!(title: talk_data["title"], event: event) do |tlk| + tlk.description = talk_data["description"] + tlk.year = talk_data["year"] + tlk.video_id = talk_data["video_id"] + tlk.video_provider = :youtube + tlk.date = talk_data["published_at"] + tlk.thumbnail_xs = talk_data["thumbnail_xs"] || "" + tlk.thumbnail_sm = talk_data["thumbnail_sm"] || "" + tlk.thumbnail_md = talk_data["thumbnail_md"] || "" + tlk.thumbnail_lg = talk_data["thumbnail_lg"] || "" + tlk.thumbnail_xl = talk_data["thumbnail_xl"] || "" + tlk.slug = talk_data["raw_title"].parameterize + end - talk_data["speakers"]&.each do |speaker| - speaker = Speaker.find_or_create_by!(name: speaker.strip) - SpeakerTalk.create!(speaker: speaker, talk: talk) + talk_data["speakers"]&.each do |speaker_name| + next if speaker_name.blank? + + speaker = Speaker.find_by(slug: speaker_name.parameterize) || Speaker.find_or_create_by(name: speaker_name.strip) + SpeakerTalk.create(speaker: speaker, talk: talk) if speaker + end + rescue ActiveRecord::RecordInvalid => e + puts "#{talk.title} is duplicated #{e.message}" end - rescue ActiveRecord::RecordInvalid => e - puts "#{talk.title} is duplicated" end end end + +# reindex all talk in MeiliSearch +Talk.reindex! diff --git a/file.yaml b/file.yaml deleted file mode 100644 index 7b69c23b..00000000 --- a/file.yaml +++ /dev/null @@ -1,983 +0,0 @@ ---- -- title: 'Opening Keynote: The Journey to Zeitwerk' - raw_title: 'RailsConf 2022 - Opening Keynote: The Journey to Zeitwerk by Xavier - Noria' - description: 'RailsConf 2022 - Opening Keynote: The Journey to Zeitwerk by Xavier - Noria' - speakers: - - Xavier Noria - event_name: RailsConf 2022 - video_id: DzyGdOd_6-Y - thumbnail_sm: https://i.ytimg.com/vi/DzyGdOd_6-Y/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/DzyGdOd_6-Y/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/DzyGdOd_6-Y/sddefault.jpg -- title: Breaking up with the bundle - raw_title: RailsConf 2022 - Breaking up with the bundle by Joel Hawksley - description: |- - Breaking up with the bundle by Joel Hawksley - - Over the course of 14 years, the GitHub.com CSS bundle grew to over 40,000 lines of custom CSS. It became almost impossible to refactor. Visual regressions were common. In this talk, we'll share an honest picture of our successes and failures as we've worked to break up with our CSS bundle by moving towards a component-driven UI architecture. - speakers: - - Joel Hawksley - event_name: RailsConf 2022 - video_id: 21QG19Zy_g0 - thumbnail_sm: https://i.ytimg.com/vi/21QG19Zy_g0/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/21QG19Zy_g0/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/21QG19Zy_g0/sddefault.jpg -- title: React-ing to Hotwire - raw_title: RailsConf 2022 - React-ing to Hotwire by David Hill - description: I was fully onboard with React as my front-end Javascript framework - of choice for years. That all changed when I suddenly had to support a stand-alone - React app that I had no hand in building. Thankfully Hotwire had just been released, - and my manager was aware of how painful maintaining this application was going - to be. So I started the process of migrating the React app into the Rails app, - using Hotwire as the new front-end framework. How did it go, what lessons were - learned, and would I do it again? - speakers: - - David Hill - event_name: RailsConf 2022 - video_id: 6uj5o7U-3Y4 - thumbnail_sm: https://i.ytimg.com/vi/6uj5o7U-3Y4/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/6uj5o7U-3Y4/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/6uj5o7U-3Y4/sddefault.jpg -- title: Caching Without Marshal - raw_title: RailsConf 2022 - Caching Without Marshal by Chris Salzberg - description: |- - Marshal is Ruby's ultimate sharp knife, able to transform any object into a binary blob and back. This makes it a natural match for the diverse needs of a cache. - - But Marshal's magic comes with risks. Code changes can break deploys; user input can trigger an RCE. - - We recently decided these risks were not worth it. Breaking with convention, we migrated the cache on our core monolith to MessagePack, a more compact binary serialization format with stricter typing and less magic. - - In this talk, I'll pry Marshal open to show how it works, how we replaced it, and why you might want to do the same. - speakers: - - Chris Salzberg - event_name: RailsConf 2022 - video_id: T096iKLMBwQ - thumbnail_sm: https://i.ytimg.com/vi/T096iKLMBwQ/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/T096iKLMBwQ/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/T096iKLMBwQ/sddefault.jpg -- title: Event Streaming on Rails - raw_title: RailsConf 2022 - Event Streaming on Rails by Brad Urani - description: 'Pop quiz: How do you best make one Rails app communicate with another? - How do you split one big Rails app into two smaller ones? How do you switch from - a Rails app to a constellation of Rails services? Event streaming provides the - most robust answer. Simple but powerful Kafka streams unlock a world of capabilities - with their durability and consistency, but integrating with Rails poses challenges. - Join us and learn simple reading and writing to Kafka with Rails, broader distributed - systems design, and the magical transactional outbox. You''ll leave with the knowledge - you need to make the switch.' - speakers: - - Brad Urani - event_name: RailsConf 2022 - video_id: 0eLVAScw7XE - thumbnail_sm: https://i.ytimg.com/vi/0eLVAScw7XE/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/0eLVAScw7XE/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/0eLVAScw7XE/sddefault.jpg -- title: 'Kuby: Active Deployment for Rails Apps' - raw_title: 'RailsConf 2022 - Kuby: Active Deployment for Rails Apps by Cameron Dutro' - description: One of the Rails mantras is "convention over configuration," sane defaults - that limit the cognitive overhead of application development. It's easy to learn - and easy to build with... right up until you want to deploy your app to production. - At that point, the hand-holding ends. Like the Roadrunner, Rails stops right before - the cliff and lets you, Wile E. Coyote, sail over the edge. We have active record - for interacting with databases, active storage for storing files, etc, but where's - active deployment? Come learn how Kuby, a new deployment tool, is trying to bridge - the gap. - speakers: - - Cameron Dutro - event_name: RailsConf 2022 - video_id: zbAslvHa7MI - thumbnail_sm: https://i.ytimg.com/vi/zbAslvHa7MI/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/zbAslvHa7MI/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/zbAslvHa7MI/sddefault.jpg -- title: 'Keynote: RailsConf 2022' - raw_title: 'RailsConf 2022 - Keynote: RailsConf 2022 - It''s been a minute! by Aaron - Patterson' - description: 'Keynote: RailsConf 2022 - It''s been a minute! by Aaron Patterson' - speakers: - - It's been a minute! - - Aaron Patterson - event_name: RailsConf 2022 - video_id: 5QgQicKHmeU - thumbnail_sm: https://i.ytimg.com/vi/5QgQicKHmeU/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/5QgQicKHmeU/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/5QgQicKHmeU/sddefault.jpg -- title: Leveling Up from Planning to Production - raw_title: RailsConf 2022 - Leveling Up from Planning to Production by Thomas Countz - description: |- - The biggest difference between a mid-level engineer and a senior engineer is the scale and scope of the work they're responsible for. How do you dive into complex tasks, report progress to project leadership, and stay focused with so many unknowns? - - These are the questions I've continued to ask myself as I grow in my career. In this session, we'll explore the tools myself and other senior-level individual contributors use to shape our work from project inception to delivery. - speakers: - - Thomas Countz - event_name: RailsConf 2022 - video_id: 4XkPMWiTRMA - thumbnail_sm: https://i.ytimg.com/vi/4XkPMWiTRMA/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/4XkPMWiTRMA/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/4XkPMWiTRMA/sddefault.jpg -- title: 'Evaluating Cultural Fit + Culturesmithing: Everyone Influences...' - raw_title: 'RailsConf 2022 - Evaluating Cultural Fit + Culturesmithing: Everyone - Influences... by Casey Watts' - description: "Evaluating Cultural Fit + Culturesmithing: Everyone Influences Culture\nCasey - Watts \n\n“Toxic culture” is, by far, the number one reason that people are quitting - their jobs. People are no longer willing to work at organizations where they don’t - feel valued, respected, and included. Economists have dubbed this “The Great Resignation.” - In this talk you will learn how this situation applies to you and what you can - do to make things better. You will learn a framework for evaluating whether an - organization’s culture meets your personal needs, and you will learn 20 immediately - implementable techniques to improve this culture." - speakers: - - Casey Watts - event_name: RailsConf 2022 - video_id: yVUxqQmyUQ8 - thumbnail_sm: https://i.ytimg.com/vi/yVUxqQmyUQ8/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/yVUxqQmyUQ8/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/yVUxqQmyUQ8/sddefault.jpg -- title: Do You Trust Me? A look at Trust, Time, and Teams - raw_title: RailsConf 2022 - Do You Trust Me? A look at Trust, Time, and Teams by - John DeWyze - description: |- - I've got a deal for you. You give me some trust, I'll give you some time back. No strings attached. - - Trust is core to working on a team. We give a little trust, so we can save time. We use systems to create/protect/and outsource trust: PRs, pairing, code cov, type systems, etc. Join me for an exploration of trust in engineering, the psychology of trust, its relationship to time, and how we can have better trust rituals when we reframe the goal. So give me a little of your time and I'll teach you a little about trust. Do we have a deal? - speakers: - - John DeWyze - event_name: RailsConf 2022 - video_id: DoOpM3_xUQY - thumbnail_sm: https://i.ytimg.com/vi/DoOpM3_xUQY/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/DoOpM3_xUQY/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/DoOpM3_xUQY/sddefault.jpg -- title: The Little Engines That Could - raw_title: RailsConf 2022 - The Little Engines That Could by Mina Slater - description: |- - Rails Engines. It’s more than just a cute name made up of two words both related to trains. - - Are they plug-ins? Are they microservices? When do we use them? How do we implement them? Why aren’t they used more often? - - Those are the questions I wish were answered for me when I first learned about Rails Engines. Inspired by Wired’s Explain In 5 Levels series, we will explore Rails Engines and address these quandaries using a variety of techniques, breaking down what engines are and how and when to use them. - speakers: - - Mina Slater - event_name: RailsConf 2022 - video_id: I7ytUvv4d7Y - thumbnail_sm: https://i.ytimg.com/vi/I7ytUvv4d7Y/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/I7ytUvv4d7Y/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/I7ytUvv4d7Y/sddefault.jpg -- title: Scaling Rails with JRuby in 2022 - raw_title: RailsConf 2022 - Scaling Rails with JRuby in 2022 by Charles Oliver Nutter - description: JRuby is back in 2022 with Ruby 3.1 support and new work on performance - and scaling. For over a decade, Ruby users have turned to JRuby to get access - to world-class garbage collection, native JIT compilation for increased performance, - and true parallel threading. Today, you can take your Rails app and reduce both - latency and resource costs by hosting a single JRuby process for all your concurrent - users. JRuby is the only alternative Ruby deployed at scale, powering companies - all over the world in mission critical areas. Come see how JRuby can help you - scale today! - speakers: - - Charles Oliver Nutter - event_name: RailsConf 2022 - video_id: 3mH4OxFJa1c - thumbnail_sm: https://i.ytimg.com/vi/3mH4OxFJa1c/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/3mH4OxFJa1c/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/3mH4OxFJa1c/sddefault.jpg -- title: Spacecraft! The care and keeping of a legacy ... - raw_title: RailsConf 2022 - Spacecraft! The care and keeping of a legacy ... by - Annie Lydens & Jenny Allar - description: |- - Spacecraft! The care and keeping of a legacy application - Annie Lydens & Jenny Allar - - Join us for an allegorical journey aboard the spacecraft Legacy, where the astronauts desperately need to update their aging infrastructure. Their leader, a brave spaceperson named Yuki, knows these repairs must be completed before the team gets hit by a series of feature request asteroids. This talk is an ELI5 journey through the various strategies around assessing, improving, and bullet-proofing Rails apps in need of some cosmic maintenance. - speakers: - - Annie Lydens - - Jenny Allar - event_name: RailsConf 2022 - video_id: 1jPZHjmQwCM - thumbnail_sm: https://i.ytimg.com/vi/1jPZHjmQwCM/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/1jPZHjmQwCM/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/1jPZHjmQwCM/sddefault.jpg -- title: "`rails c` with meturbocharge your use of the interactive console" - raw_title: RailsConf 2022 - `rails c` with meturbocharge your use of the interactive - console by Sweta Sanghavi - description: Spinning up the rails console can be a quick way to answer a question - with a back of the envelope calculation. But, what else can we use it for, and - how does it work? Allow me to show you new ways to leverage the console's features - and become an even more expert debugger. You'll leave with some simple tactics - to save you time and write more performant code. While you're here, we'll look - under the hood to see how the features of the console are encoded and we'll trace - back the history of these libraries to see how they arrived in our Rails application. - speakers: - - Sweta Sanghavi - event_name: RailsConf 2022 - video_id: owj6e69lIws - thumbnail_sm: https://i.ytimg.com/vi/owj6e69lIws/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/owj6e69lIws/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/owj6e69lIws/sddefault.jpg -- title: 'ELI5: A Game Show on Rails' - raw_title: 'RailsConf 2022 - ELI5: A Game Show on Rails by Andy Glass' - description: |- - ‘Those who know, do. Those that understand, teach.’ - - We might know our way around the classic conventions of our beloved Ruby on Rails, but do we understand them enough to explain those concepts to our peers? In this interactive (participation optional!) game show session, let’s find out! - - After we quickly discuss some of the philosophies of teaching, we’ll divide up into teams and play a Jeopardy! meets Catchphrase hybrid game… with a few surprises along the way! Beginner, intermediate and advanced Rails-devs are welcome, and Portland-themed prizes will be awarded to the winners. - speakers: - - Andy Glass - event_name: RailsConf 2022 - video_id: n7JqHXlUQHo - thumbnail_sm: https://i.ytimg.com/vi/n7JqHXlUQHo/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/n7JqHXlUQHo/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/n7JqHXlUQHo/sddefault.jpg -- title: Don't page me! How we limit pager noise at New Relic - raw_title: RailsConf 2022 - Don't page me! How we limit pager noise at New Relic - by Chuck Lauer Vose - description: |- - New Relic's largest monolith handles 200k req/min and communicates with more than 40 external services and 11 mysql databases; this should result in constant downtime. Being mindful and alerting on the right things has been critical for us. - - This talk will cover a successful process for identifying trustworthy data, refining alert conditions, and what kinds of checks to page on. - speakers: - - Chuck Lauer Vose - event_name: RailsConf 2022 - video_id: uNMQpkb7uvE - thumbnail_sm: https://i.ytimg.com/vi/uNMQpkb7uvE/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/uNMQpkb7uvE/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/uNMQpkb7uvE/sddefault.jpg -- title: RAILS_ENV=demo - raw_title: RailsConf 2022 - RAILS_ENV=demo by Nathan Griffith - description: "Today’s the day. You’ve prepared your pitch, deployed a special copy - of your app, and confirmed—in a trial run—that your walkthrough is ready for a - live audience. But, now, when you attempt to log in, something breaks. Flustered, - you debug, apologize, and debug some more, before finally calling it quits. Next - time, you’ll bring a prerecorded screencast... \U0001F62E‍\U0001F4A8\n\nWhat could’ve - been done to make the app more reliably \"demoable\"? Join us, as we use \"stateful - fakes\" and \"personas\" to produce a testable, maintainable, and failure-resistant - \"demo\" deployment, with production-like uptime guarantees!" - speakers: - - Nathan Griffith - event_name: RailsConf 2022 - video_id: VibJu9IMohc - thumbnail_sm: https://i.ytimg.com/vi/VibJu9IMohc/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/VibJu9IMohc/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/VibJu9IMohc/sddefault.jpg -- title: If You Know Heroku, You Can Use Kubernetes - raw_title: RailsConf 2022 - If You Know Heroku, You Can Use Kubernetes by Jamie - Gaskins - description: You've probably heard "Kubernetes is overcomplicated! Just use Heroku!" - But it turns out that, while Kubernetes can be complicated, it doesn't have to - be. In this talk, you'll learn how to deploy with Kubernetes in a way that is - nearly as friendly as with Heroku. - speakers: - - Jamie Gaskins - event_name: RailsConf 2022 - video_id: zYHqnp4zK_4 - thumbnail_sm: https://i.ytimg.com/vi/zYHqnp4zK_4/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/zYHqnp4zK_4/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/zYHqnp4zK_4/sddefault.jpg -- title: '"Build vs Buy" on Rails' - raw_title: RailsConf 2022 - "Build vs Buy" on Rails by Colin Loretz - description: |- - Your SaaS app is adding new engaged users every day and your roadmap is growing with features to delight them! Users are requesting new 3rd party integrations, more powerful search, reporting capabilities, and live chat, oh my! - - Should you try and build all of these features? Should you work with partner services to add these features? The answer: it depends! - - In 2022, the classic "Build vs Buy" question is more nuanced than ever and we'll dig into the pros and cons when building (or buying) on Rails. - speakers: - - Colin Loretz - event_name: RailsConf 2022 - video_id: A-GDhlBTHoo - thumbnail_sm: https://i.ytimg.com/vi/A-GDhlBTHoo/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/A-GDhlBTHoo/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/A-GDhlBTHoo/sddefault.jpg -- title: Shopify - raw_title: RailsConf 2022 - Shopify - description: Shopify - speakers: [] - event_name: RailsConf 2022 - video_id: p_C6BcKX0qs - thumbnail_sm: https://i.ytimg.com/vi/p_C6BcKX0qs/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/p_C6BcKX0qs/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/p_C6BcKX0qs/sddefault.jpg -- title: 'Keynote: The Success of Ruby on Rails' - raw_title: 'RailsConf 2022 - Keynote: The Success of Ruby on Rails by Eileen Uchitelle' - description: 'Keynote: The Success of Ruby on Rails by Eileen Uchitelle' - speakers: - - Eileen Uchitelle - event_name: RailsConf 2022 - video_id: MbqJzACF-54 - thumbnail_sm: https://i.ytimg.com/vi/MbqJzACF-54/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/MbqJzACF-54/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/MbqJzACF-54/sddefault.jpg -- title: 'A Rails Performance Guidebook: from 0 to 1B requests/day' - raw_title: 'RailsConf 2022 - A Rails Performance Guidebook: from 0 to 1B requests/day - by Cristian Planas' - description: |- - Building a feature is not good enough anymore: all your work won't be of use if it's not performant enough. So how to improve performance? After all, performance is not an easy discipline to master: all slow applications are slow in their own way, meaning that there is no silver bullet for these kinds of problems. - - In this presentation, we will guide you across patterns, strategies, and little tricks to improve performance. We will do that by sharing real stories of our daily experience facing and solving real performance issues in an application that daily serves billions of requests per day. - speakers: - - Cristian Planas - event_name: RailsConf 2022 - video_id: mJw3al4Ms2o - thumbnail_sm: https://i.ytimg.com/vi/mJw3al4Ms2o/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/mJw3al4Ms2o/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/mJw3al4Ms2o/sddefault.jpg -- title: Unboxing Rails 7What's new in the latest major version - raw_title: RailsConf 2022 - Unboxing Rails 7What's new in the latest major version - by Claudio Baccigalupo - description: |- - Rails 7.0 removes webpacker and spring from the default stack, adds encrypted attributes, allows for asynchronous query loading, changes autoloading defaults, attaches comments to Active Record queries, and introduces new tools for front-end development. - - Learn about these and many other Pull Requests that were merged in rails/rails in 2021. Understand the motivation behind some architectural decisions. Review the process to upgrade from Rails 6.1 to Rails 7. - speakers: - - Claudio Baccigalupo - event_name: RailsConf 2022 - video_id: Xu12Vua5QJE - thumbnail_sm: https://i.ytimg.com/vi/Xu12Vua5QJE/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/Xu12Vua5QJE/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/Xu12Vua5QJE/sddefault.jpg -- title: GraphQL and Rails beyond HTTP APIs - raw_title: RailsConf 2022 - GraphQL and Rails beyond HTTP APIs by Gui Vieira - description: |- - Are you considering building a GraphQL API for your Rails project or already have one? Do you know GraphQL can be leveraged beyond HTTP APIs? - - We will explore how GraphQL does not depend on HTTP and can be used as a secure and structured data layer for Rails projects. You will learn to deliver real-time GGraphQL through Websockets, Webhooks containing all the data you need, provide data for WebAssembly code and parallelize queries exporting large amounts of data. Every Rails project needs consistent access to data and GraphQL brings solutions beyond the typical HTTP API. - speakers: - - Gui Vieira - event_name: RailsConf 2022 - video_id: glIahiGtLvo - thumbnail_sm: https://i.ytimg.com/vi/glIahiGtLvo/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/glIahiGtLvo/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/glIahiGtLvo/sddefault.jpg -- title: Ooops! You named it wrong. What now? - raw_title: RailsConf 2022 - Ooops! You named it wrong. What now? by Ian Norris & - Melissa Hunt Glickman - description: |- - You hear everybody talk about the newest feature to Widgets but you can’t find a single model reference to that in the code. What happened? Sometimes the business changes aren’t reflected in the code. Sometimes, you're missing information or the code grows into something different. What do you do? ‘Cuz you still gotta ship. - - Buckle up for a fast paced ride through the opportunities and pitfalls faced when you find yourself in this position. Through success and failure stories, learn how to leave space for names to breathe, make changes safely, and walking that fine line of changing just in time. - speakers: - - Ian Norris - - Melissa Hunt Glickman - event_name: RailsConf 2022 - video_id: zUiVFGKN2Xk - thumbnail_sm: https://i.ytimg.com/vi/zUiVFGKN2Xk/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/zUiVFGKN2Xk/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/zUiVFGKN2Xk/sddefault.jpg -- title: 'Browser History Confessional: Searching My Recent Searches' - raw_title: 'RailsConf 2022 - Browser History Confessional: Searching My Recent Searches - by Kevin Murphy' - description: |- - We all only have so much working memory available in our brains. Developers may joke about spending their day composing search engine queries. The reason it's a joke is because of the truth behind it. Search-driven development is a reality. - - Join me, and my actual search history, on a journey to solve recent challenges I faced. I'll categorize the different types of information I often search for. You'll leave with tips on retrieving the knowledge you need for your next bug, feature, or pull request. - speakers: - - Kevin Murphy - event_name: RailsConf 2022 - video_id: R7LkHjJdH9o - thumbnail_sm: https://i.ytimg.com/vi/R7LkHjJdH9o/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/R7LkHjJdH9o/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/R7LkHjJdH9o/sddefault.jpg -- title: Computer science you might (not) want to know - raw_title: RailsConf 2022 - Computer science you might (not) want to know by Andy - Andrea - description: |- - One common recommendation for aspiring software developers is to pursue a degree in Computer Science (CS). While CS curricula do often cover practical software development skills, many departments heavily prioritize more academic and theoretical topics. This begs the question: how relevant is a CS degree to the day-to-day work of a professional developer? - - We’ll look at a few topics that are often included in the first half of an undergraduate CS curriculum. We’ll examine this information through two lenses: why it can be helpful and why it might not be all that relevant for a typical Rails dev. - speakers: - - Andy Andrea - event_name: RailsConf 2022 - video_id: bK7n5EsZzlM - thumbnail_sm: https://i.ytimg.com/vi/bK7n5EsZzlM/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/bK7n5EsZzlM/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/bK7n5EsZzlM/sddefault.jpg -- title: 'Gem install: What could go wrong?' - raw_title: 'RailsConf 2022 - Gem install: What could go wrong? by Ashley Ellis Pierce - & Betty Li' - description: |- - The open source gem ecosystem is a major strength of Ruby and it’s not uncommon for a production Rails application to depend upon hundreds of gems. But what are the risks of installing a gem and having it in your Gemfile? - - In this talk, we’ll cover what “bad things” can actually happen when you install a gem. We’ll also talk about the ways of preventing these attacks from occurring in your application dependencies (so you can sleep well at night). - speakers: - - Ashley Ellis Pierce - - Betty Li - event_name: RailsConf 2022 - video_id: Gc-ajZ3Ed5A - thumbnail_sm: https://i.ytimg.com/vi/Gc-ajZ3Ed5A/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/Gc-ajZ3Ed5A/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/Gc-ajZ3Ed5A/sddefault.jpg -- title: 'The Queue Continuum: Applied Queuing Theory' - raw_title: 'RailsConf 2022 - The Queue Continuum: Applied Queuing Theory by Justin - Bowen' - description: A Star Trek themed exploration of queuing theory and scaling applications - with parallelism and concurrency. A general overview of the differences between - parallelism and concurrency as well as when to apply more threads or more processes. - We’ll go over examples of sidekiq and puma with different concurrency settings - in various IO scenarios. - speakers: - - Justin Bowen - event_name: RailsConf 2022 - video_id: GY4AT2z7mcI - thumbnail_sm: https://i.ytimg.com/vi/GY4AT2z7mcI/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/GY4AT2z7mcI/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/GY4AT2z7mcI/sddefault.jpg -- title: Ruby Archaeology - raw_title: RailsConf 2022 - Ruby Archaeology by Nick Schwaderer - description: |- - In 2009 _why tweeted: "programming is rather thankless. you see your works become replaced by superior works in a year. unable to run at all in a few more." - I take this as a call to action to run old code. In this talk we dig, together, through historical Ruby. We will have fun excavating interesting gems from the past. - - Further, I will answer the following questions: - - What code greater than 12 years old still runs in Ruby 3.1? - What idioms have changed? - And for the brave: how can you set up an environment to run Ruby 1.8 code from ~2008 on a modern machine? - speakers: - - Nick Schwaderer - event_name: RailsConf 2022 - video_id: VPXHclib7X4 - thumbnail_sm: https://i.ytimg.com/vi/VPXHclib7X4/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/VPXHclib7X4/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/VPXHclib7X4/sddefault.jpg -- title: 'Upgrading Rails: Everyone can do it and here’s how' - raw_title: 'RailsConf 2022 - Upgrading Rails: Everyone can do it and here’s how - by Andrea Fomera' - description: Ever felt overwhelmed when figuring out how to upgrade a Rails app? - Unsure where you should begin? We’ll talk about how upgrading should be treated - as a feature, and how you can get buy-in from management for upgrading Rails. - Have you heard about how GitHub or Shopify uses dual-booting to run two versions - of Rails at once and wondered how that works? We’ll talk about three approaches - you can use to upgrade your app. You’ll leave this talk with takeaways you can - put into practice for your next Rails upgrade. - speakers: - - Andrea Fomera - event_name: RailsConf 2022 - video_id: E4nYO_MEbAA - thumbnail_sm: https://i.ytimg.com/vi/E4nYO_MEbAA/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/E4nYO_MEbAA/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/E4nYO_MEbAA/sddefault.jpg -- title: 'Let Your Body Lead: Career Planning With Somatics' - raw_title: 'RailsConf 2022 - Let Your Body Lead: Career Planning With Somatics by - Amy Newell' - description: |- - How do you build a career you love? As engineers we try to make choices based on data, metrics, research. We make spreadsheets and “Compare Features.” And yet...so often we end up unhappy. All that careful research somehow doesn’t help. - - But what if you made decisions a different way? What if you had a sophisticated decision-making apparatus to guide you, built precisely to your needs -- an always-available guide? - - You do! It’s called your somatic intelligence. With practice you can learn to tune into it and let your body lead the way to satisfaction and fulfillment -- in every area of your life. - speakers: - - Amy Newell - event_name: RailsConf 2022 - video_id: XLAOzi-SNMs - thumbnail_sm: https://i.ytimg.com/vi/XLAOzi-SNMs/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/XLAOzi-SNMs/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/XLAOzi-SNMs/sddefault.jpg -- title: Geolocation EXPLAINed - raw_title: RailsConf 2022 - Geolocation EXPLAINed by Kevin Lesht - description: |- - How do you find the location of someone visiting your site? And, how do you do it fast? If you've ever been curious about how analytics services can place your site visitors on a map, or about how to analyze and improve a slow running query, then this talk is for you! - - In this session, you'll learn about IP address networking, fundamental database operations, and query performance tuning. We'll develop a geolocation system from the ground up, and make sure it's running lightning fast along the way. - speakers: - - Kevin Lesht - event_name: RailsConf 2022 - video_id: C8yjDz91Oy0 - thumbnail_sm: https://i.ytimg.com/vi/C8yjDz91Oy0/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/C8yjDz91Oy0/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/C8yjDz91Oy0/sddefault.jpg -- title: Building a diverse engineering team - raw_title: RailsConf 2022 - Building a diverse engineering team - Wrapbook - Zaid - Zawaideh & Jessica Lawrence - description: Building a diverse engineering team - Wrapbook - Zaid Zawaideh & Jessica - Lawrence - speakers: - - Wrapbook - - " Zaid Zawaideh" - - Jessica Lawrence - event_name: RailsConf 2022 - video_id: nhTo-cZMy3M - thumbnail_sm: https://i.ytimg.com/vi/nhTo-cZMy3M/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/nhTo-cZMy3M/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/nhTo-cZMy3M/sddefault.jpg -- title: Diversity in Engineering; a community perspective - raw_title: RailsConf 2022 - Diversity in Engineering; a community perspective - description: "Diversity in Engineering; a community perspective\n- Shopify - \nMaya - Toussaint, Caterina Paun & Stephanie Minn" - speakers: [] - event_name: RailsConf 2022 - video_id: UIBmJqUL36Q - thumbnail_sm: https://i.ytimg.com/vi/UIBmJqUL36Q/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/UIBmJqUL36Q/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/UIBmJqUL36Q/sddefault.jpg -- title: Bringing Your Rails Monolith Along As The Business Grows - raw_title: RailsConf 2022 - Bringing Your Rails Monolith Along As The Business Grows - - Ontra - Carrick Rogers - description: Bringing Your Rails Monolith Along As The Business Grows - Ontra - - Carrick Rogers - speakers: - - Ontra - - Carrick Rogers - event_name: RailsConf 2022 - video_id: WVuw0sT8vqw - thumbnail_sm: https://i.ytimg.com/vi/WVuw0sT8vqw/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/WVuw0sT8vqw/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/WVuw0sT8vqw/sddefault.jpg -- title: Growing Your Background Job Knowledge - raw_title: RailsConf 2022 - Growing Your Background Job Knowledge - Weedmaps - Jake - Anderson - description: "Growing Your Background Job Knowledge \n- Weedmaps - Jake Anderson" - speakers: - - Weedmaps - - Jake Anderson - event_name: RailsConf 2022 - video_id: CL7oUv5AibY - thumbnail_sm: https://i.ytimg.com/vi/CL7oUv5AibY/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/CL7oUv5AibY/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/CL7oUv5AibY/sddefault.jpg -- title: Puny to Powerful PostgreSQL Rails Apps - raw_title: RailsConf 2022 - Puny to Powerful PostgreSQL Rails Apps by Andrew Atkinson - description: This talk covers 5 challenging areas when scaling Rails applications - on PostgreSQL databases. From identifying symptoms to applying solutions and understanding - trade-offs, this talk will equip you with practical working knowledge you can - apply immediately. This talk covers topics like safe migrations, understanding - database connections, query optimization, database maintenance, and database replication - and partitioning. - speakers: - - Andrew Atkinson - event_name: RailsConf 2022 - video_id: CIYbpYKrX8Y - thumbnail_sm: https://i.ytimg.com/vi/CIYbpYKrX8Y/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/CIYbpYKrX8Y/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/CIYbpYKrX8Y/sddefault.jpg -- title: How music works, using Ruby - raw_title: RailsConf 2022 - How music works, using Ruby by Thijs Cadier - description: |- - That strange phenomenon where air molecules bounce against each other in a way that somehow comforts you, makes you cry, or makes you dance all night: music. Since the advent of recorded audio, a musician doesn't even need to be present anymore for this to happen (which makes putting "I will always love you" on repeat a little less awkward). - - Sound engineers have found many ways of making music sound good when played from a record. Some of their methods have become industry staples used on every recording released today. - - Let's look at what they do and reproduce some of their methods in Ruby! - speakers: - - Thijs Cadier - event_name: RailsConf 2022 - video_id: "-kM7o9zEX2A" - thumbnail_sm: https://i.ytimg.com/vi/-kM7o9zEX2A/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/-kM7o9zEX2A/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/-kM7o9zEX2A/sddefault.jpg -- title: Service Denied! Understanding How Regex DoS Attacks Work - raw_title: RailsConf 2022 - Service Denied! Understanding How Regex DoS Attacks - Work by Kevin Menard - description: Did you know that people can knock your Rails application offline just - by submitting specially formatted strings in a form or API request? In this talk, - we’ll take a look at what’s really going on with a regex denial of service (DoS) - attack. We’ll take a peek into the CRuby regex engine to see what it’s really - doing when we ask it to match against a string. With a basic understanding of - how regular expressions work, we can better understand what these attacks do, - why they tie up so much CPU, and what we can do to guard against them. - speakers: - - Kevin Menard - event_name: RailsConf 2022 - video_id: BmTuDIj3Eok - thumbnail_sm: https://i.ytimg.com/vi/BmTuDIj3Eok/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/BmTuDIj3Eok/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/BmTuDIj3Eok/sddefault.jpg -- title: Call me back, Postgres - raw_title: RailsConf 2022 - Call me back, Postgres by Ifat Ribon - description: 'Rails'' Active Record callbacks provide a simple interface for executing - a process when something happens to a database record. However, sometimes Active - Record callbacks aren’t the best solution available. For those cases, this talk - introduces a great alternative: Postgres'' trigger functionality, a way of implementing - callbacks at the database level. Coupled with Postgres'' listen and notify features, - you can develop creative solutions for making your Rails app the center of an - otherwise complex system, managing data syncing and other processes seamlessly, - regardless of consumers of the app.' - speakers: - - Ifat Ribon - event_name: RailsConf 2022 - video_id: nWe8JtZx3HM - thumbnail_sm: https://i.ytimg.com/vi/nWe8JtZx3HM/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/nWe8JtZx3HM/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/nWe8JtZx3HM/sddefault.jpg -- title: Wrapbook - raw_title: RailsConf 2022 - Wrapbook - description: Wrapbook - speakers: [] - event_name: RailsConf 2022 - video_id: dw2IAX4idrc - thumbnail_sm: https://i.ytimg.com/vi/dw2IAX4idrc/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/dw2IAX4idrc/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/dw2IAX4idrc/sddefault.jpg -- title: 'Keynote: A tech görl origin story' - raw_title: 'RailsConf 2022 - Keynote: A tech görl origin story by Crystal Tia Martin' - description: 'Keynote: A tech görl origin story by Crystal Tia Martin' - speakers: - - Crystal Tia Martin - event_name: RailsConf 2022 - video_id: qWJ63Qy8QII - thumbnail_sm: https://i.ytimg.com/vi/qWJ63Qy8QII/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/qWJ63Qy8QII/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/qWJ63Qy8QII/sddefault.jpg -- title: O(1), O(n) and O(#$*&!) - raw_title: RailsConf 2022 - O(1), O(n) and O(#$*&!) by Stephen Prater - description: Reasoning about the performance of your code doesn't need to require - a PhD in computer science or specialized tooling - We'll learn how to quickly - recognize and diagnose common performance issues like excessive algorithmic complexity - and IO waiting using OpenTelemetry compatible tools. Then we'll fix those issues, - and ensure that they stay fixed using automated performance testing, even as your - application grows. - speakers: - - Stephen Prater - event_name: RailsConf 2022 - video_id: fAwaezTP3d4 - thumbnail_sm: https://i.ytimg.com/vi/fAwaezTP3d4/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/fAwaezTP3d4/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/fAwaezTP3d4/sddefault.jpg -- title: Git your PR accepted. Rebase your changes like a pro - raw_title: RailsConf 2022 - Git your PR accepted. Rebase your changes like a pro - by Daniel Magliola - description: |- - You want to contribute to an Open Source project, and you have a complex PR to submit. You've tried to keep it small, but sadly getting there took a lot of effort and your branch has more than 30 commits with fixes and reverting of dead ends. - - You know reviewing this will be a nightmare for the project maintainers, and more importantly, it will be almost impossible for anyone in the future to understand what you did by looking at the history. - - In this talk we will look at how Git branches work, and how to manicure them using Rebase to build a commit history your colleagues will love you for. - speakers: - - Daniel Magliola - event_name: RailsConf 2022 - video_id: Q01m5pRNry0 - thumbnail_sm: https://i.ytimg.com/vi/Q01m5pRNry0/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/Q01m5pRNry0/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/Q01m5pRNry0/sddefault.jpg -- title: 'Open the gate a little: strategies to protect and share data' - raw_title: 'RailsConf 2022 - Open the gate a little: strategies to protect and share - data by Fernando Petrales' - description: |- - Open the gate a little: strategies to protect and share data - Can you name a more terrifying set of three words in software development than "HIPAA violation fines"? I bet you can't. - - We know we know we must protect access to our information at all costs, sometimes we need to provide access for legitimate reasons to our production data and this brings a dilemma to us: how to do it while minimizing the risks of data leakage. - - In this talk I'll share some strategies that can give you some guidance on when to close the door, when to open the door and when to open the door to your information a little - speakers: - - Fernando Petrales - event_name: RailsConf 2022 - video_id: 9no7cvBGtLk - thumbnail_sm: https://i.ytimg.com/vi/9no7cvBGtLk/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/9no7cvBGtLk/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/9no7cvBGtLk/sddefault.jpg -- title: Reflecting on Active Record Associations - raw_title: RailsConf 2022 - Reflecting on Active Record Associations by Daniel Colson - description: Active Record associations seem magical—add a has_many here, a belongs_to - there, and suddenly your models are loaded with behavior. Could it be magic, or - is it plain old Ruby with some thoughtful design and a bit of metaprogramming? - In this talk we'll study Active Record associations by writing our own belongs_to - and has_many macros. We'll dynamically define methods, cache query results, replace - a a Relation with a CollectionProxy, and automatically prevent N+1 queries with - inverses. You'll leave with a deeper understanding of associations, and a new - appreciation for their magic. - speakers: - - Daniel Colson - event_name: RailsConf 2022 - video_id: 6qHKtAkqguc - thumbnail_sm: https://i.ytimg.com/vi/6qHKtAkqguc/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/6qHKtAkqguc/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/6qHKtAkqguc/sddefault.jpg -- title: Experimental Patterns in ActiveRecord - raw_title: RailsConf 2022 - Experimental Patterns in ActiveRecord by John Crepezzi - description: |- - ActiveRecord provides a great deal of flexibility and speed of implementation for developers making new apps. As our teams and codebase grow and our services need to continue to scale, some of the patterns we use can start to get in our way. We've seen a bit of that at GitHub, and as a result have been experimenting with some new ways to work with ActiveRecord queries, reduce N+1s, and isolate model details. - - In this talk, I'll go over some the problems we've been facing, cover how we've been addressing them so far, and show some new experiments & patterns I've been working through. - speakers: - - John Crepezzi - event_name: RailsConf 2022 - video_id: hNg1M1oBTRo - thumbnail_sm: https://i.ytimg.com/vi/hNg1M1oBTRo/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/hNg1M1oBTRo/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/hNg1M1oBTRo/sddefault.jpg -- title: 'Keynote: Meditations on Software' - raw_title: 'RailsConf 2022 - Keynote: Meditations on Software by Vaidehi Joshi' - description: 'Keynote: Meditations on Software by Vaidehi Joshi' - speakers: - - Vaidehi Joshi - event_name: RailsConf 2022 - video_id: mWXo0PFYgIk - thumbnail_sm: https://i.ytimg.com/vi/mWXo0PFYgIk/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/mWXo0PFYgIk/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/mWXo0PFYgIk/sddefault.jpg -- title: The Mrs Triggs Problem - raw_title: RailsConf 2022 - The Mrs Triggs Problem by Andy Croll - description: |- - "That's a good suggestion Mrs Triggs, perhaps one of the men in the room would like to make it?" - - As a society we have an attribution problem. People who look like me get it easy. Join me to explore how we can push back on the default stories & myths of who is providing value in our community. - - Warning, may contain content that will make you uncomfortable about your own past behaviour. But you'll leave better able to provide a better industry for your fellow humans. - speakers: - - Andy Croll - event_name: RailsConf 2022 - video_id: QbcSsDUyW6s - thumbnail_sm: https://i.ytimg.com/vi/QbcSsDUyW6s/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/QbcSsDUyW6s/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/QbcSsDUyW6s/sddefault.jpg -- title: Don't touch that! - raw_title: RailsConf 2022 - Don't touch that! by Adam Cuppy - description: Ruby on Rails is a huge framework. There are modules, classes, established - conventions, and a slew of code that's meant to be off-limits. But, what if we - took our ornery childish self and played around? This is a talk about strategies - for debugging, taught through the lens of experimentation and childish play. In - this talk, we will override, extend, and disable all sorts of Rails internals - and see what happens. - speakers: - - Adam Cuppy - event_name: RailsConf 2022 - video_id: XDGPP5sEOR4 - thumbnail_sm: https://i.ytimg.com/vi/XDGPP5sEOR4/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/XDGPP5sEOR4/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/XDGPP5sEOR4/sddefault.jpg -- title: Your TDD Treasure Map - raw_title: RailsConf 2022 - Your TDD Treasure Map by Christopher "Aji" Slater - description: We know testing is vital and makes refactoring painless. But how to - set sail to that TDD treasure? Yarr, we need to test to get experience, but need - experience to test. Let’s draw a map with simple strategies for identifying test - cases and building a robust test suite. X marks the spot w/ TDD tools for newbies - and seasoned pirates alike. - speakers: - - Christopher "Aji" Slater - event_name: RailsConf 2022 - video_id: 9DVOi2NhkfQ - thumbnail_sm: https://i.ytimg.com/vi/9DVOi2NhkfQ/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/9DVOi2NhkfQ/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/9DVOi2NhkfQ/sddefault.jpg -- title: Your test suite is making too many database calls! - raw_title: RailsConf 2022 - Your test suite is making too many database calls! by - Joël Quenneville - description: |- - On a recent project, I sped up a test suite 15% by making a change to a single factory. This suite, like many others (including yours!), was making way too many database calls. It’s so easy to accidentally add extra queries to factories and test setup and these can compound to shockingly large numbers. - - The chaos is your opportunity! Learn to profile and fix hot spots, build big-picture understanding through diagrams, and write code that is resistant to extraneous queries. This talk will equip you to take back control of your build times and maybe impress your teammates in the process. - speakers: - - Joël Quenneville - event_name: RailsConf 2022 - video_id: LOlG4kqfwcg - thumbnail_sm: https://i.ytimg.com/vi/LOlG4kqfwcg/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/LOlG4kqfwcg/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/LOlG4kqfwcg/sddefault.jpg -- title: Testing legacy code when you dislike tests (and legacy code) - raw_title: RailsConf 2022 - Testing legacy code when you dislike tests (and legacy - code) by Maeve Revels - description: |- - Are you supporting legacy code? Would you like to stop? A good testing strategy can transform legacy code into living code that is resilient and easy to evolve. - - Learn why legacy code is so difficult to maintain and identify where tests can make the most impact. Not just any tests, though! We'll dive into the characteristics of high-value versus low-value tests and learn techniques for writing tests that minimize the cost of change. - - Developers of any experience level can benefit from these concepts. Familiarity with Rails and an automated testing framework is helpful but not required. - speakers: - - Maeve Revels - event_name: RailsConf 2022 - video_id: 6x_w7XmTLYg - thumbnail_sm: https://i.ytimg.com/vi/6x_w7XmTLYg/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/6x_w7XmTLYg/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/6x_w7XmTLYg/sddefault.jpg -- title: Laying the Cultural and Technical Foundation for Big Rails - raw_title: RailsConf 2022 - Laying the Cultural and Technical Foundation for Big - Rails by Alex Evanczuk - description: As applications built on Rails get larger and larger, and more and - more engineers work in the same monolith, our community needs to think more about - what sort of tooling and architectural changes will help us continue to scale. - This talk shares ideas around a toolchain, and more importantly, the social and - cultural programs needed to support that toolchain, that can be used to help engineers - in an ever-growing Rails codebase continue to have high velocity, manage their - complexity, and claim ownership over their own business subdomains. - speakers: - - Alex Evanczuk - event_name: RailsConf 2022 - video_id: J9S0qiGkAQY - thumbnail_sm: https://i.ytimg.com/vi/J9S0qiGkAQY/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/J9S0qiGkAQY/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/J9S0qiGkAQY/sddefault.jpg -- title: Your Service Layer Needn't be Fancy, It Just Needs to Exist - raw_title: RailsConf 2022 - Your Service Layer Needn't be Fancy, It Just Needs to - Exist by David Copeland - description: Where would you put your business logic if not in Active Records? The - answer is a service layer. Your service layer provides a seam between your user - interface and your database that contains all the code that makes your app your - app. This single design decision will buoy your app's sustainability for years. - You'll learn why this is and how to start a service layer today without any patterns, - principles, or fancy libraries. - speakers: - - David Copeland - event_name: RailsConf 2022 - video_id: CRboMkFdZfg - thumbnail_sm: https://i.ytimg.com/vi/CRboMkFdZfg/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/CRboMkFdZfg/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/CRboMkFdZfg/sddefault.jpg -- title: Pictures Of You, Pictures Of Me, Crypto Steganography - raw_title: RailsConf 2022 - Pictures Of You, Pictures Of Me, Crypto Steganography - by Sean Marcia - description: I was puzzled when a friend sent me a Buffy the Vampire Slayer picture - out of the blue but, knowing that friend is an oddball, thought nothing of it. - Days later, again without warning, a Babylon 5 picture. A few days after that - a picture from Firefly. Then he repeated the pictures. A cryptic comment led me - to understand that there was more to them than met the eye. Come learn the history, - applications, and math behind crypto steganography how unravelling the mystery - of the pictures culminated in the resolution of a 15 year rivalry when the US - Olympic men’s curling team won the gold in 2018. - speakers: - - Sean Marcia - event_name: RailsConf 2022 - video_id: 2gcO1Brjxac - thumbnail_sm: https://i.ytimg.com/vi/2gcO1Brjxac/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/2gcO1Brjxac/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/2gcO1Brjxac/sddefault.jpg -- title: Come on in! Making yourself at home in a new codebase - raw_title: RailsConf 2022 - Come on in! Making yourself at home in a new codebase - by Mercedes Bernard - description: "\"Welcome! We're so excited to have you \U0001F917 please excuse the - mess.\" – if a codebase could talk\n\nWhen we join a new team or start a new project, - we have to onboard to the codebase. Diving into code that we're unfamiliar with - can be stressful or make us feel like we don't know what we're doing. And the - longer the codebase has been around, the more intense those feelings can be. But - there are steps we can take to understand new code and start contributing quickly. - In this talk, we'll cover how to build our code comprehension skills and how to - make our own code welcoming to guests in the future." - speakers: - - Mercedes Bernard - event_name: RailsConf 2022 - video_id: ckwnxieAo1M - thumbnail_sm: https://i.ytimg.com/vi/ckwnxieAo1M/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/ckwnxieAo1M/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/ckwnxieAo1M/sddefault.jpg -- title: A Rails Developer’s Guide To The Ruby VM - raw_title: RailsConf 2022 - A Rails Developer’s Guide To The Ruby VM by Maple Ong - description: |- - What happens under the hood when you run a Ruby script as simple as puts “Hello World!”? - - Time to switch gears from the Rails-level of abstraction to a lower one and dive into some Ruby internals. We’ll be learning about how the Ruby code you write gets compiled and executed, then zoom in to the VM-level – what VMs are and what they do, and how the Ruby VM works. You’ll walk away with a better understanding of how Ruby and Rails works as a whole. No low-level systems knowledge needed! - speakers: - - Maple Ong - event_name: RailsConf 2022 - video_id: ySuMOEVLaMw - thumbnail_sm: https://i.ytimg.com/vi/ySuMOEVLaMw/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/ySuMOEVLaMw/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/ySuMOEVLaMw/sddefault.jpg -- title: You have 2 seconds to respond - raw_title: RailsConf 2022 - You have 2 seconds to respond - Atob - Justin Powers - description: "You have 2 seconds to respond \n- Atob - Justin Powers" - speakers: - - Atob - - Justin Powers - event_name: RailsConf 2022 - video_id: qh2phv0Gm3c - thumbnail_sm: https://i.ytimg.com/vi/qh2phv0Gm3c/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/qh2phv0Gm3c/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/qh2phv0Gm3c/sddefault.jpg -- title: 'More Engineers, More Problems: Solutions for Big Teams' - raw_title: 'RailsConf 2022 - More Engineers, More Problems: Solutions for Big Teams - - Chime -' - description: |- - More Engineers, More Problems: Solutions for Big Teams - - Chime - Noel Rappin, David Trejo, Brian Lesperance, Chris Dwan - speakers: - - Chime - - event_name: RailsConf 2022 - video_id: TmRyZ7FB-HA - thumbnail_sm: https://i.ytimg.com/vi/TmRyZ7FB-HA/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/TmRyZ7FB-HA/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/TmRyZ7FB-HA/sddefault.jpg -- title: 'Finding the Needle in the Stack Trace: APM Logs-in-Context' - raw_title: 'RailsConf 2022 - Finding the Needle in the Stack Trace: APM Logs-in-Context - - New Relic -' - description: |- - Finding the Needle in the Stack Trace: APM Logs-in-Context - - New Relic - Kayla Reopelle and Mike Neville-O'Neill - speakers: - - New Relic - - event_name: RailsConf 2022 - video_id: p_3CvQdK2R0 - thumbnail_sm: https://i.ytimg.com/vi/p_3CvQdK2R0/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/p_3CvQdK2R0/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/p_3CvQdK2R0/sddefault.jpg -- title: Functional Programming in Plain Terms - raw_title: RailsConf 2022 - Functional Programming in Plain Terms by Eric Weinstein - description: 'Have you ever wanted to know what a monad is? How about a functor? - What about algebraic data types and parametric polymorphism? If you''ve been interested - in these ideas but scared off by the language, you''re not alone: for an approach - that champions composing simple pieces, functional programming is full of complex - jargon. In this talk, we''ll cover these topics from a Ruby and Rails perspective, - composing small ideas in everyday language. Before we''re through, you''ll have - a rich new set of FP ideas to apply to your projects—and you''ll finally learn - what a monad is (hint: it''s not a burrito).' - speakers: - - Eric Weinstein - event_name: RailsConf 2022 - video_id: W2tmA4V0Bjk - thumbnail_sm: https://i.ytimg.com/vi/W2tmA4V0Bjk/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/W2tmA4V0Bjk/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/W2tmA4V0Bjk/sddefault.jpg -- title: The pitfalls of realtime-ification - raw_title: RailsConf 2022 - The pitfalls of realtime-ification by Vladimir Dementyev - description: |- - Building realtime applications with Rails has become a no-brainer since Action Cable came around. With Hotwire, we don't even need to leave the comfort zone of HTML and controllers to introduce live updates to a Rails app. Realtime-ification in every house! - - Switching to realtime hides many pitfalls you'd better learn beforehand. How to broadcast personalized data? How not to miss updates during connection losses? Who's online? Does it scale? - - Let me dig into these problems and demonstrate how to resolve them for Action Cable and Hotwire. - speakers: - - Vladimir Dementyev - event_name: RailsConf 2022 - video_id: TgpSs2ffJL0 - thumbnail_sm: https://i.ytimg.com/vi/TgpSs2ffJL0/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/TgpSs2ffJL0/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/TgpSs2ffJL0/sddefault.jpg -- title: Start Your Ruby Podcast Today! No Experience Required - raw_title: RailsConf 2022 - Start Your Ruby Podcast Today! No Experience Required - by Jason Charnes - description: "In 2018 a hot new Ruby meetup appeared online. \U0001F525 Three meetups - later, it was gone. \U0001F62D\n\nThis failed experiment paved the way for a new - Ruby podcast: Remote Ruby. 170 episodes later, we've learned a lot! We had no - previous experience podcasting before the first episode. Along the way we've learned - things like what kind of gear to use, how to perform interviews, and affirmed - just how lovely the Ruby community is.\n\nIt's your turn! Come to learn from our - mistakes, leave ready to start a podcast!" - speakers: - - Jason Charnes - event_name: RailsConf 2022 - video_id: Y6QVKq3iM5s - thumbnail_sm: https://i.ytimg.com/vi/Y6QVKq3iM5s/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/Y6QVKq3iM5s/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/Y6QVKq3iM5s/sddefault.jpg -- title: Behind the Lemurs - raw_title: RailsConf 2022 - Behind the Lemurs - Creating an Illustrated Talk by - Brandon Weaver - description: Perhaps you've heard of a magical band of cartoon lemurs with a love - for teaching Ruby, but what exactly goes into making one of these talks? We'll - look at my entire toolset and process for creating illustrated conference talks - including ideation, storyboarding, art, code tie-ins, and more. Perhaps you'll - even learn to make a few lemurs of your own! - speakers: - - Creating an Illustrated Talk - - Brandon Weaver - event_name: RailsConf 2022 - video_id: OBgE7qx--VA - thumbnail_sm: https://i.ytimg.com/vi/OBgE7qx--VA/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/OBgE7qx--VA/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/OBgE7qx--VA/sddefault.jpg -- title: 'Learn it, Do it, Teach it: How to Unstick Our Middle Devs' - raw_title: 'RailsConf 2022 - Learn it, Do it, Teach it: How to Unstick Our Middle - Devs by Chelsea Kaufman' - description: 'One definition of the middle: a difficult or unpleasant position. - Yuck! It certainly can feel that way for mid-level developers. Fortunately, we''ve - uncovered a model that will help managers create an environment where their devs - can thrive. Our Learn it Do it Teach it (LDT) model will foster more learning, - while keeping their hands on the code, and adding in the magic touch, teaching. - This talk will demonstrate how managers can implement a LDT model into a developer’s - day to day. Growth plans like this model will allow your team to move from mids - into seniors both faster and more confidently.' - speakers: - - Chelsea Kaufman - event_name: RailsConf 2022 - video_id: iWqt_G_4nw4 - thumbnail_sm: https://i.ytimg.com/vi/iWqt_G_4nw4/mqdefault.jpg - thumbnail_md: https://i.ytimg.com/vi/iWqt_G_4nw4/hqdefault.jpg - thumbnail_lg: https://i.ytimg.com/vi/iWqt_G_4nw4/sddefault.jpg diff --git a/lib/tasks/update_video_statistics.rake b/lib/tasks/update_video_statistics.rake new file mode 100644 index 00000000..79d09b31 --- /dev/null +++ b/lib/tasks/update_video_statistics.rake @@ -0,0 +1,22 @@ +# lib/tasks/update_video_statistics.rake + +namespace :update_video_statistics do + desc "Update view_count and like_count in Talk table" + task update: :environment do + client = Youtube::Video.new + + Talk.find_each do |talk| + stats = client.get_statistics(talk.video_id) + if stats + talk.update( + view_count: stats[:view_count], + like_count: stats[:like_count] + ) + else + puts "Skipping talk with ID: #{talk.id} due to missing stats" + end + end + + puts "Updated video statistics for all talks" + end +end diff --git a/load_test.yml b/load_testing/load_test.yml similarity index 62% rename from load_test.yml rename to load_testing/load_test.yml index 3ca49a06..5f47817b 100644 --- a/load_test.yml +++ b/load_testing/load_test.yml @@ -4,14 +4,17 @@ config: - duration: 30 arrivalRate: 5 name: Warm up - - duration: 300 + - duration: 120 arrivalRate: 5 - rampTo: 30 + rampTo: 45 name: Ramp up load payload: - path: search_payload.csv - fields: - - name + - path: search_payload.csv + fields: + - name + - path: talks_payload.csv + fields: + - talk_slug scenarios: - name: "visit home page" flow: @@ -19,8 +22,12 @@ scenarios: url: "/talks" - get: url: "/talks?q={{ name }}" + - get: + url: "/talk/{{ talk_slug }}" - get: url: "/talks?q={{ name }}" + - get: + url: "/talk/{{ talk_slug }}" - get: url: "/talks?q={{ name }}" - get: diff --git a/search_payload.csv b/load_testing/search_payload.csv similarity index 100% rename from search_payload.csv rename to load_testing/search_payload.csv diff --git a/load_testing/talks_payload.csv b/load_testing/talks_payload.csv new file mode 100644 index 00000000..2c54f191 --- /dev/null +++ b/load_testing/talks_payload.csv @@ -0,0 +1,396 @@ +rails-conf-2012-keynote-progress-by-david-heinemeier-hansson +zero-downtime-deploys-for-rails-apps +how-to-find-valuable-gems-by-nathan-bibler +lightning-talks-part-ii +rails-conf-2012-it-s-not-in-production-unless-it-s-monitored-by-joseph-ruscio-improved-audio +rails-conf-2012-extending-ruby-with-ruby-by-michael-fairley +minitest-refactoring-test-unit-and-rspec-back-to-version-0-0-1-by-jared-ning +code-spelunking-in-the-all-new-basecamp-by-nick-quaranto +redis-application-patterns-in-rails-by-obie-fernandez +what-a-long-strange-trip-it-has-been-by-ezra-zygmuntowicz +basic-rake-by-jim-weirich +building-asynchronous-communication-layer-w-xmpp-ruby-javascript-by-andrew-carter-and-steve-jang +preparing-for-rapid-growth-tips-for-enabling-your-app-and-team-to-grow-by-patrick-leonard +engine-yard-the-cloud-application-support-and-you-ask-me-anything +a-polygot-heroku-by-terrance-lee +how-rails-helps-make-cooking-more-fun-in-japan-by-masahiro-ihara +active-record-scopes-and-arel-by-jacob-swanner +activesupport-and-activemodel-by-bryan-liles +rvm-essential-rails-development-tools-by-olivier-lacan +rails-flavored-ruby-by-michael-hartl +rails-engines-patterns-by-andy-maleh +securing-your-site-by-thomas-pomfret +from-rails-rumble-to-50-000-000-results-by-mikel-lindsaar +realtime-web-applications-with-streaming-rest-by-brad-gessler +use-the-source-luke-high-fidelity-history-with-event-sourced-data-by-keith-gaddis +rororoomba-ruby-on-rails-on-roomba-by-charles-abbott +designing-hypermedia-apis-by-steve-klabnik +practical-machine-learning-and-rails-by-andrew-cantino-and-ryan-stout +using-rails-without-rails-by-piotr-sarnacki +railsconf-2012-evented-ruby-vs-node-js-by-jerry-cheung +schemaless-sql-the-best-of-both-worlds-by-will-leinweber +semi-automatic-code-review-by-richard-huang +presenters-and-decorators-a-code-tour-by-mike-moore +coffeescript-for-the-rubyist-by-mark-bates +using-backbone-js-with-rails-patterns-from-the-wild-by-sarah-mei +deconstructing-travis-by-josh-kalderimis +complex-made-simple-sleep-better-with-torquebox-by-lance-ball +chanko-how-cookpad-safely-releases-multiple-feature-prototypes-in-production-by-kenta-murata +rails-the-next-five-years-by-yehuda-katz +rails-conf-2012-stack-smashing-by-david-czarnecki +digging-deep-with-activesupport-notifications-by-matt-sanders +ten-things-you-didn-t-know-rails-could-do-by-james-edward-gray-ii +let-s-make-the-web-faster-tips-from-trenches-google-by-ilya-grigorick +taming-the-kraken-how-operations-enables-developer-productivity-by-nathen-harvey +the-future-of-sass-by-hampton-catlin +progressive-enhancement-on-the-mobile-web-by-john-bender +mobile-rage-what-causes-it-how-to-fix-it-by-lori-olson +rails-conf-2012-getting-down-to-earth-geospatial-analysis-with-rails-by-daniel-azuma +keynote-by-david-cohen-of-techstars +2012-ruby-hero-awards +keynote-i-ve-made-a-huge-mistake-by-aaron-patterson +rails-conf-2012-keynote-simplicity-matters-by-rich-hickey +railsconf-2012-ruby-rogues-live-podcast +rails-conf-2013-using-elasticsearch-with-rails-apps-by-brian-gugliemetti +rails-conf-2013-rails-insecure-defaults-by-bryan-helmkamp +rails-conf-2013-patterns-of-basecamp-s-application-architecture-by-david-heinemeier-hansson +rails-conf-2013-security-is-hard-but-we-can-t-go-shopping-by-andre-arko +rails-conf-2013-nobody-will-train-you-but-you-by-zach-briggs +rails-conf-2013-how-shopify-scales-rails-by-john-duff +rails-conf-2013-the-war-for-talent-how-to-succeed-as-an-employer-or-engineer-by-allan-grant +rails-conf-2013-monitoring-the-health-of-your-app-by-carl-lerche-and-yehuda-katz +railsconf-2013-real-time-rails-by-brian-cardarella +rails-conf-2013-ruby-libraries-important-for-rails-by-michael-hartl +rails-conf-2013-testing-complex-systems-creating-data-and-limiting-scope-by-noel-rappin +rails-conf-2013-postgres-the-best-tool-you-re-already-using-by-adam-sanderson +rails-conf-2013-split-testing-for-product-discovery-by-bryan-woods +rails-conf-2013-delicious-controversy-docs-tests-by-thomas-meeks +rails-conf-2013-what-ruby-developers-can-learn-from-go-by-lionel-barrow +rails-conf-2013-sleeping-with-the-enemy-by-george-brocklehurst +rails-conf-2013-cache-cash-by-stefan-wintermeyer +rails-conf-2013-of-buyers-and-renters-and-keeping-a-roof-over-our-heads-by-sebastian-delmont +rails-conf-2013-pry-the-good-parts-by-conrad-irwin +rails-conf-2013-an-intervention-for-activerecord-by-ernie-miller +rails-conf-2013-from-rails-to-the-web-server-to-the-browser-by-david-padilla +rails-conf-2013-the-magic-tricks-of-testing-by-sandi-metz +rails-conf-2013-rails-vs-the-client-side-by-noel-rappin +rails-conf-2013-rails-is-just-ruby-by-jesse-wolgamott +rails-conf-2013-building-extractable-libraries-in-rails-by-patrick-robertson +rails-conf-2013-natural-language-processing-with-ruby-by-brandon-black +rails-conf-2013-testing-http-apis-in-ruby-by-shai-rosenfeld +rails-conf-2013-maintainable-templates-by-brendan-loudermilk +rails-conf-2013-crafting-gems-by-pat-allen +rails-conf-2013-humanity-on-rails-by-daniel-azuma +rails-conf-2013-closing-keynote-by-aaron-patterson +rails-conf-2013-hacking-the-academic-experience-by-emily-stolfo +rails-conf-2013-datomic-from-ruby-from-rails-by-yoko-harada +rails-conf-2013-dissecting-ruby-with-ruby-by-richard-schneeman +rails-conf-2013-how-to-talk-to-developers-by-ben-orenstein +rails-conf-2013-keynote-by-james-duncan-davidson +rails-conf-2013-configuration-management-patterns-by-beau-harrington +rails-conf-2013-zero-downtime-payment-platforms-by-prem-sichanugrist-ryan-twomey +rails-conf-2013-services-and-rails-the-sh-t-they-don-t-tell-you-by-brian-morton +rails-conf-2013-describing-your-world-with-seahorse-by-trevor-rowe +rails-conf-2013-your-first-rails-pull-request-by-mark-mcspadden +rails-conf-2013-firefighting-on-rails-by-ethan-vizitei +rails-conf-2013-flattening-the-cloud-learning-curve-using-rails-by-michael-murphy +rails-conf-2013-forget-scaling-focus-on-performance-by-terence-lee +rails-conf-2013-engine-yard-cloud-by-edward-chiu-pj-hagerty +rails-conf-2013-devops-for-the-rubyist-soul-by-john-downey +rails-conf-2013-creating-mountable-engines-by-patrick-peak +rails-conf-2013-you-ve-got-a-sinatra-on-your-rails-by-jose-valim +railsconf-2014-keynote-writing-software-by-david-heinemeier-hansson +railsconf-2014-concerns-decorators-presenters-service-objects-helpers-help-me-decide +railsconf-2014-demystifying-data-science-a-live-tutorial-by-todd-schneider +railsconf-2014-empowering-rich-internet-applications-rias-with-accessibility +railsconf-2014-mutation-testing-with-mutant-by-erik-michaels-ober +railsconf-2014-rack-amqp-ditch-http-inside-soa-by-josh-szmajda +railsconf-2014-keith-and-mario-s-guide-to-continuous-deployment-with-rails +railsconf-2014-where-did-the-oo-go-views-should-be-objects-too +railsconf-2014-supercharge-your-workers-with-storm-by-carl-lerche +railsconf-2014-modeling-on-the-right-side-of-the-brain-by-nicholas-henry +railsconf-2014-let-me-code-by-liana-leahy +railsconf-2014-domain-driven-design-and-hexagonal-architecture-with-rails +railsconf-2014-lightning-fast-deployment-of-your-rails-backed-javascript-app +railsconf-2014-advanced-arel-when-activerecord-just-isn-t-enough +railsconf-2014-what-is-rest-why-is-it-part-of-the-rails-way +railsconf-2014-too-big-to-fail-by-chris-maddox +railsconf-2014-deploying-rails-is-easier-than-it-looks-by-ben-dixon +railsconf-2014-keynote-10-years-by-yehuda-katz +railsconf-2014-reading-code-good-by-saron-yitbarek +railsconf-2014-ruby-on-rails-hacking-guide-by-akira-matsuda +railsconf-2014-web-applications-with-ruby-not-rails-by-david-padilla +railsconf-2014-technical-onboarding-training-and-mentoring-by-kate-heddleston +railsconf-2014-surviving-the-big-rewrite-by-bradly-feeley +railsconf-2014-artisans-and-apprentices-by-coraline-ada-ehmke +railsconf-2014-building-kick-ass-internal-education-programs-for-large-and-small-budgets +railsconf-2014-middleman-the-missing-view-in-the-rails-api-stack +railsconf-2014-tricks-that-rails-didn-t-tell-you-about-by-carlos-antionio-da-silva +railsconf-2014-panel-teaching-the-next-great-developers-by-noel-rappin +railsconf-2014-biggish-data-with-rails-and-postgresql-by-starr-horne +railsconf-2014-what-the-cache-by-simon-kroger +railsconf-2014-refactoring-towards-component-based-rails-architectures +railsconf-2014-rails-as-an-soa-client-by-pete-hodgson +railsconf-2014-service-oriented-authenication-by-jeremy-green +railsconf-2014-authorization-in-a-service-oriented-environment-by-alan-cohen +railsconf-2014-ruby-heros +railsconf-2014-designing-the-apis-for-an-internal-set-of-services-by-alberto-leal +railsconf-2014-humor-in-the-code-by-baratunde-thurston +railsconf-2014-build-the-api-first-by-rosie-hoyem-and-sonja-hall +railsconf-2014-debugger-driven-developement-with-pry-by-joel-turnbull +railsconf-2014-eliminating-inconsistent-test-failures-by-austin-putman +railsconf-2014-effectively-testing-services-by-neal-kemp +railsconf-2014-front-end-fun-not-frustration-by-roy-tomeij +railsconf-2014-elements-of-design-a-developer-s-primer-by-jenn-scheer +railsconf-2014-sketchnothing-creative-notes-for-technical-content-by-jessica-eldredge +railsconf-2014-how-they-work-better-together-lean-ux-agile-development-and-user-centered-design +railsconf-2014-discovering-user-interactions-by-cameron-daigle +railsconf-2014-the-power-of-m-by-charles-lowell +railsconf-2014-i-ve-pair-programmed-for-27-000-hours-ask-me-anythings-by-joe-moore +railsconf-2014-bring-fun-back-to-js-step-by-step-refactoring-toward-ember-by-brandon-hays +railsconf-2014-the-rails-of-javascript-won-t-be-a-framework-by-justin-searls +railsconf-2014-an-iterative-approach-to-service-oriented-architecture-by-eric-saxby +railsconf-2014-improve-performance-quick-and-cheap-optimize-memory-and-upgrade-to-ruby-2-1 +railsconf-2014-cognitive-shortcuts-models-visualizations-metaphors-and-other-lies +railsconf-2014-how-to-be-a-boss-without-the-b-s-by-jessie-link +railsconf-2014-closing-keynote-by-aaron-patterson +railsconf-2014-distributed-request-tracing-by-kenny-hoxworth +railsconf-2014-how-to-be-a-better-junior-developer-by-katherine-wu +railsconf-2014-building-an-oss-centric-company-and-why-you-want-to-by-leah-silber +railsconf-2014-saving-the-world-literally-with-ruby-on-rails-by-sean-marcia +railsconf-2014-you-are-not-an-impostor-by-nickolas-means +railsconf-2014-make-an-event-of-it-by-jason-clark +railsconf-2014-real-time-rails-with-sync-by-mike-moore +railsconf-2014-looking-backward-ten-years-on-rails-by-luke-francl +railsconf-2014-workshop-simplifying-code-monster-to-elegant-in-less-than-5-steps-by-tute-costa +railsconf-2014-workshop-ruby-coding-dojo-by-carlos-souza-and-david-rogers +railsconf-2014-how-to-build-a-smart-profiler-for-rails-by-tom-dale-and-yehuda-katz +railsconf-2014-culture-of-continue-delivery-by-leena-s-n-and-vaidy-bala +railsconf-2014-writing-small-code-by-mark-menard +railsconf-2014-all-the-little-things-by-sandi-metz +railsconf-2014-ultra-light-and-maintainable-rails-wizards-by-andy-maleh +railsconf-2014-rack-attack-protect-your-app-with-this-one-weird-gem-by-aaron-suggs +railsconf-2014-heroku-2014-a-year-in-review-by-terence-lee-richard-schneeman +railsconf-2014-software-development-lessons-from-the-apollo-program-by-julian-simioni +railsconf-2014-engine-yard-s-new-and-improved-cloud-platform-by-edward-chiu-will-luongo +railsconf-2014-an-ode-to-17-databases-in-33-minutes-by-toby-hede +railsconf-2014-secrets-of-a-world-memory-champion-by-chris-hunt +railsconf-2014-panel-discussion-the-future-of-rails-jobs +railsconf-2014-webrtc-change-communcations-forever-by-greg-baugues +railsconf-2014-workshop-teamwork-ain-t-always-easy-by-michael-norton +railsconf-2014-class-reloading-in-ruby-on-rails-the-whole-story-by-xavier-noria +railsconf-2014-tales-from-the-crypt-by-aaron-bedra-justin-collins-and-matt-konda +railsconf-2014-lightning-talks-by-many-people +railsconf-2014-curmudgeon-an-opinionated-framework-by-ernie-miller +railsconf-2014-you-ll-never-believe-which-web-framework-powers-upworthy +railsconf-2014-living-social-lightning-talks +railsconf-2014-get-more-hands-on-your-keyboard-by-manik-juneja +railsconf-2014-webrtc-change-communications-forever-by-greg-baugues +railsconf-2014-workshop-applications-first-frameworks-second-better-systems-through-design +railsconf-2014-service-extraction-at-groupon-scale-by-jason-sisk-abhishek-pillai +railsconf-2014-using-software-analytics-to-help-make-better-business-decisions +railsconf-2014-workshop-machine-learning-for-fun-and-profit-by-john-paul-ahenfelter +railsconf-2014-workshop-all-aboard-the-elixir-express-by-chris-mccord +railsconf-2014-workshop-test-drive-a-browser-game-with-javascript +railsconf-2014-workshop-taming-chaotic-specs-rspec-design-patterns-by-adam-cuppy +railsconf-2014-unreasonable-estimates-and-improbable-goals-by-adam-sanderson +railsconf-2014-branding-for-open-source-success-by-bree-thomas +rails-conf-2014-keynote-what-happens-to-everyone-when-everyone-learns-to-code +rails-pacific-2014-better-rails-by-knowing-better-database-by-ding-ding-ye +rails-pacific-2014-zero-downtime-payment-platforms-by-prem-sichanugrist +rails-pacific-2014-trailblazer-a-new-architecture-for-rails-by-nick-sutterer +rails-pacific-2014-ten-years-of-rails-deployment-by-christopher-rigor +rails-pacific-2014-render-it-a-deep-dive-into-actionview-and-template-engines-by-akira-matsuda +rails-pacific-2014-multitenancy-with-rails-by-ryan-bigg +rails-pacific-2014-going-the-distance-by-richard-schneeman +rails-pacific-2014-exception-handling-designing-robust-software-by-wen-tien-chang +rails-pacific-2014-crafting-rails-culture-by-shibata-hiroshi +rails-pacific-2016-when-making-money-becomes-a-headache-by-sebastian-sogamoso +rails-pacific-2016-workshop-taming-chaotic-specs-rspec-design-patterns-by-adam-cuppy +rails-pacific-2016-server-infrastructure-for-rails-in-2016-by-richard-lee +rails-pacific-2016-continuous-learning-teaching-and-by-luis-ferreira +rails-pacific-2016-what-if-shakespeare-wrote-ruby-by-adam-cuppy +rails-pacific-2016-robot-on-rails-by-max-hawkins +rails-pacific-2016-successful-speedy-mvp-website-development-by-xdite +rails-pacific-2016-actioncable-rails-api-and-react-modern-single-page-apps-by-vipul-a-m +rails-pacific-2016-large-scaled-deploy-over-100-servers-in-3-minutes-by-hiroshi-shibata +rails-pacific-2016-make-money-and-enjoy-freedom-creating-a-software-business-by-ryan-macinnes +rails-pacific-2016-going-global-on-rails-lessons-learned-by-miles-woodroffe +rails-pacific-2016-secrets-of-testing-rails-5-apps-by-prathamesh-sonpatki +rails-pacific-2016-keynote-computer-science-education-for-the-next-generation-by-godfrey-chan +railsconf-2017-the-art-craft-of-secrets-using-the-cryptographic-toolbox-by-michael-swieton +railsconf-2017-why-software-engineers-disagree-about-everything-by-haseeb-qureshi +railsconf-2017-opening-keynote-by-david-heinemeier-hansson +railsconf-2017-building-rails-actiondispatch-systemtestcase-framework-by-eileen-uchitelle +railsconf-2017-perusing-the-rails-source-code-a-beginners-guide-by-alex-kitchens +railsconf-2017-teaching-rspec-to-play-nice-with-rails-by-sam-phippen +railsconf-2017-uncertain-times-securing-rails-apps-and-user-data-by-krista-nelson +railsconf-2017-warning-may-be-habit-forming-by-nickolas-means +railsconf-2017-keynote-by-justin-searls +railsconf-2017-rough-to-fine-programming-lessons-from-woodworking-by-mark-simoneau +railsconf-2017-upgrading-a-big-application-to-rails-5-by-rafael-franca +railsconf-2017-the-arcane-art-of-error-handling-by-brad-urani +railsconf-2017-lightning-talks-by-various-speakers +railsconf-2017-an-optimistic-proposal-for-making-horrible-code-bearable-by-joe-mastey +railsconf-2017-built-to-last-a-domain-driven-approach-to-beautiful-systems-by-andrew-hao +railsconf-2017-architecture-the-next-generation-by-taylor-jones +railsconf-2017-breaking-bad-what-happens-when-you-defy-conventions-by-christoph-gockel +railsconf-2017-managing-unmanageable-complexity-by-patrick-joyce +railsconf-2017-keynote-by-aaron-patterson +railsconf-2017-bebop-to-the-top-the-jazz-band-as-a-guide-to-leadership-by-michael-cain +railsconf-2017-the-good-bad-bug-learning-to-embrace-mistakes-by-jess-rudder +railsconf-2017-understanding-spoon-theory-and-preventing-burnout-by-jameson-hampton +railsconf-2017-to-code-is-human-by-don-werve +railsconf-2017-we-ve-always-been-here-women-changemakers-in-tech-by-hilary-stohs-krause +railsconf-2017-leading-when-you-re-not-in-charge-by-scott-lesser +railsconf-2017-processing-streaming-data-at-a-large-scale-with-kafka-by-thijs-cadier +railsconf-2017-high-performance-political-revolutions-by-braulio-carreno +railsconf-2017-it-s-dangerous-to-go-alone-building-teams-like-an-organizer-by-colin-fleming +railsconf-2017-supporting-mental-health-as-an-effective-leader-by-jesse-james +railsconf-2017-inventing-friends-actioncable-avs-3-by-jonan-scheffler-julian-cheal +railsconf-2017-keynote-by-marco-rogers +railsconf-2017-bayes-is-bae-by-richard-schneeman +railsconf-2017-is-it-food-an-introduction-to-machine-learning-by-matthew-mongeau +railsconf-2017-accessibility-when-you-don-t-have-time-to-read-the-manual-by-katie-walsh +railsconf-2017-goldilocks-and-the-three-code-reviews-by-vaidehi-joshi +railsconf-2017-predicting-titanic-survivors-with-machine-learning-by-ju-liu +railsconf-2017-whose-turn-is-it-anyway-augmented-reality-board-games-by-dave-tapley +railsconf-2017-5-years-of-rails-scaling-to-80k-rps-by-simon-eskildsen +railsconf-2017-keynote-gen-z-and-the-future-of-technology-by-pamela-pavliscak +railsconf-2017-syntax-isn-t-everything-nlp-for-rubyists-by-aja-hammerly +railsconf-2017-how-to-write-better-code-using-mutation-testing-by-john-backus +railsconf-2017-a-clear-eyed-look-at-distributed-teams-by-glenn-vanderburg-maria-gutierrez +railsconf-2017-distributed-local-getting-the-best-of-both-worlds-by-ben-klang +railsconf-2017-the-effective-remote-developer-by-david-copeland +railsconf-2017-distributed-tracing-from-theory-to-practice-by-stella-cotton +railsconf-2017-sorting-rubyists-by-caleb-thompson +railsconf-2017-tricks-and-treats-for-new-developers-by-david-padilla +railsconf-2017-rack-em-stack-em-web-apps-by-jason-clark +railsconf-2017-practical-debugging-by-kevin-deisz +railsconf-2017-in-relentless-pursuit-of-rest-by-derek-prior +railsconf-2017-what-s-my-app-really-doing-in-production-by-daniel-azuma +railsconf-2017-beyond-validates_presence_of-ensuring-eventual-consistency-by-amy-unger +railsconf-2017-the-secret-life-of-sql-how-to-optimize-database-performance-by-bryana-knight +railsconf-2017-reporting-on-rails-activerecord-and-rolap-working-together-by-tony-drake +railsconf-2017-do-your-views-know-too-much-by-jason-charnes +railsconf-2017-portable-sessions-with-json-web-tokens-by-lance-ivy +railsconf-2017-observing-chance-a-gold-master-test-in-practice-by-jake-worth +railsconf-2017-what-comes-after-solid-seeking-holistic-software-quality-by-ariel-caplan +railsconf-2017-developer-happiness-on-the-front-end-with-elm-by-kevin-yank +railsconf-2017-rails-to-phoenix-how-elixir-can-level-you-up-in-rails-by-christian-koch +railsconf-2017-react-on-rails-by-jo-cranford +railsconf-2017-react-native-rails-a-single-codebase-for-web-mobile-by-ben-dixon +railsconf-2017-a-survey-of-surprisingly-difficult-things-by-alex-boster +railsconf-2017-implementing-the-web-speech-api-for-voice-data-entry-by-cameron-jacoby +railsconf-2017-exploring-the-history-of-a-12-year-old-rails-application-by-nathan-walls +railsconf-2017-decouple-your-models-with-form-objects-by-andrew-markle +railsconf-2017-rails-5-1-awesome-features-and-breaking-changes-by-claudio-b +railsconf-2017-tailoring-mentorship-achieving-the-best-fit-by-jonathan-wallace +railsconf-2017-your-app-server-config-is-wrong-by-nate-berkopec +railsconf-2017-recurring-background-jobs-with-sidekiq-scheduler-by-andreas-fast-gianfranco-zas +railsconf-2017-outside-the-web-box-using-ruby-for-other-protocols-by-danielle-adams +railsconf-2017-a-deep-dive-into-sessions-by-justin-weiss +railsconf-2017-data-corruption-stop-the-evil-tribbles-by-betsy-haibel +railsconf-2017-rails-apis-the-next-generation-by-derek-carter +railsconf-2017-deep-dive-into-docker-containers-for-rails-developers-by-christopher-rigor +railsconf-2017-introducing-helix-high-performance-ruby-made-easy-by-godfrey-chan-and-yehuda-katz +railsconf-2017-open-sourcing-real-talk-by-andrew-evans +railsconf-2017-google-cloud-love-ruby-by-remi-taylor +railsconf-2017-postgres-at-any-scale-by-will-leinweber +railsconf-2017-cultivating-a-culture-of-continuous-learning-by-dave-ott-and-dennis-eusebio +railsconf-2017-keeping-code-style-sanity-in-a-10-year-old-codebase-by-gabi-stefanini +railsconf-2018-the-graphql-way-a-new-path-for-json-apis-by-nick-quaranto +railsconf-2018-candy-on-rails-polymorphism-rails-5-by-michael-cain +railsconf-2018-why-we-never-get-to-web-accessibility-102-by-liz-certa +railsconf-2018-dropping-into-b-trees-by-david-mcdonald +railsconf-2018-continuous-deployments-and-data-sovereignty-a-case-study-by-mike-calhoun +railsconf-2018-the-doctor-is-in-using-checkups-to-find-bugs-in-production-by-ryan-laughlin +railsconf-2018-opening-keynote-fixme-by-david-heinemeier-hansson +railsconf-2018-devly-a-multi-service-development-environment-by-eric-hodel-ezekiel-templin +railsconf-2018-operating-rails-in-kubernetes-by-kir-shatrov +railsconf-2018-turbo-boosting-real-world-applications-by-akira-matsuda +railsconf-2018-access-denied-the-missing-guide-to-authorization-in-rails-by-vladimir-dementyev +railsconf-2018-booleans-are-easy-true-or-false-by-craig-buchek +railsconf-2018-automating-empathy-test-your-docs-with-swagger-and-apivore-by-ariel-caplan +railsconf-2018-testing-in-production-by-aja-hammerly +railsconf-2018-who-destroyed-three-mile-island-by-nickolas-means +railsconf-2018-debugging-rails-itself-by-sean-griffin +railsconf-2018-down-the-rabbit-hole-an-adventure-in-legacy-code-by-loren-crawford +railsconf-2018-the-life-and-death-of-a-rails-app-by-olivier-lacan +railsconf-2018-webpacking-for-the-journey-ahead-by-taylor-jones +railsconf-2018-stating-the-obvious-by-ernie-miller +railsconf-2018-keynote-rails-doesn-t-scale-by-mark-imbriaco +railsconf-2018-using-databases-to-pull-your-applications-weight-by-harisankar-p-s +railsconf-2018-the-intelligence-of-instinct-by-emily-freeman +railsconf-2018-don-t-settle-for-poor-names-or-for-poor-design-by-alistair-mckinnell +railsconf-2018-how-we-made-our-app-so-fast-it-went-viral-in-japan-by-ben-halpern +railsconf-2018-keeping-moms-around-for-the-long-term-by-tess-griffin +railsconf-2018-empathy-through-acting-by-roy-tomeij +railsconf-2018-lessons-in-ethical-development-i-learned-from-star-wars-by-jameson-hampton +railsconf-2018-blitzbuilding-product-with-rails-a-crypto-journey-by-yiting-xdite-cheng +railsconf-2018-encrypted-credentials-on-rails-5-2-secrets-to-success-by-christopher-rigor +railsconf-2018-scaling-the-software-artisan-by-coraline-ada-ehmke +railsconf-2018-all-onboard-cruising-on-the-mentorship-by-gretchen-ziegler +railsconf-2018-pairing-a-guide-to-fruitful-collaboration-by-andre-arko +railsconf-2018-mechanically-confident-by-adam-cuppy +railsconf-2018-the-practical-guide-to-building-an-apprenticeship-by-max-tiu +railsconf-2018-so-you-ve-got-yourself-a-kafka-event-powered-rails-services-by-stella-cotton +railsconf-2018-some-funny-things-happened-on-the-way-to-a-service-ecosystem-by-chris-hoffman +railsconf-2018-broken-apis-break-trust-tips-for-creating-and-updating-apis-by-alex-wood +railsconf-2018-warden-the-building-block-behind-devise-by-leonardo-tegon +railsconf-2018-building-a-collaborative-text-editor-by-justin-weiss +railsconf-2018-ten-years-of-rails-tutorials-by-michael-hartl +railsconf-2018-the-evolution-of-rails-security-by-justin-collins +railsconf-2018-the-code-free-developer-interview-by-pete-holiday +railsconf-2018-harry-the-hedgehog-learns-you-a-communication-by-laura-mosher +railsconf-2018-draw-a-crowd-by-brittany-martin +railsconf-2018-ales-on-rails-making-a-smarter-brewery-with-ruby-by-ben-shippee +railsconf-2018-human-powered-rails-automated-crowdsourcing-in-your-ror-app-by-andy-glass +railsconf-2018-keynote-the-future-of-rails-6-scalable-by-default-by-eileen-uchitelle +railsconf-2018-running-a-business-demystified-by-todd-kaufman-justin-searls +railsconf-2018-what-s-in-a-price-how-to-price-your-products-and-services-by-michael-herold +railsconf-2018-reporting-live-from-the-ramp-of-death-by-thijs-cadier +railsconf-2018-taking-the-pain-out-of-support-engineering-by-cecy-correa +railsconf-2018-leveling-up-a-heroic-team-by-aly-fulton +railsconf-2018-old-school-javascript-in-rails-by-graham-conzett +railsconf-2018-keynote-livable-code-by-sarah-mei +railsconf-2018-quick-and-easy-browser-testing-using-rspec-and-rails-5-1-by-sam-phippen +railsconf-2018-build-a-blog-in-15-more-like-30-minutes-webpacker-edition-by-sasha-grodzins +railsconf-2018-6-degrees-of-javascript-on-rails-by-michael-crismali +railsconf-2018-look-before-you-import-a-webpack-survival-guide-by-ross-kaffenberger +railsconf-2018-closing-keynote-by-aaron-patterson +railsconf-2018-putting-rails-in-a-corner-understanding-database-isolation-by-emil-ong +railsconf-2018-ten-years-of-rails-upgrades-by-jordan-raine +railsconf-2018-stop-testing-start-storytelling-by-mike-schutte +railsconf-2018-deploying-any-rails-application-to-any-cloud-in-minutes-by-khash-sajadi +railsconf-2018-engineering-engineering-more-than-the-sum-of-our-parts-by-vietor-davis +railsconf-2018-minitest-6-test-feistier-by-ryan-davis +railsconf-2018-an-atypical-performance-talk-by-chris-arcand +railsconf-2018-giving-your-heroku-app-highly-available-postgresql-by-jake-varghese +railsconf-2018-api-how-lendinghome-approaches-legacy-technologies-by-sam-aarons +railsconf-2018-re-graphing-the-mental-model-of-the-rails-router-by-vaidehi-joshi +railsconf-2018-inside-active-storage-a-code-review-of-rails-new-framework-by-claudio-baccigalupo +railsconf-2018-up-and-down-again-a-migration-s-tale-by-derek-prior +railsconf-2018-upgrading-rails-at-scale-by-edouard-chin +railsconf-2018-postgres-10-performance-and-you-by-gabe-enslein +railsconf-2018-hot-swapping-our-rails-front-end-in-secret-a-rebrand-story-by-chris-lopresto +railsconf-2018-actionable-tactics-for-leveling-up-junior-devs-by-sumeet-jain +railsconf-2018-your-first-contribution-and-beyond-by-dinah-shi +railsconf-2018-ruby-a-family-history-by-geoffrey-litt +railsconf-2018-five-sharding-data-models-and-which-is-right-by-craig-kerstiens +railsconf-2018-using-skylight-to-solve-real-world-performance-problems-by-yehuda-godfrey-krystan +railsconf-2018-containerizing-rails-techniques-pitfalls-best-practices-by-daniel-azuma +railsconf-2018-here-s-to-history-programming-through-archaeology-by-eleanor-kiefel-haggerty +railsconf-2018-knobs-buttons-switches-operating-your-application-at-scale-by-amy-unger +railsconf-2018-here-s-to-the-crazy-ones-by-james-adam +railsconf-2019-walking-a-mile-in-your-users-shoes-by-jameson-hampton +railsconf-2019-rethinking-the-view-layer-with-components-by-joel-hawksley +railsconf-2019-the-selfish-programmer-by-justin-searls +railsconf-2019-refactoring-live-primitive-obsession-by-james-dabbs +railsconf-2019-webpacker-vs-asset-pipeline-by-danielle-gordon +railsconf-2019-opening-keynote-by-david-heinemeier-hansson +railsconf-2019-keynote-the-stories-we-tell-our-children-by-ariel-caplan +railsconf-2019-cache-is-king-by-molly-struve +railsconf-2019-performance-improvement-of-ruby-2-7-jit-in-real-world-by-takashi-kokubun +railsconf-2019-building-for-gracious-failure-by-james-thompson +railsconf-2019-applying-omotenashi-japanese-customer-service-to-your-work-by-michael-toppa diff --git a/package.json b/package.json index 6b546bbe..2a636bb5 100644 --- a/package.json +++ b/package.json @@ -2,11 +2,13 @@ "name": "app", "private": "true", "dependencies": { + "@domchristie/turn": "^3.0.0", "@hotwired/stimulus": "^3.2.1", "@hotwired/turbo-rails": "^7.3.0", "@tailwindcss/forms": "^0.5.3", - "@tailwindcss/line-clamp": "^0.4.4", "autoprefixer": "^10.4.14", + "chart.js": "^4.3.0", + "chartkick": "^5.0.1", "esbuild": "^0.17.18", "morphdom": "^2.7.0", "postcss": "^8.4.23", @@ -16,16 +18,25 @@ }, "scripts": { "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --public-path=assets", - "build:css": "tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css --minify" + "build:css": "tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css --minify", + "lint": "standard --fix" }, "packageManager": "yarn@1.22.19", "devDependencies": { "postcss-import": "^15.1.0", "postcss-nested": "^6.0.1", + "prettier": "^2.8.8", + "prettier-plugin-tailwindcss": "^0.3.0", + "standard": "^17.1.0", "stimulus-vite-helpers": "^3.0.1", "vite": "^4.3.0", "vite-plugin-full-reload": "^1.0.5", "vite-plugin-ruby": "^3.2.0", "vite-plugin-stimulus-hmr": "^3.0.0" + }, + "standard": { + "globals": [ + "requestAnimationFrame" + ] } } diff --git a/postcss.config.js b/postcss.config.js index 618f1c91..311ffbe5 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,8 +1,8 @@ module.exports = { plugins: { - "postcss-nested": {}, - "postcss-import": {}, + 'postcss-import': {}, + 'tailwindcss/nesting': {}, tailwindcss: {}, - // autoprefixer: {}, - }, -}; + autoprefixer: {} + } +} diff --git a/tailwind.config.js b/tailwind.config.js index 9bac2a46..3d893492 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,50 +1,52 @@ -const colors = require("tailwindcss/colors"); +const colors = require('tailwindcss/colors') module.exports = { content: [ - "./app/views/**/*.html.erb", - "./app/helpers/**/*.rb", - "./app/assets/stylesheets/**/*.css", - "./app/javascript/**/*.js", - "./config/initializers/heroicon.rb", + './app/views/**/*.html.erb', + './app/helpers/**/*.rb', + './app/assets/stylesheets/**/*.css', + './app/javascript/**/*.js', + './config/initializers/heroicon.rb' ], theme: { container: { center: true, padding: { - DEFAULT: "1rem", - sm: "1rem", + DEFAULT: '1rem', + sm: '1rem' // lg: "4rem", // xl: "5rem", // "2xl": "6rem", - }, + } }, extend: { colors: { - transparent: "transparent", - current: "currentColor", - gray: "#7b6f72", - "gray-light": "#A39E9E", - "gray-lightest": "#f9fafb", - green: "#F0E7E9", + transparent: 'transparent', + current: 'currentColor', + gray: '#7b6f72', + 'gray-light': '#A39E9E', + 'gray-lightest': '#f9fafb', + green: '#F0E7E9', white: colors.white, - dark: "#261B23", + dark: '#261B23', brand: { - DEFAULT: "#D74C47", - lighter: "#FBEEEE", - }, + DEFAULT: '#D74C47', + lighter: '#FBEEEE' + } }, keyframes: { - "fade-in": { - "0%": { opacity: "0" }, - "100%": { opacity: "1" }, - }, - "fade-out": { - "0%": { opacity: "1" }, - "100%": { opacity: "0" }, + 'fade-in': { + '0%': { opacity: '0' }, + '100%': { opacity: '1' } }, - }, - }, + 'fade-out': { + '0%': { opacity: '1' }, + '100%': { opacity: '0' } + } + } + } }, - plugins: [require("@tailwindcss/line-clamp"), require("@tailwindcss/forms")], -}; + plugins: [ + require('@tailwindcss/forms') + ] +} diff --git a/test-run-report.json b/test-run-report.json index 6ce8c0db..25b5275d 100644 --- a/test-run-report.json +++ b/test-run-report.json @@ -1,149 +1,277 @@ { "aggregate": { "counters": { - "vusers.created_by_name.visit home page": 675, - "vusers.created": 675, - "http.requests": 3375, - "http.codes.200": 3375, - "http.responses": 3375, - "vusers.failed": 0, - "vusers.completed": 675 + "vusers.created_by_name.visit home page": 4050, + "vusers.created": 4050, + "http.requests": 18754, + "http.codes.200": 11877, + "http.responses": 16456, + "http.codes.404": 4579, + "vusers.failed": 2384, + "vusers.completed": 1666, + "errors.ETIMEDOUT": 2383, + "errors.EPROTO": 1 }, "rates": { - "http.request_rate": 77 + "http.request_rate": 128 }, - "firstCounterAt": 1686934224523, - "firstHistogramAt": 1686934224667, - "lastCounterAt": 1686934285636, - "lastHistogramAt": 1686934285636, - "firstMetricAt": 1686934224523, - "lastMetricAt": 1686934285636, - "period": 1686934280000, + "firstCounterAt": 1687326599350, + "firstHistogramAt": 1687326599611, + "lastCounterAt": 1687326759103, + "lastHistogramAt": 1687326759103, + "firstMetricAt": 1687326599350, + "lastMetricAt": 1687326759103, + "period": 1687326750000, "summaries": { "http.response_time": { - "min": 44, - "max": 1912, - "count": 3375, - "p50": 76, - "median": 76, - "p75": 94.6, - "p90": 115.6, - "p95": 130.3, - "p99": 1436.8, - "p999": 1826.6 + "min": 36, + "max": 10001, + "count": 16456, + "p50": 87.4, + "median": 87.4, + "p75": 113.3, + "p90": 138.4, + "p95": 4231.1, + "p99": 9999.2, + "p999": 9999.2 }, "vusers.session_length": { - "min": 354, - "max": 3613.7, - "count": 675, - "p50": 497.8, - "median": 497.8, - "p75": 572.6, - "p90": 1107.9, - "p95": 1901.1, - "p99": 3011.6, - "p999": 3464.1 + "min": 436.3, + "max": 30406.9, + "count": 1666, + "p50": 727.9, + "median": 727.9, + "p75": 5711.5, + "p90": 10617.5, + "p95": 10832, + "p99": 20543.1, + "p999": 25091.6 } }, "histograms": { "http.response_time": { - "min": 44, - "max": 1912, - "count": 3375, - "p50": 76, - "median": 76, - "p75": 94.6, - "p90": 115.6, - "p95": 130.3, - "p99": 1436.8, - "p999": 1826.6 + "min": 36, + "max": 10001, + "count": 16456, + "p50": 87.4, + "median": 87.4, + "p75": 113.3, + "p90": 138.4, + "p95": 4231.1, + "p99": 9999.2, + "p999": 9999.2 }, "vusers.session_length": { - "min": 354, - "max": 3613.7, - "count": 675, - "p50": 497.8, - "median": 497.8, - "p75": 572.6, - "p90": 1107.9, - "p95": 1901.1, - "p99": 3011.6, - "p999": 3464.1 + "min": 436.3, + "max": 30406.9, + "count": 1666, + "p50": 727.9, + "median": 727.9, + "p75": 5711.5, + "p90": 10617.5, + "p95": 10832, + "p99": 20543.1, + "p999": 25091.6 } } }, "intermediate": [ { "counters": { - "vusers.created_by_name.visit home page": 30, - "vusers.created": 30, - "http.requests": 149, - "http.codes.200": 146, - "http.responses": 146, + "vusers.created_by_name.visit home page": 5, + "vusers.created": 5, + "http.requests": 34, + "http.codes.200": 20, + "http.responses": 30, + "http.codes.404": 10 + }, + "rates": { + "http.request_rate": 34 + }, + "firstCounterAt": 1687326599350, + "firstHistogramAt": 1687326599611, + "lastCounterAt": 1687326599991, + "lastHistogramAt": 1687326599991, + "firstMetricAt": 1687326599350, + "lastMetricAt": 1687326599991, + "period": "1687326590000", + "http.request_rate": null, + "summaries": { + "http.response_time": { + "min": 40, + "max": 90, + "count": 30, + "p50": 62.2, + "median": 62.2, + "p75": 71.5, + "p90": 83.9, + "p95": 85.6, + "p99": 87.4, + "p999": 87.4 + } + }, + "histograms": { + "http.response_time": { + "min": 40, + "max": 90, + "count": 30, + "p50": 62.2, + "median": 62.2, + "p75": 71.5, + "p90": 83.9, + "p95": 85.6, + "p99": 87.4, + "p999": 87.4 + } + } + }, + { + "counters": { + "http.codes.200": 252, + "http.responses": 352, "vusers.failed": 0, - "vusers.completed": 27 + "vusers.completed": 52, + "vusers.created_by_name.visit home page": 50, + "vusers.created": 50, + "http.requests": 350, + "http.codes.404": 100 }, "rates": { - "http.request_rate": 30 - }, - "firstCounterAt": 1686934224523, - "firstHistogramAt": 1686934224667, - "lastCounterAt": 1686934229993, - "lastHistogramAt": 1686934229993, - "firstMetricAt": 1686934224523, - "lastMetricAt": 1686934229993, - "period": "1686934220000", + "http.request_rate": 35 + }, "http.request_rate": null, + "firstCounterAt": 1687326600026, + "firstHistogramAt": 1687326600026, + "lastCounterAt": 1687326609981, + "lastHistogramAt": 1687326609981, + "firstMetricAt": 1687326600026, + "lastMetricAt": 1687326609981, + "period": "1687326600000", "summaries": { "http.response_time": { - "min": 47, - "max": 171, - "count": 146, - "p50": 70.1, - "median": 70.1, - "p75": 80.6, - "p90": 100.5, - "p95": 113.3, - "p99": 135.7, - "p999": 141.2 + "min": 39, + "max": 134, + "count": 352, + "p50": 59.7, + "median": 59.7, + "p75": 74.4, + "p90": 85.6, + "p95": 94.6, + "p99": 102.5, + "p999": 111.1 }, "vusers.session_length": { - "min": 370, - "max": 546.9, - "count": 27, - "p50": 497.8, - "median": 497.8, - "p75": 518.1, - "p90": 528.6, - "p95": 539.2, - "p99": 539.2, - "p999": 539.2 + "min": 486.8, + "max": 727.2, + "count": 52, + "p50": 539.2, + "median": 539.2, + "p75": 572.6, + "p90": 584.2, + "p95": 608, + "p99": 620.3, + "p999": 620.3 } }, "histograms": { "http.response_time": { - "min": 47, - "max": 171, - "count": 146, - "p50": 70.1, - "median": 70.1, - "p75": 80.6, - "p90": 100.5, - "p95": 113.3, - "p99": 135.7, - "p999": 141.2 + "min": 39, + "max": 134, + "count": 352, + "p50": 59.7, + "median": 59.7, + "p75": 74.4, + "p90": 85.6, + "p95": 94.6, + "p99": 102.5, + "p999": 111.1 }, "vusers.session_length": { - "min": 370, - "max": 546.9, - "count": 27, - "p50": 497.8, - "median": 497.8, - "p75": 518.1, - "p90": 528.6, - "p95": 539.2, - "p99": 539.2, - "p999": 539.2 + "min": 486.8, + "max": 727.2, + "count": 52, + "p50": 539.2, + "median": 539.2, + "p75": 572.6, + "p90": 584.2, + "p95": 608, + "p99": 620.3, + "p999": 620.3 + } + } + }, + { + "counters": { + "vusers.created_by_name.visit home page": 50, + "vusers.created": 50, + "http.requests": 351, + "http.codes.200": 252, + "http.responses": 352, + "http.codes.404": 100, + "vusers.failed": 0, + "vusers.completed": 51 + }, + "rates": { + "http.request_rate": 35 + }, + "http.request_rate": null, + "firstCounterAt": 1687326610003, + "firstHistogramAt": 1687326610003, + "lastCounterAt": 1687326619991, + "lastHistogramAt": 1687326619987, + "firstMetricAt": 1687326610003, + "lastMetricAt": 1687326619991, + "period": "1687326610000", + "summaries": { + "http.response_time": { + "min": 37, + "max": 182, + "count": 352, + "p50": 58.6, + "median": 58.6, + "p75": 67.4, + "p90": 79.1, + "p95": 87.4, + "p99": 106.7, + "p999": 125.2 + }, + "vusers.session_length": { + "min": 436.3, + "max": 645.1, + "count": 51, + "p50": 528.6, + "median": 528.6, + "p75": 550.1, + "p90": 561.2, + "p95": 596, + "p99": 608, + "p999": 608 + } + }, + "histograms": { + "http.response_time": { + "min": 37, + "max": 182, + "count": 352, + "p50": 58.6, + "median": 58.6, + "p75": 67.4, + "p90": 79.1, + "p95": 87.4, + "p99": 106.7, + "p999": 125.2 + }, + "vusers.session_length": { + "min": 436.3, + "max": 645.1, + "count": 51, + "p50": 528.6, + "median": 528.6, + "p75": 550.1, + "p90": 561.2, + "p95": 596, + "p99": 608, + "p999": 608 } } }, @@ -151,369 +279,1055 @@ "counters": { "vusers.created_by_name.visit home page": 50, "vusers.created": 50, - "http.requests": 250, + "http.requests": 350, "http.codes.200": 251, - "http.responses": 251, + "http.responses": 351, + "http.codes.404": 100, "vusers.failed": 0, "vusers.completed": 50 }, "rates": { - "http.request_rate": 25 + "http.request_rate": 35 }, + "firstCounterAt": 1687326620012, + "firstHistogramAt": 1687326620012, + "lastCounterAt": 1687326629994, + "lastHistogramAt": 1687326629994, + "firstMetricAt": 1687326620012, + "lastMetricAt": 1687326629994, + "period": "1687326620000", "http.request_rate": null, - "firstCounterAt": 1686934230019, - "firstHistogramAt": 1686934230019, - "lastCounterAt": 1686934239997, - "lastHistogramAt": 1686934239997, - "firstMetricAt": 1686934230019, - "lastMetricAt": 1686934239997, - "period": "1686934230000", "summaries": { "http.response_time": { - "min": 45, - "max": 101, - "count": 251, - "p50": 62.2, - "median": 62.2, - "p75": 68.7, - "p90": 80.6, - "p95": 82.3, - "p99": 94.6, - "p999": 98.5 + "min": 37, + "max": 109, + "count": 351, + "p50": 57.4, + "median": 57.4, + "p75": 64.7, + "p90": 74.4, + "p95": 79.1, + "p99": 87.4, + "p999": 94.6 }, "vusers.session_length": { - "min": 375.8, - "max": 499.4, + "min": 467.4, + "max": 586.2, "count": 50, - "p50": 415.8, - "median": 415.8, - "p75": 432.7, - "p90": 450.4, - "p95": 468.8, - "p99": 497.8, - "p999": 497.8 + "p50": 507.8, + "median": 507.8, + "p75": 518.1, + "p90": 528.6, + "p95": 539.2, + "p99": 550.1, + "p999": 550.1 } }, "histograms": { "http.response_time": { - "min": 45, - "max": 101, - "count": 251, - "p50": 62.2, - "median": 62.2, - "p75": 68.7, - "p90": 80.6, - "p95": 82.3, - "p99": 94.6, - "p999": 98.5 + "min": 37, + "max": 109, + "count": 351, + "p50": 57.4, + "median": 57.4, + "p75": 64.7, + "p90": 74.4, + "p95": 79.1, + "p99": 87.4, + "p999": 94.6 }, "vusers.session_length": { - "min": 375.8, - "max": 499.4, + "min": 467.4, + "max": 586.2, "count": 50, - "p50": 415.8, - "median": 415.8, - "p75": 432.7, - "p90": 450.4, - "p95": 468.8, - "p99": 497.8, - "p999": 497.8 + "p50": 507.8, + "median": 507.8, + "p75": 518.1, + "p90": 528.6, + "p95": 539.2, + "p99": 550.1, + "p999": 550.1 } } }, { "counters": { - "vusers.created_by_name.visit home page": 50, - "vusers.created": 50, - "http.requests": 250, - "http.codes.200": 249, - "http.responses": 249, + "vusers.created_by_name.visit home page": 76, + "vusers.created": 76, + "http.requests": 507, + "http.codes.200": 356, + "http.responses": 498, + "http.codes.404": 142, "vusers.failed": 0, - "vusers.completed": 50 + "vusers.completed": 68 }, "rates": { - "http.request_rate": 25 + "http.request_rate": 65 }, "http.request_rate": null, - "firstCounterAt": 1686934240012, - "firstHistogramAt": 1686934240012, - "lastCounterAt": 1686934249994, - "lastHistogramAt": 1686934249992, - "firstMetricAt": 1686934240012, - "lastMetricAt": 1686934249994, - "period": "1686934240000", + "firstCounterAt": 1687326630011, + "firstHistogramAt": 1687326630011, + "lastCounterAt": 1687326639998, + "lastHistogramAt": 1687326639998, + "firstMetricAt": 1687326630011, + "lastMetricAt": 1687326639998, + "period": "1687326630000", "summaries": { "http.response_time": { - "min": 46, - "max": 146, - "count": 249, - "p50": 64.7, - "median": 64.7, + "min": 39, + "max": 300, + "count": 498, + "p50": 58.6, + "median": 58.6, "p75": 74.4, - "p90": 85.6, - "p95": 87.4, - "p99": 115.6, - "p999": 120.3 + "p90": 94.6, + "p95": 108.9, + "p99": 135.7, + "p999": 194.4 }, "vusers.session_length": { - "min": 367.2, - "max": 493.1, - "count": 50, - "p50": 424.2, - "median": 424.2, - "p75": 450.4, - "p90": 468.8, - "p95": 478.3, - "p99": 487.9, - "p999": 487.9 + "min": 465.8, + "max": 745, + "count": 68, + "p50": 539.2, + "median": 539.2, + "p75": 584.2, + "p90": 608, + "p95": 620.3, + "p99": 699.4, + "p999": 699.4 } }, "histograms": { "http.response_time": { - "min": 46, - "max": 146, - "count": 249, - "p50": 64.7, - "median": 64.7, + "min": 39, + "max": 300, + "count": 498, + "p50": 58.6, + "median": 58.6, "p75": 74.4, - "p90": 85.6, - "p95": 87.4, - "p99": 115.6, - "p999": 120.3 + "p90": 94.6, + "p95": 108.9, + "p99": 135.7, + "p999": 194.4 }, "vusers.session_length": { - "min": 367.2, - "max": 493.1, - "count": 50, - "p50": 424.2, - "median": 424.2, - "p75": 450.4, - "p90": 468.8, - "p95": 478.3, - "p99": 487.9, - "p999": 487.9 + "min": 465.8, + "max": 745, + "count": 68, + "p50": 539.2, + "median": 539.2, + "p75": 584.2, + "p90": 608, + "p95": 620.3, + "p99": 699.4, + "p999": 699.4 } } }, { "counters": { - "vusers.created_by_name.visit home page": 63, - "vusers.created": 63, - "http.requests": 300, - "http.codes.200": 297, - "http.responses": 297, + "http.codes.200": 608, + "http.responses": 854, + "http.requests": 854, "vusers.failed": 0, - "vusers.completed": 58 + "vusers.completed": 122, + "http.codes.404": 246, + "vusers.created_by_name.visit home page": 123, + "vusers.created": 123 }, "rates": { - "http.request_rate": 42 - }, - "firstCounterAt": 1686934250057, - "firstHistogramAt": 1686934250057, - "lastCounterAt": 1686934259992, - "lastHistogramAt": 1686934259990, - "firstMetricAt": 1686934250057, - "lastMetricAt": 1686934259992, - "period": "1686934250000", + "http.request_rate": 86 + }, "http.request_rate": null, + "firstCounterAt": 1687326640008, + "firstHistogramAt": 1687326640008, + "lastCounterAt": 1687326649999, + "lastHistogramAt": 1687326649999, + "firstMetricAt": 1687326640008, + "lastMetricAt": 1687326649999, + "period": "1687326640000", "summaries": { "http.response_time": { - "min": 44, - "max": 107, - "count": 297, - "p50": 61, - "median": 61, - "p75": 71.5, - "p90": 79.1, - "p95": 82.3, - "p99": 96.6, - "p999": 100.5 + "min": 36, + "max": 203, + "count": 854, + "p50": 59.7, + "median": 59.7, + "p75": 77.5, + "p90": 92.8, + "p95": 102.5, + "p99": 141.2, + "p999": 175.9 }, "vusers.session_length": { - "min": 363.1, - "max": 513, - "count": 58, - "p50": 415.8, - "median": 415.8, - "p75": 432.7, - "p90": 459.5, - "p95": 468.8, - "p99": 497.8, - "p999": 497.8 + "min": 449.2, + "max": 700.7, + "count": 122, + "p50": 561.2, + "median": 561.2, + "p75": 596, + "p90": 645.6, + "p95": 658.6, + "p99": 699.4, + "p999": 699.4 } }, "histograms": { "http.response_time": { - "min": 44, - "max": 107, - "count": 297, - "p50": 61, - "median": 61, - "p75": 71.5, - "p90": 79.1, - "p95": 82.3, - "p99": 96.6, - "p999": 100.5 + "min": 36, + "max": 203, + "count": 854, + "p50": 59.7, + "median": 59.7, + "p75": 77.5, + "p90": 92.8, + "p95": 102.5, + "p99": 141.2, + "p999": 175.9 }, "vusers.session_length": { - "min": 363.1, - "max": 513, - "count": 58, - "p50": 415.8, - "median": 415.8, - "p75": 432.7, - "p90": 459.5, - "p95": 468.8, - "p99": 497.8, - "p999": 497.8 + "min": 449.2, + "max": 700.7, + "count": 122, + "p50": 561.2, + "median": 561.2, + "p75": 596, + "p90": 645.6, + "p95": 658.6, + "p99": 699.4, + "p999": 699.4 } } }, { "counters": { - "vusers.created_by_name.visit home page": 141, - "vusers.created": 141, - "http.requests": 702, - "http.codes.200": 698, - "http.responses": 698, + "http.codes.200": 845, + "http.responses": 1181, + "http.requests": 1181, + "http.codes.404": 336, + "vusers.created_by_name.visit home page": 168, + "vusers.created": 168, "vusers.failed": 0, - "vusers.completed": 139 + "vusers.completed": 169 }, "rates": { - "http.request_rate": 72 + "http.request_rate": 118 }, "http.request_rate": null, - "firstCounterAt": 1686934260002, - "firstHistogramAt": 1686934260002, - "lastCounterAt": 1686934269995, - "lastHistogramAt": 1686934269994, - "firstMetricAt": 1686934260002, - "lastMetricAt": 1686934269995, - "period": "1686934260000", + "firstCounterAt": 1687326650001, + "firstHistogramAt": 1687326650017, + "lastCounterAt": 1687326659997, + "lastHistogramAt": 1687326659997, + "firstMetricAt": 1687326650001, + "lastMetricAt": 1687326659997, + "period": "1687326650000", "summaries": { "http.response_time": { - "min": 46, - "max": 134, - "count": 698, - "p50": 68.7, - "median": 68.7, - "p75": 82.3, - "p90": 96.6, - "p95": 104.6, - "p99": 120.3, - "p999": 130.3 - }, - "vusers.session_length": { - "min": 354, - "max": 604.9, - "count": 139, - "p50": 450.4, - "median": 450.4, - "p75": 487.9, - "p90": 518.1, - "p95": 539.2, - "p99": 561.2, - "p999": 561.2 + "min": 36, + "max": 172, + "count": 1181, + "p50": 67.4, + "median": 67.4, + "p75": 85.6, + "p90": 104.6, + "p95": 115.6, + "p99": 135.7, + "p999": 162.4 + }, + "vusers.session_length": { + "min": 464.4, + "max": 746.8, + "count": 169, + "p50": 584.2, + "median": 584.2, + "p75": 632.8, + "p90": 685.5, + "p95": 699.4, + "p99": 742.6, + "p999": 742.6 } }, "histograms": { "http.response_time": { - "min": 46, - "max": 134, - "count": 698, - "p50": 68.7, - "median": 68.7, - "p75": 82.3, - "p90": 96.6, - "p95": 104.6, - "p99": 120.3, - "p999": 130.3 - }, - "vusers.session_length": { - "min": 354, - "max": 604.9, - "count": 139, - "p50": 450.4, - "median": 450.4, - "p75": 487.9, - "p90": 518.1, - "p95": 539.2, - "p99": 561.2, - "p999": 561.2 + "min": 36, + "max": 172, + "count": 1181, + "p50": 67.4, + "median": 67.4, + "p75": 85.6, + "p90": 104.6, + "p95": 115.6, + "p99": 135.7, + "p999": 162.4 + }, + "vusers.session_length": { + "min": 464.4, + "max": 746.8, + "count": 169, + "p50": 584.2, + "median": 584.2, + "p75": 632.8, + "p90": 685.5, + "p95": 699.4, + "p99": 742.6, + "p999": 742.6 } } }, { "counters": { - "http.codes.200": 1108, - "http.responses": 1108, - "http.requests": 1119, + "vusers.created_by_name.visit home page": 217, + "vusers.created": 217, + "http.requests": 1407, + "http.codes.200": 978, + "http.responses": 1369, + "http.codes.404": 391, "vusers.failed": 0, - "vusers.completed": 217, - "vusers.created_by_name.visit home page": 230, - "vusers.created": 230 + "vusers.completed": 178 }, "rates": { - "http.request_rate": 114 + "http.request_rate": 142 }, "http.request_rate": null, - "firstCounterAt": 1686934270015, - "firstHistogramAt": 1686934270015, - "lastCounterAt": 1686934279998, - "lastHistogramAt": 1686934279996, - "firstMetricAt": 1686934270015, - "lastMetricAt": 1686934279998, - "period": "1686934270000", + "firstCounterAt": 1687326660006, + "firstHistogramAt": 1687326660006, + "lastCounterAt": 1687326669998, + "lastHistogramAt": 1687326669996, + "firstMetricAt": 1687326660006, + "lastMetricAt": 1687326669998, + "period": "1687326660000", "summaries": { "http.response_time": { - "min": 45, - "max": 703, - "count": 1108, - "p50": 87.4, - "median": 87.4, - "p75": 102.5, - "p90": 120.3, - "p95": 133, - "p99": 399.5, - "p999": 572.6 - }, - "vusers.session_length": { - "min": 386.6, - "max": 1308.6, - "count": 217, - "p50": 539.2, - "median": 539.2, - "p75": 584.2, - "p90": 645.6, - "p95": 772.9, - "p99": 963.1, - "p999": 1107.9 + "min": 37, + "max": 1885, + "count": 1369, + "p50": 92.8, + "median": 92.8, + "p75": 115.6, + "p90": 153, + "p95": 658.6, + "p99": 1587.9, + "p999": 1755 + }, + "vusers.session_length": { + "min": 559.5, + "max": 3743.3, + "count": 178, + "p50": 742.6, + "median": 742.6, + "p75": 1153.1, + "p90": 1978.7, + "p95": 2725, + "p99": 3464.1, + "p999": 3678.4 } }, "histograms": { "http.response_time": { - "min": 45, - "max": 703, - "count": 1108, - "p50": 87.4, - "median": 87.4, - "p75": 102.5, - "p90": 120.3, - "p95": 133, - "p99": 399.5, - "p999": 572.6 - }, - "vusers.session_length": { - "min": 386.6, - "max": 1308.6, - "count": 217, - "p50": 539.2, - "median": 539.2, - "p75": 584.2, - "p90": 645.6, - "p95": 772.9, - "p99": 963.1, - "p999": 1107.9 + "min": 37, + "max": 1885, + "count": 1369, + "p50": 92.8, + "median": 92.8, + "p75": 115.6, + "p90": 153, + "p95": 658.6, + "p99": 1587.9, + "p999": 1755 + }, + "vusers.session_length": { + "min": 559.5, + "max": 3743.3, + "count": 178, + "p50": 742.6, + "median": 742.6, + "p75": 1153.1, + "p90": 1978.7, + "p95": 2725, + "p99": 3464.1, + "p999": 3678.4 + } + } + }, + { + "counters": { + "vusers.created_by_name.visit home page": 263, + "vusers.created": 263, + "http.requests": 1550, + "http.codes.404": 417, + "http.responses": 1469, + "http.codes.200": 1052, + "vusers.failed": 0, + "vusers.completed": 182 + }, + "rates": { + "http.request_rate": 156 + }, + "http.request_rate": null, + "firstCounterAt": 1687326670002, + "firstHistogramAt": 1687326670002, + "lastCounterAt": 1687326679999, + "lastHistogramAt": 1687326679992, + "firstMetricAt": 1687326670002, + "lastMetricAt": 1687326679999, + "period": "1687326670000", + "summaries": { + "http.response_time": { + "min": 36, + "max": 4546, + "count": 1469, + "p50": 94.6, + "median": 94.6, + "p75": 115.6, + "p90": 190.6, + "p95": 3197.8, + "p99": 4403.8, + "p999": 4492.8 + }, + "vusers.session_length": { + "min": 569.4, + "max": 8136.1, + "count": 182, + "p50": 837.3, + "median": 837.3, + "p75": 4147.4, + "p90": 5168, + "p95": 6439.7, + "p99": 8186.6, + "p999": 8186.6 + } + }, + "histograms": { + "http.response_time": { + "min": 36, + "max": 4546, + "count": 1469, + "p50": 94.6, + "median": 94.6, + "p75": 115.6, + "p90": 190.6, + "p95": 3197.8, + "p99": 4403.8, + "p999": 4492.8 + }, + "vusers.session_length": { + "min": 569.4, + "max": 8136.1, + "count": 182, + "p50": 837.3, + "median": 837.3, + "p75": 4147.4, + "p90": 5168, + "p95": 6439.7, + "p99": 8186.6, + "p999": 8186.6 + } + } + }, + { + "counters": { + "http.codes.200": 1016, + "http.responses": 1411, + "http.requests": 1560, + "vusers.created_by_name.visit home page": 306, + "vusers.created": 306, + "http.codes.404": 395, + "vusers.failed": 0, + "vusers.completed": 157 + }, + "rates": { + "http.request_rate": 157 + }, + "http.request_rate": null, + "firstCounterAt": 1687326680000, + "firstHistogramAt": 1687326680000, + "lastCounterAt": 1687326689999, + "lastHistogramAt": 1687326689999, + "firstMetricAt": 1687326680000, + "lastMetricAt": 1687326689999, + "period": "1687326680000", + "summaries": { + "http.response_time": { + "min": 37, + "max": 8992, + "count": 1411, + "p50": 98.5, + "median": 98.5, + "p75": 117.9, + "p90": 278.7, + "p95": 6569.8, + "p99": 8520.7, + "p999": 8868.4 + }, + "vusers.session_length": { + "min": 614.9, + "max": 19259.4, + "count": 157, + "p50": 5378.9, + "median": 5378.9, + "p75": 8352, + "p90": 10832, + "p95": 12968.3, + "p99": 14048.5, + "p999": 15526 + } + }, + "histograms": { + "http.response_time": { + "min": 37, + "max": 8992, + "count": 1411, + "p50": 98.5, + "median": 98.5, + "p75": 117.9, + "p90": 278.7, + "p95": 6569.8, + "p99": 8520.7, + "p999": 8868.4 + }, + "vusers.session_length": { + "min": 614.9, + "max": 19259.4, + "count": 157, + "p50": 5378.9, + "median": 5378.9, + "p75": 8352, + "p90": 10832, + "p95": 12968.3, + "p99": 14048.5, + "p999": 15526 + } + } + }, + { + "counters": { + "http.codes.404": 406, + "http.responses": 1395, + "http.requests": 1625, + "vusers.created_by_name.visit home page": 356, + "vusers.created": 356, + "http.codes.200": 989, + "vusers.failed": 168, + "vusers.completed": 121, + "errors.ETIMEDOUT": 168 + }, + "rates": { + "http.request_rate": 164 + }, + "http.request_rate": null, + "firstCounterAt": 1687326690001, + "firstHistogramAt": 1687326690001, + "lastCounterAt": 1687326699982, + "lastHistogramAt": 1687326699982, + "firstMetricAt": 1687326690001, + "lastMetricAt": 1687326699982, + "period": "1687326690000", + "summaries": { + "http.response_time": { + "min": 38, + "max": 9998, + "count": 1395, + "p50": 96.6, + "median": 96.6, + "p75": 115.6, + "p90": 141.2, + "p95": 9801.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 626.5, + "max": 19137.2, + "count": 121, + "p50": 804.5, + "median": 804.5, + "p75": 10407.3, + "p90": 14917.2, + "p95": 16819.2, + "p99": 18588.1, + "p999": 18963.6 + } + }, + "histograms": { + "http.response_time": { + "min": 38, + "max": 9998, + "count": 1395, + "p50": 96.6, + "median": 96.6, + "p75": 115.6, + "p90": 141.2, + "p95": 9801.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 626.5, + "max": 19137.2, + "count": 121, + "p50": 804.5, + "median": 804.5, + "p75": 10407.3, + "p90": 14917.2, + "p95": 16819.2, + "p99": 18588.1, + "p999": 18963.6 + } + } + }, + { + "counters": { + "http.codes.200": 960, + "http.responses": 1321, + "http.requests": 1625, + "http.codes.404": 361, + "vusers.created_by_name.visit home page": 402, + "vusers.created": 402, + "errors.ETIMEDOUT": 254, + "vusers.failed": 254, + "vusers.completed": 86 + }, + "rates": { + "http.request_rate": 163 + }, + "http.request_rate": null, + "firstCounterAt": 1687326700002, + "firstHistogramAt": 1687326700004, + "lastCounterAt": 1687326709998, + "lastHistogramAt": 1687326709996, + "firstMetricAt": 1687326700002, + "lastMetricAt": 1687326709998, + "period": "1687326700000", + "summaries": { + "http.response_time": { + "min": 38, + "max": 9999, + "count": 1321, + "p50": 100.5, + "median": 100.5, + "p75": 117.9, + "p90": 144, + "p95": 9801.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 599.1, + "max": 25044.6, + "count": 86, + "p50": 757.6, + "median": 757.6, + "p75": 10617.5, + "p90": 10617.5, + "p95": 10832, + "p99": 20543.1, + "p999": 20543.1 + } + }, + "histograms": { + "http.response_time": { + "min": 38, + "max": 9999, + "count": 1321, + "p50": 100.5, + "median": 100.5, + "p75": 117.9, + "p90": 144, + "p95": 9801.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 599.1, + "max": 25044.6, + "count": 86, + "p50": 757.6, + "median": 757.6, + "p75": 10617.5, + "p90": 10617.5, + "p95": 10832, + "p99": 20543.1, + "p999": 20543.1 + } + } + }, + { + "counters": { + "http.codes.404": 383, + "http.responses": 1378, + "http.requests": 1718, + "http.codes.200": 995, + "errors.ETIMEDOUT": 319, + "vusers.failed": 319, + "vusers.created_by_name.visit home page": 447, + "vusers.created": 447, + "vusers.completed": 93 + }, + "rates": { + "http.request_rate": 173 + }, + "http.request_rate": null, + "firstCounterAt": 1687326710001, + "firstHistogramAt": 1687326710001, + "lastCounterAt": 1687326719990, + "lastHistogramAt": 1687326719988, + "firstMetricAt": 1687326710001, + "lastMetricAt": 1687326719990, + "period": "1687326710000", + "summaries": { + "http.response_time": { + "min": 38, + "max": 10001, + "count": 1378, + "p50": 98.5, + "median": 98.5, + "p75": 117.9, + "p90": 138.4, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 610.3, + "max": 20509.7, + "count": 93, + "p50": 772.9, + "median": 772.9, + "p75": 10617.5, + "p90": 10617.5, + "p95": 10832, + "p99": 20543.1, + "p999": 20543.1 + } + }, + "histograms": { + "http.response_time": { + "min": 38, + "max": 10001, + "count": 1378, + "p50": 98.5, + "median": 98.5, + "p75": 117.9, + "p90": 138.4, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 610.3, + "max": 20509.7, + "count": 93, + "p50": 772.9, + "median": 772.9, + "p75": 10617.5, + "p90": 10617.5, + "p95": 10832, + "p99": 20543.1, + "p999": 20543.1 + } + } + }, + { + "counters": { + "vusers.created_by_name.visit home page": 493, + "vusers.created": 493, + "http.requests": 1723, + "http.codes.200": 965, + "http.responses": 1309, + "http.codes.404": 344, + "errors.ETIMEDOUT": 362, + "vusers.failed": 362, + "vusers.completed": 65 + }, + "rates": { + "http.request_rate": 173 + }, + "http.request_rate": null, + "firstCounterAt": 1687326720000, + "firstHistogramAt": 1687326720000, + "lastCounterAt": 1687326729988, + "lastHistogramAt": 1687326729986, + "firstMetricAt": 1687326720000, + "lastMetricAt": 1687326729988, + "period": "1687326720000", + "summaries": { + "http.response_time": { + "min": 38, + "max": 9999, + "count": 1309, + "p50": 100.5, + "median": 100.5, + "p75": 120.3, + "p90": 144, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 645, + "max": 30326.4, + "count": 65, + "p50": 757.6, + "median": 757.6, + "p75": 10617.5, + "p90": 10832, + "p95": 20543.1, + "p99": 20543.1, + "p999": 20543.1 + } + }, + "histograms": { + "http.response_time": { + "min": 38, + "max": 9999, + "count": 1309, + "p50": 100.5, + "median": 100.5, + "p75": 120.3, + "p90": 144, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 645, + "max": 30326.4, + "count": 65, + "p50": 757.6, + "median": 757.6, + "p75": 10617.5, + "p90": 10832, + "p95": 20543.1, + "p99": 20543.1, + "p999": 20543.1 + } + } + }, + { + "counters": { + "vusers.created_by_name.visit home page": 540, + "vusers.created": 540, + "http.requests": 1723, + "http.codes.200": 934, + "http.responses": 1249, + "errors.ETIMEDOUT": 443, + "vusers.failed": 444, + "http.codes.404": 315, + "vusers.completed": 58, + "errors.EPROTO": 1 + }, + "rates": { + "http.request_rate": 174 + }, + "http.request_rate": null, + "firstCounterAt": 1687326730000, + "firstHistogramAt": 1687326730000, + "lastCounterAt": 1687326739992, + "lastHistogramAt": 1687326739992, + "firstMetricAt": 1687326730000, + "lastMetricAt": 1687326739992, + "period": "1687326730000", + "summaries": { + "http.response_time": { + "min": 38, + "max": 10001, + "count": 1249, + "p50": 104.6, + "median": 104.6, + "p75": 122.7, + "p90": 141.2, + "p95": 186.8, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 647, + "max": 20873.6, + "count": 58, + "p50": 772.9, + "median": 772.9, + "p75": 10617.5, + "p90": 10617.5, + "p95": 20543.1, + "p99": 20543.1, + "p999": 20543.1 + } + }, + "histograms": { + "http.response_time": { + "min": 38, + "max": 10001, + "count": 1249, + "p50": 104.6, + "median": 104.6, + "p75": 122.7, + "p90": 141.2, + "p95": 186.8, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 647, + "max": 20873.6, + "count": 58, + "p50": 772.9, + "median": 772.9, + "p75": 10617.5, + "p90": 10617.5, + "p95": 20543.1, + "p99": 20543.1, + "p999": 20543.1 + } + } + }, + { + "counters": { + "http.codes.200": 921, + "http.responses": 1239, + "http.requests": 1665, + "vusers.created_by_name.visit home page": 504, + "vusers.created": 504, + "vusers.failed": 472, + "vusers.completed": 70, + "http.codes.404": 318, + "errors.ETIMEDOUT": 472 + }, + "rates": { + "http.request_rate": 172 + }, + "http.request_rate": null, + "firstCounterAt": 1687326740001, + "firstHistogramAt": 1687326740001, + "lastCounterAt": 1687326749999, + "lastHistogramAt": 1687326749999, + "firstMetricAt": 1687326740001, + "lastMetricAt": 1687326749999, + "period": "1687326740000", + "summaries": { + "http.response_time": { + "min": 38, + "max": 9999, + "count": 1239, + "p50": 100.5, + "median": 100.5, + "p75": 120.3, + "p90": 141.2, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 654.6, + "max": 30406.9, + "count": 70, + "p50": 788.5, + "median": 788.5, + "p75": 10617.5, + "p90": 10617.5, + "p95": 10617.5, + "p99": 20543.1, + "p999": 20543.1 + } + }, + "histograms": { + "http.response_time": { + "min": 38, + "max": 9999, + "count": 1239, + "p50": 100.5, + "median": 100.5, + "p75": 120.3, + "p90": 141.2, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 654.6, + "max": 30406.9, + "count": 70, + "p50": 788.5, + "median": 788.5, + "p75": 10617.5, + "p90": 10617.5, + "p95": 10617.5, + "p99": 20543.1, + "p999": 20543.1 + } + } + }, + { + "counters": { + "errors.ETIMEDOUT": 365, + "vusers.failed": 365, + "http.codes.404": 215, + "http.responses": 698, + "http.requests": 531, + "http.codes.200": 483, + "vusers.completed": 144 + }, + "rates": { + "http.request_rate": 65 + }, + "http.request_rate": null, + "firstCounterAt": 1687326750002, + "firstHistogramAt": 1687326750002, + "lastCounterAt": 1687326759103, + "lastHistogramAt": 1687326759103, + "firstMetricAt": 1687326750002, + "lastMetricAt": 1687326759103, + "period": "1687326750000", + "summaries": { + "http.response_time": { + "min": 37, + "max": 10001, + "count": 698, + "p50": 80.6, + "median": 80.6, + "p75": 214.9, + "p90": 9999.2, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 10314.2, + "max": 20586.1, + "count": 144, + "p50": 10617.5, + "median": 10617.5, + "p75": 10617.5, + "p90": 10832, + "p95": 20543.1, + "p99": 20543.1, + "p999": 20543.1 + } + }, + "histograms": { + "http.response_time": { + "min": 37, + "max": 10001, + "count": 698, + "p50": 80.6, + "median": 80.6, + "p75": 214.9, + "p90": 9999.2, + "p95": 9999.2, + "p99": 9999.2, + "p999": 9999.2 + }, + "vusers.session_length": { + "min": 10314.2, + "max": 20586.1, + "count": 144, + "p50": 10617.5, + "median": 10617.5, + "p75": 10617.5, + "p90": 10832, + "p95": 20543.1, + "p99": 20543.1, + "p999": 20543.1 } } } diff --git a/test-run-report.json.html b/test-run-report.json.html deleted file mode 100644 index 8eaef349..00000000 --- a/test-run-report.json.html +++ /dev/null @@ -1,1349 +0,0 @@ - - - - - Artillery report - - - - - - - - - - - - - - - - - -
-
-
-
- - - - -
-
-

- Artillery Report -

-
-
-
- -
- -
-
- - -
-
-
-
-
- -
-
    -
-
-
- -
-
- - - - - - - - - -
- Metric - - Value -
-
-
-

Errors at intervals

- -
- -
-
-
-
-
-
-
- - -
- -
-
- - -
-
-
-
-
-
- -
- - - - - - - - \ No newline at end of file diff --git a/test/application_system_test_case.rb b/test/application_system_test_case.rb index f3db1f4c..e81d02d7 100644 --- a/test/application_system_test_case.rb +++ b/test/application_system_test_case.rb @@ -1,5 +1,18 @@ require "test_helper" +Capybara.register_driver :headless_chrome do |app| + options = ::Selenium::WebDriver::Chrome::Options.new + options.add_argument("--headless") unless ActiveModel::Type::Boolean.new.cast(ENV["HEADFUL"]) + options.add_argument("--window-size=1920,1080") + + client = Selenium::WebDriver::Remote::Http::Default.new + client.read_timeout = 240 + + Capybara::Selenium::Driver.new(app, browser: :chrome, capabilities: [options], http_client: client) +end + +Capybara.javascript_driver = :headless_chrome + class ApplicationSystemTestCase < ActionDispatch::SystemTestCase driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400] @@ -12,4 +25,12 @@ def sign_in_as(user) assert_current_path root_url user end + + def wait_for_turbo(timeout = 2) + if has_css?(".turbo-progress-bar", visible: true, wait: 0.25.seconds) + has_no_css?(".turbo-progress-bar", wait: timeout) + end + end end + +Capybara.default_max_wait_time = 5 # Set the wait time in seconds diff --git a/test/clients/youtube/channels_test.rb b/test/clients/youtube/channels_test.rb index d19cd9e0..141eb413 100644 --- a/test/clients/youtube/channels_test.rb +++ b/test/clients/youtube/channels_test.rb @@ -4,14 +4,14 @@ class Youtube::ChannelsTest < ActiveSupport::TestCase end test "should retreive the channel id from the user name" do - VCR.use_cassette("youtube/channels") do + VCR.use_cassette("youtube/channels", match_requests_on: [:method]) do channel_id = Youtube::Channels.new.id_by_name(channel_name: "confreaks") assert_equal "UCWnPjmqvljcafA0z2U1fwKQ", channel_id end end test "should retreive the channel id from the user name with dash" do - VCR.use_cassette("youtube/channels-scrapping") do + VCR.use_cassette("youtube/channels-scrapping", match_requests_on: [:method]) do channel_id = Youtube::Channels.new.id_by_name(channel_name: "paris-rb") assert_equal "UCFKE6QHGPAkISMj1SQdqnnw", channel_id end diff --git a/test/clients/youtube/playlist_items_test.rb b/test/clients/youtube/playlist_items_test.rb index 019c22fa..f8b0903e 100644 --- a/test/clients/youtube/playlist_items_test.rb +++ b/test/clients/youtube/playlist_items_test.rb @@ -1,7 +1,7 @@ require "test_helper" class Youtube::PlaylistItemsTest < ActiveSupport::TestCase test "should retreive the playlist of a channel" do - VCR.use_cassette("youtube/playlist_items/all") do + VCR.use_cassette("youtube/playlist_items/all", match_requests_on: [:method]) do items = Youtube::PlaylistItems.new.all(playlist_id: "PLE7tQUdRKcyZYz0O3d9ZDdo0-BkOWhrSk") assert items.is_a?(Array) assert items.length > 50 diff --git a/test/clients/youtube/playlists_test.rb b/test/clients/youtube/playlists_test.rb index 71e54b3b..415b9d44 100644 --- a/test/clients/youtube/playlists_test.rb +++ b/test/clients/youtube/playlists_test.rb @@ -1,7 +1,7 @@ require "test_helper" class Youtube::PlaylistsTest < ActiveSupport::TestCase test "should retreive the playlist of a channel" do - VCR.use_cassette("youtube/playlists/all") do + VCR.use_cassette("youtube/playlists/all", match_requests_on: [:method]) do playlists = Youtube::Playlists.new.all(channel_id: "UCWnPjmqvljcafA0z2U1fwKQ") assert playlists.is_a?(Array) assert playlists.length > 50 diff --git a/test/clients/youtube/video_test.rb b/test/clients/youtube/video_test.rb new file mode 100644 index 00000000..f139e1dc --- /dev/null +++ b/test/clients/youtube/video_test.rb @@ -0,0 +1,29 @@ +require "test_helper" + +module Youtube + class VideoTest < ActiveSupport::TestCase + def setup + @client = Youtube::Video.new + end + + test "should return statistics for a valid video" do + video_id = "9LfmrkyP81M" + + VCR.use_cassette("youtube_statistics", match_requests_on: [:method]) do + stats = @client.get_statistics(video_id) + assert_not_nil stats + assert stats.has_key?(:view_count) + assert stats.has_key?(:like_count) + end + end + + test "should return nil for an invalid video" do + video_id = "invalid_video_id" + + VCR.use_cassette("youtube_statistics_invalid", match_requests_on: [:method]) do + stats = @client.get_statistics(video_id) + assert_nil stats + end + end + end +end diff --git a/test/controllers/analytics/dashboards_controller_test.rb b/test/controllers/analytics/dashboards_controller_test.rb new file mode 100644 index 00000000..3b4d0ea4 --- /dev/null +++ b/test/controllers/analytics/dashboards_controller_test.rb @@ -0,0 +1,117 @@ +require "test_helper" + +class Analytics::DashboardsControllerTest < ActionDispatch::IntegrationTest + test "should get show" do + get analytics_dashboards_path + assert_response :success + end + + test "only return the last 60 days of data excluding today" do + Rails.cache.clear + travel_to Time.new(2023, 8, 26, 12, 0, 0) do + visit_1 = Ahoy::Visit.create!(started_at: Time.current) + Ahoy::Event.create!(name: "Some Page during visit_1", visit: visit_1, time: Time.current) + end + + travel_to Time.new(2023, 8, 27, 12, 0, 0) do + visit_2 = Ahoy::Visit.create!(started_at: Time.current) + Ahoy::Event.create!(name: "Some Page during visit_2", visit: visit_2, time: Time.current) + get daily_page_views_analytics_dashboards_path + assert_response :success + yesterday_page_views = assigns(:daily_page_views)[Date.new(2023, 8, 26)] + today_page_views = assigns(:daily_page_views)[Date.new(2023, 8, 27)] + assert_equal 1, yesterday_page_views + assert_nil today_page_views + end + end + + test "should test caching for daily_page_views" do + Rails.cache.clear + + travel_to Time.new(2023, 8, 26, 12, 0, 0) do + visit_1 = Ahoy::Visit.create!(started_at: Time.current) + Ahoy::Event.create!(name: "Some Page during visit_1", visit: visit_1, time: Time.current) + end + + # Travel to a fixed time for a consistent test environment + travel_to Time.new(2023, 8, 27, 12, 0, 0) do + # Make first call to populate cache + get daily_page_views_analytics_dashboards_path + assert_response :success + yesterday_page_views = assigns(:daily_page_views)[Date.new(2023, 8, 26)] + today_page_views = assigns(:daily_page_views)[Date.new(2023, 8, 27)] + assert_equal 1, yesterday_page_views + assert_nil today_page_views + + # Create a new page view today + visit_2 = Ahoy::Visit.create!(started_at: Time.current) + Ahoy::Event.create!(name: "Some Page during visit 2", visit: visit_2, time: Time.current) + + # Make second call, length should not change because of cache + get daily_page_views_analytics_dashboards_path + assert_response :success + yesterday_page_views = assigns(:daily_page_views)[Date.new(2023, 8, 26)] + today_page_views = assigns(:daily_page_views)[Date.new(2023, 8, 27)] + assert_equal 1, yesterday_page_views + assert_nil today_page_views + end + + # Travel to the next morning, cache should expire + travel_to Time.new(2023, 8, 28, 12, 0, 0) do + # Make third call, length should change by 1 + get daily_page_views_analytics_dashboards_path + assert_response :success + day_before_yesterday_page_views = assigns(:daily_page_views)[Date.new(2023, 8, 27)] + yesterday_page_views = assigns(:daily_page_views)[Date.new(2023, 8, 27)] + today_page_views = assigns(:daily_page_views)[Date.new(2023, 8, 28)] + assert_equal 1, day_before_yesterday_page_views + assert_equal 1, yesterday_page_views + assert_nil today_page_views + end + end + + test "should test caching for daily_visits" do + Rails.cache.clear + + travel_to Time.new(2023, 8, 26, 12, 0, 0) do + visit_1 = Ahoy::Visit.create!(started_at: Time.current) + Ahoy::Event.create!(name: "Some Page during visit_1", visit: visit_1, time: Time.current) + end + + # Travel to a fixed time for a consistent test environment + travel_to Time.new(2023, 8, 27, 12, 0, 0) do + # Make first call to populate cache + get daily_visits_analytics_dashboards_path + assert_response :success + yesterday_page_views = assigns(:daily_visits)[Date.new(2023, 8, 26)] + today_page_views = assigns(:daily_visits)[Date.new(2023, 8, 27)] + assert_equal 1, yesterday_page_views + assert_nil today_page_views + + # Create a new page view today + visit_2 = Ahoy::Visit.create!(started_at: Time.current) + Ahoy::Event.create!(name: "Some Page during visit 2", visit: visit_2, time: Time.current) + + # Make second call, length should not change because of cache + get daily_visits_analytics_dashboards_path + assert_response :success + yesterday_page_views = assigns(:daily_visits)[Date.new(2023, 8, 26)] + today_page_views = assigns(:daily_visits)[Date.new(2023, 8, 27)] + assert_equal 1, yesterday_page_views + assert_nil today_page_views + end + + # Travel to the next morning, cache should expire + travel_to Time.new(2023, 8, 28, 12, 0, 0) do + # Make third call, length should change by 1 + get daily_visits_analytics_dashboards_path + assert_response :success + day_before_yesterday_page_views = assigns(:daily_visits)[Date.new(2023, 8, 27)] + yesterday_page_views = assigns(:daily_visits)[Date.new(2023, 8, 27)] + today_page_views = assigns(:daily_visits)[Date.new(2023, 8, 28)] + assert_equal 1, day_before_yesterday_page_views + assert_equal 1, yesterday_page_views + assert_nil today_page_views + end + end +end diff --git a/test/controllers/events_controller_test.rb b/test/controllers/events_controller_test.rb index a0cbc273..44e16574 100644 --- a/test/controllers/events_controller_test.rb +++ b/test/controllers/events_controller_test.rb @@ -3,6 +3,7 @@ class EventsControllerTest < ActionDispatch::IntegrationTest setup do @event = events(:one) + @user = users(:lazaro_nixon) end test "should get index" do @@ -10,39 +11,19 @@ class EventsControllerTest < ActionDispatch::IntegrationTest assert_response :success end - test "should get new" do - get new_event_url - assert_response :success - end - - test "should create event" do - assert_difference("Event.count") do - post events_url, params: {event: {description: @event.description, frequency: @event.frequency, kind: @event.kind, name: @event.name, website: @event.website}} - end - - assert_redirected_to event_url(Event.last) - end - test "should show event" do get event_url(@event) assert_response :success end test "should get edit" do + sign_in_as @user get edit_event_url(@event) assert_response :success end test "should update event" do - patch event_url(@event), params: {event: {description: @event.description, frequency: @event.frequency, kind: @event.kind, name: @event.name, website: @event.website}} + patch event_url(@event), params: {event: {city: "Paris", country_code: "FR"}} assert_redirected_to event_url(@event) end - - test "should destroy event" do - assert_difference("Event.count", -1) do - delete event_url(@event) - end - - assert_redirected_to events_url - end end diff --git a/test/controllers/identity/email_verifications_controller_test.rb b/test/controllers/identity/email_verifications_controller_test.rb index 96dc95b3..c54413ed 100644 --- a/test/controllers/identity/email_verifications_controller_test.rb +++ b/test/controllers/identity/email_verifications_controller_test.rb @@ -7,7 +7,7 @@ class Identity::EmailVerificationsControllerTest < ActionDispatch::IntegrationTe end test "should send a verification email" do - assert_enqueued_email_with UserMailer, :email_verification, args: {user: @user} do + assert_enqueued_email_with UserMailer, :email_verification, params: {user: @user} do post identity_email_verification_url end diff --git a/test/controllers/identity/password_resets_controller_test.rb b/test/controllers/identity/password_resets_controller_test.rb index ddc1638f..5c7f0a21 100644 --- a/test/controllers/identity/password_resets_controller_test.rb +++ b/test/controllers/identity/password_resets_controller_test.rb @@ -18,7 +18,7 @@ class Identity::PasswordResetsControllerTest < ActionDispatch::IntegrationTest end test "should send a password reset email" do - assert_enqueued_email_with UserMailer, :password_reset, args: {user: @user} do + assert_enqueued_email_with UserMailer, :password_reset, params: {user: @user} do post identity_password_reset_url, params: {email: @user.email} end diff --git a/test/controllers/page_controller_test.rb b/test/controllers/page_controller_test.rb index 7520267f..6db0f42c 100644 --- a/test/controllers/page_controller_test.rb +++ b/test/controllers/page_controller_test.rb @@ -1,8 +1,13 @@ require "test_helper" class PageControllerTest < ActionDispatch::IntegrationTest - test "should get home" do - get page_home_url + test "should get home page" do + get root_path + assert_response :success + end + + test "should get uses page" do + get uses_path assert_response :success end end diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb index c9249376..c47dd9eb 100644 --- a/test/controllers/sessions_controller_test.rb +++ b/test/controllers/sessions_controller_test.rb @@ -30,7 +30,7 @@ class SessionsControllerTest < ActionDispatch::IntegrationTest assert_redirected_to sign_in_url(email_hint: @user.email) assert_equal "That email or password is incorrect", flash[:alert] - get root_url + get admin_suggestions_url assert_redirected_to sign_in_url end diff --git a/test/controllers/speakers/enhance_controller_test.rb b/test/controllers/speakers/enhance_controller_test.rb index 24bba5b9..f31e5080 100644 --- a/test/controllers/speakers/enhance_controller_test.rb +++ b/test/controllers/speakers/enhance_controller_test.rb @@ -1,8 +1,12 @@ require "test_helper" class Speakers::EnhanceControllerTest < ActionDispatch::IntegrationTest - test "should get update" do - get speakers_enhance_update_url + setup do + @user = sign_in_as(users(:admin)) + end + + test "#patch" do + patch speakers_enhance_url(speakers(:one), {format: :turbo_stream}) assert_response :success end end diff --git a/test/controllers/speakers_controller_test.rb b/test/controllers/speakers_controller_test.rb index 448b078c..69f42c41 100644 --- a/test/controllers/speakers_controller_test.rb +++ b/test/controllers/speakers_controller_test.rb @@ -10,19 +10,6 @@ class SpeakersControllerTest < ActionDispatch::IntegrationTest assert_response :success end - test "should get new" do - get new_speaker_url - assert_response :success - end - - test "should create speaker" do - assert_difference("Speaker.count") do - post speakers_url, params: {speaker: {bio: @speaker.bio, github: @speaker.github, name: @speaker.name, slug: @speaker.slug, twitter: @speaker.twitter, website: @speaker.website}} - end - - assert_redirected_to speaker_url(Speaker.last) - end - test "should show speaker" do get speaker_url(@speaker) assert_response :success @@ -37,12 +24,4 @@ class SpeakersControllerTest < ActionDispatch::IntegrationTest patch speaker_url(@speaker), params: {speaker: {bio: @speaker.bio, github: @speaker.github, name: @speaker.name, slug: @speaker.slug, twitter: @speaker.twitter, website: @speaker.website}} assert_redirected_to speaker_url(@speaker) end - - test "should destroy speaker" do - assert_difference("Speaker.count", -1) do - delete speaker_url(@speaker) - end - - assert_redirected_to speakers_url - end end diff --git a/test/controllers/talks_controller_test.rb b/test/controllers/talks_controller_test.rb index 2e3941cb..3e1812c0 100644 --- a/test/controllers/talks_controller_test.rb +++ b/test/controllers/talks_controller_test.rb @@ -10,24 +10,16 @@ class TalksControllerTest < ActionDispatch::IntegrationTest assert_response :success end - test "should get new" do - get new_talk_url - assert_response :success - end - - test "should create talk" do - assert_difference("Talk.count") do - post talks_url, params: {talk: {description: @talk.description, slug: @talk.slug, title: @talk.title, year: @talk.year}} - end - - assert_redirected_to talk_url(Talk.last) - end - test "should show talk" do get talk_url(@talk) assert_response :success end + test "should redirect to talks for wrong slugs" do + get talk_url("wrong-slug") + assert_response :moved_permanently + end + test "should get edit" do get edit_talk_url(@talk) assert_response :success @@ -37,12 +29,4 @@ class TalksControllerTest < ActionDispatch::IntegrationTest patch talk_url(@talk), params: {talk: {description: @talk.description, slug: @talk.slug, title: @talk.title, year: @talk.year}} assert_redirected_to talk_url(@talk) end - - test "should destroy talk" do - assert_difference("Talk.count", -1) do - delete talk_url(@talk) - end - - assert_redirected_to talks_url - end end diff --git a/test/fixtures/events.yml b/test/fixtures/events.yml index e3254ac1..c66c5203 100644 --- a/test/fixtures/events.yml +++ b/test/fixtures/events.yml @@ -18,7 +18,13 @@ one: date: 2017-05-01 organisation: one + city: Phoenix + name: RailsConf 2017 + slug: rails-conf-2017 two: date: 2023-05-01 organisation: two + city: Bangkok + name: RubyConf TH 2022 + slug: ruby-conf-th-2022 diff --git a/test/fixtures/speakers.yml b/test/fixtures/speakers.yml index 73740c81..4b6ee56f 100644 --- a/test/fixtures/speakers.yml +++ b/test/fixtures/speakers.yml @@ -17,17 +17,37 @@ # rubocop:enable Layout/LineLength one: - name: MyString - twitter: MyString - github: MyString - bio: MyText - website: MyString - slug: one - + name: Obie Fernandez + twitter: obie + github: obie + bio: Consultant, 25+ year veteran of professional software development, serial entrepreneur, and best-selling author. Currently serving as Founder & CEO of RCRDSHP + website: http://obiefernandez.com + slug: obie-fernandez two: - name: MyString - twitter: MyString - github: MyString - bio: MyText - website: MyString - slug: two + name: Ezra Zygmuntowicz + twitter: "" + github: ezmobius + bio: "" + website: http://stuffstr.com + slug: ezra-zygmuntowicz +jim: + name: Jim Weirich + twitter: "" + github: jimweirich + bio: "" + website: http://onestepback.org + slug: jim-weirich +patrick: + name: Patrick Leonard + twitter: pj_leonard + github: pjleonard37 + bio: Maps! + website: https://www.patrick-leonard.com + slug: patrick-leonard +michael: + name: Michael Hartl + twitter: mhartl + github: mhartl + bio: Author of the @railstutorial, founder of @learnenough, @softcover, and Tau Day. + website: https://www.michaelhartl.com/ + slug: michael-hartl diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 9d7bf84d..87e9d963 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -19,3 +19,9 @@ lazaro_nixon: email: lazaronixon@hotmail.com password_digest: <%= BCrypt::Password.create("Secret1*3*5*") %> verified: true + +admin: + email: admin@rubyvideo.dev + password_digest: <%= BCrypt::Password.create("Secret1*3*5*") %> + verified: true + admin: true diff --git a/test/jobs/speaker/enhance_profile_job_test.rb b/test/jobs/speaker/enhance_profile_job_test.rb index c51ea1dd..64bd72a8 100644 --- a/test/jobs/speaker/enhance_profile_job_test.rb +++ b/test/jobs/speaker/enhance_profile_job_test.rb @@ -30,7 +30,7 @@ class Speaker::EnhanceProfileJobTest < ActiveJob::TestCase VCR.use_cassette("speaker/enhance_profile_job_test_search_design") do @speaker = Speaker.create!(name: "Design") Speaker::EnhanceProfileJob.new.perform(@speaker) - assert_equal "design", @speaker.reload.github + assert_equal "Design-and-Code", @speaker.reload.github end end end diff --git a/test/models/speaker_test.rb b/test/models/speaker_test.rb index bbc6aa67..7f947722 100644 --- a/test/models/speaker_test.rb +++ b/test/models/speaker_test.rb @@ -18,7 +18,23 @@ require "test_helper" class SpeakerTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end + test "valid_website_url preserve the website url if already valid" do + speaker = Speaker.new(website: "https://www.google.com") + assert_equal "https://www.google.com", speaker.valid_website_url + end + + test "valid_website_url add https to the website if it is not present" do + speaker = Speaker.new(website: "www.google.com") + assert_equal "https://www.google.com", speaker.valid_website_url + end + + test "valid_website_url convert http to https" do + speaker = Speaker.new(website: "http://www.google.com") + assert_equal "https://www.google.com", speaker.valid_website_url + end + + test "valid_website_url returns # if website is blank" do + speaker = Speaker.new(website: "") + assert_equal "#", speaker.valid_website_url + end end diff --git a/test/system/events_test.rb b/test/system/events_test.rb index f2b12ad1..5093e16c 100644 --- a/test/system/events_test.rb +++ b/test/system/events_test.rb @@ -10,40 +10,22 @@ class EventsTest < ApplicationSystemTestCase assert_selector "h1", text: "Events" end - test "should create event" do - visit events_url - click_on "New event" - - fill_in "Description", with: @event.description - fill_in "Frequency", with: @event.frequency - fill_in "Kind", with: @event.kind - fill_in "Name", with: @event.name - fill_in "Website", with: @event.website - click_on "Create Event" - - assert_text "Event was successfully created" - click_on "Back" - end - - test "should update Event" do - visit event_url(@event) - click_on "Edit this event", match: :first - - fill_in "Description", with: @event.description - fill_in "Frequency", with: @event.frequency - fill_in "Kind", with: @event.kind - fill_in "Name", with: @event.name - fill_in "Website", with: @event.website - click_on "Update Event" - - assert_text "Event was successfully updated" - click_on "Back" - end - - test "should destroy Event" do - visit event_url(@event) - click_on "Destroy this event", match: :first - - assert_text "Event was successfully destroyed" - end + # Currently this test fails for 2 reasons: + # 1. The "Edit this event" button is on events_url + # 2. 'Description', 'Frequency', 'Kind' and 'Website' are attributes of the event's organisation, not the even itself + # The update method and the form would need to be amended for the method to work + # test "should update Event" do + # visit event_url(@event) + # click_on "Edit this event", match: :first + + # fill_in "Description", with: @event.description + # fill_in "Frequency", with: @event.frequency + # fill_in "Kind", with: @event.kind + # fill_in "Name", with: @event.name + # fill_in "Website", with: @event.website + # click_on "Update Event" + + # assert_text "Event was successfully updated" + # click_on "Back" + # end end diff --git a/test/system/identity/emails_test.rb b/test/system/identity/emails_test.rb index 3753cf44..da229683 100644 --- a/test/system/identity/emails_test.rb +++ b/test/system/identity/emails_test.rb @@ -1,26 +1,27 @@ -require "application_system_test_case" +# the UI don't have those links yet so let's comment them +# require "application_system_test_case" -class Identity::EmailsTest < ApplicationSystemTestCase - setup do - @user = sign_in_as(users(:lazaro_nixon)) - end +# class Identity::EmailsTest < ApplicationSystemTestCase +# setup do +# @user = sign_in_as(users(:lazaro_nixon)) +# end - test "updating the email" do - click_on "Change email address" +# test "updating the email" do +# click_on "Change email address" - fill_in "New email", with: "new_email@hey.com" - fill_in "Current password", with: "Secret1*3*5*" - click_on "Save changes" +# fill_in "New email", with: "new_email@hey.com" +# fill_in "Current password", with: "Secret1*3*5*" +# click_on "Save changes" - assert_text "Your email has been changed" - end +# assert_text "Your email has been changed" +# end - test "sending a verification email" do - @user.update! verified: false +# test "sending a verification email" do +# @user.update! verified: false - click_on "Change email address" - click_on "Re-send verification email" +# click_on "Change email address" +# click_on "Re-send verification email" - assert_text "We sent a verification email to your email address" - end -end +# assert_text "We sent a verification email to your email address" +# end +# end diff --git a/test/system/identity/password_resets_test.rb b/test/system/identity/password_resets_test.rb index 51f7fc53..6946fc21 100644 --- a/test/system/identity/password_resets_test.rb +++ b/test/system/identity/password_resets_test.rb @@ -9,8 +9,9 @@ class Identity::PasswordResetsTest < ApplicationSystemTestCase test "sending a password reset email" do visit sign_in_url click_on "Forgot your password?" + wait_for_turbo - fill_in "Email", with: @user.email + fill_in :email, with: @user.email click_on "Send password reset email" assert_text "Check your email for reset instructions" diff --git a/test/system/passwords_test.rb b/test/system/passwords_test.rb index 8f16d91f..a415988e 100644 --- a/test/system/passwords_test.rb +++ b/test/system/passwords_test.rb @@ -1,18 +1,19 @@ -require "application_system_test_case" +# the UI don't have those links yet so let's comment them +## require "application_system_test_case" -class PasswordsTest < ApplicationSystemTestCase - setup do - @user = sign_in_as(users(:lazaro_nixon)) - end +# class PasswordsTest < ApplicationSystemTestCase +# setup do +# @user = sign_in_as(users(:lazaro_nixon)) +# end - test "updating the password" do - click_on "Change password" +# test "updating the password" do +# click_on "Change password" - fill_in "Current password", with: "Secret1*3*5*" - fill_in "New password", with: "Secret6*4*2*" - fill_in "Confirm new password", with: "Secret6*4*2*" - click_on "Save changes" +# fill_in "Current password", with: "Secret1*3*5*" +# fill_in "New password", with: "Secret6*4*2*" +# fill_in "Confirm new password", with: "Secret6*4*2*" +# click_on "Save changes" - assert_text "Your password has been changed" - end -end +# assert_text "Your password has been changed" +# end +# end diff --git a/test/system/sessions_test.rb b/test/system/sessions_test.rb index 640c6269..28610221 100644 --- a/test/system/sessions_test.rb +++ b/test/system/sessions_test.rb @@ -7,8 +7,8 @@ class SessionsTest < ApplicationSystemTestCase test "visiting the index" do sign_in_as @user + visit sessions_path - click_on "Devices & Sessions" assert_selector "h1", text: "Sessions" end @@ -21,10 +21,10 @@ class SessionsTest < ApplicationSystemTestCase assert_text "Signed in successfully" end - test "signing out" do - sign_in_as @user + # test "signing out" do + # sign_in_as @user - click_on "Log out" - assert_text "That session has been logged out" - end + # click_on "Log out" + # assert_text "That session has been logged out" + # end end diff --git a/test/system/speakers_test.rb b/test/system/speakers_test.rb index eaa9a43c..db7e6b34 100644 --- a/test/system/speakers_test.rb +++ b/test/system/speakers_test.rb @@ -5,30 +5,15 @@ class SpeakersTest < ApplicationSystemTestCase @speaker = speakers(:one) end - test "visiting the index" do - visit speakers_url - assert_selector "h1", text: "Speakers" - end - - test "should create speaker" do - visit speakers_url - click_on "New speaker" - - fill_in "Bio", with: @speaker.bio - fill_in "Github", with: @speaker.github - fill_in "Name", with: @speaker.name - fill_in "Slug", with: @speaker.slug - fill_in "Twitter", with: @speaker.twitter - fill_in "Website", with: @speaker.website - click_on "Create Speaker" - - assert_text "Speaker was successfully created" - click_on "Back" - end + # Contrary to "Talks", there is currently no "Speakers" heading + # test "visiting the index" do + # visit speakers_url + # assert_selector "h1", text: "Speakers" + # end test "should update Speaker" do visit speaker_url(@speaker) - click_on "Edit this speaker", match: :first + click_on "Edit", match: :first fill_in "Bio", with: @speaker.bio fill_in "Github", with: @speaker.github @@ -36,16 +21,8 @@ class SpeakersTest < ApplicationSystemTestCase fill_in "Slug", with: @speaker.slug fill_in "Twitter", with: @speaker.twitter fill_in "Website", with: @speaker.website - click_on "Update Speaker" - - assert_text "Speaker was successfully updated" - click_on "Back" - end - - test "should destroy Speaker" do - visit speaker_url(@speaker) - click_on "Destroy this speaker", match: :first + click_on "Suggest modifications" - assert_text "Speaker was successfully destroyed" + assert_text "Your suggestion was successfully created and will be reviewed soon." end end diff --git a/test/system/talks_test.rb b/test/system/talks_test.rb index 762b1c52..a3ec7822 100644 --- a/test/system/talks_test.rb +++ b/test/system/talks_test.rb @@ -10,38 +10,15 @@ class TalksTest < ApplicationSystemTestCase assert_selector "h1", text: "Talks" end - test "should create talk" do - visit talks_url - click_on "New talk" - - fill_in "Description", with: @talk.description - fill_in "Slug", with: @talk.slug - fill_in "Title", with: @talk.title - fill_in "Year", with: @talk.year - click_on "Create Talk" - - assert_text "Talk was successfully created" - click_on "Back" - end - test "should update Talk" do visit talk_url(@talk) - click_on "Edit this talk", match: :first + click_on "Edit", match: :first fill_in "Description", with: @talk.description - fill_in "Slug", with: @talk.slug fill_in "Title", with: @talk.title fill_in "Year", with: @talk.year - click_on "Update Talk" - - assert_text "Talk was successfully updated" - click_on "Back" - end - - test "should destroy Talk" do - visit talk_url(@talk) - click_on "Destroy this talk", match: :first + click_on "Suggest modifications" - assert_text "Talk was successfully destroyed" + assert_text "Your suggestion was successfully created and will be reviewed soon." end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 7145c1c5..b662247f 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -7,6 +7,8 @@ VCR.configure do |c| c.cassette_library_dir = "test/vcr_cassettes" c.hook_into :webmock + c.ignore_localhost = true + c.ignore_hosts "chromedriver.storage.googleapis.com", "googlechromelabs.github.io", "edgedl.me.gvt1.com" end class ActiveSupport::TestCase # Run tests in parallel with specified workers diff --git a/test/vcr_cassettes/youtube_statistics.yml b/test/vcr_cassettes/youtube_statistics.yml new file mode 100644 index 00000000..ca391e1f --- /dev/null +++ b/test/vcr_cassettes/youtube_statistics.yml @@ -0,0 +1,68 @@ +--- +http_interactions: +- request: + method: get + uri: https://youtube.googleapis.com/youtube/v3/videos?id=9LfmrkyP81M&key=AIzaSyCsHNWxDeHnVOjgX3qg-lUNwcM_E8gUREo&maxResults=50&part=statistics + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=UTF-8 + Vary: + - Origin + - Referer + - X-Origin + Date: + - Mon, 26 Jun 2023 21:12:38 GMT + Server: + - scaffolding on HTTPServer2 + Cache-Control: + - private + X-Xss-Protection: + - '0' + X-Frame-Options: + - SAMEORIGIN + X-Content-Type-Options: + - nosniff + Alt-Svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: | + { + "kind": "youtube#videoListResponse", + "etag": "loxveJrTQG9IDJQjJDNWVptwhwU", + "items": [ + { + "kind": "youtube#video", + "etag": "qKunn-Fuyq9NejK7nyf1n6Au4wg", + "id": "9LfmrkyP81M", + "statistics": { + "viewCount": "113620", + "likeCount": "1948", + "favoriteCount": "0", + "commentCount": "114" + } + } + ], + "pageInfo": { + "totalResults": 1, + "resultsPerPage": 1 + } + } + recorded_at: Mon, 26 Jun 2023 21:12:38 GMT +recorded_with: VCR 6.1.0 diff --git a/test/vcr_cassettes/youtube_statistics_invalid.yml b/test/vcr_cassettes/youtube_statistics_invalid.yml new file mode 100644 index 00000000..9eee1f15 --- /dev/null +++ b/test/vcr_cassettes/youtube_statistics_invalid.yml @@ -0,0 +1,56 @@ +--- +http_interactions: +- request: + method: get + uri: https://youtube.googleapis.com/youtube/v3/videos?id=invalid_video_id&key=AIzaSyCsHNWxDeHnVOjgX3qg-lUNwcM_E8gUREo&maxResults=50&part=statistics + body: + encoding: US-ASCII + string: '' + headers: + Accept-Encoding: + - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 + Accept: + - "*/*" + User-Agent: + - Ruby + response: + status: + code: 200 + message: OK + headers: + Content-Type: + - application/json; charset=UTF-8 + Vary: + - Origin + - Referer + - X-Origin + Date: + - Mon, 26 Jun 2023 21:14:19 GMT + Server: + - scaffolding on HTTPServer2 + Cache-Control: + - private + X-Xss-Protection: + - '0' + X-Frame-Options: + - SAMEORIGIN + X-Content-Type-Options: + - nosniff + Alt-Svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + Transfer-Encoding: + - chunked + body: + encoding: ASCII-8BIT + string: | + { + "kind": "youtube#videoListResponse", + "etag": "YIUPVpqNjppyCWOZfL-19bLb7uk", + "items": [], + "pageInfo": { + "totalResults": 0, + "resultsPerPage": 0 + } + } + recorded_at: Mon, 26 Jun 2023 21:14:18 GMT +recorded_with: VCR 6.1.0 diff --git a/yarn.lock b/yarn.lock index 74b27536..61496780 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,18 @@ resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== +"@babel/runtime@^7.21.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" + integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== + dependencies: + regenerator-runtime "^0.13.11" + +"@domchristie/turn@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@domchristie/turn/-/turn-3.0.0.tgz#e202355dbadbe3efadeb24d158da46540b406d74" + integrity sha512-E+5kTKPHLXUzamxzYi0rTXE8lsAKveOUU8vG68GRqHYt6S0JQI79Z+z5Lky/GNcYzKkAX7yxGPBhImr47WMTAg== + "@esbuild/android-arm64@0.17.18": version "0.17.18" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz#4aa8d8afcffb4458736ca9b32baa97d7cb5861ea" @@ -227,6 +239,38 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" + integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.5.2" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.43.0": + version "8.43.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0" + integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg== + "@hotwired/stimulus@^3.2.1": version "3.2.1" resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.1.tgz#e3de23623b0c52c247aba4cd5d530d257008676b" @@ -245,6 +289,25 @@ resolved "https://registry.yarnpkg.com/@hotwired/turbo/-/turbo-7.3.0.tgz#2226000fff1aabda9fd9587474565c9929dbf15d" integrity sha512-Dcu+NaSvHLT7EjrDrkEmH4qET2ZJZ5IcCWmNXxNQTBwlnE5tBZfN6WxZ842n5cHV52DH/AKNirbPBtcEXDLW4g== +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" @@ -282,6 +345,11 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@kurkle/color@^0.3.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" + integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -295,7 +363,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -315,10 +383,42 @@ dependencies: mini-svg-data-uri "^1.2.3" -"@tailwindcss/line-clamp@^0.4.4": - version "0.4.4" - resolved "https://registry.yarnpkg.com/@tailwindcss/line-clamp/-/line-clamp-0.4.4.tgz#767cf8e5d528a5d90c9740ca66eb079f5e87d423" - integrity sha512-5U6SY5z8N42VtrCrKlsTAA35gy2VSyYtHWCsg1H87NU1SXnEfekTVlrga9fzUDrrHcGi2Lb5KenUWb4lRQT5/g== +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.8.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.9.0.tgz#78a16e3b2bcc198c10822786fa6679e245db5b59" + integrity sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ== + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" any-promise@^1.0.0: version "1.3.0" @@ -338,6 +438,61 @@ arg@^5.0.2: resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + autoprefixer@^10.4.14: version "10.4.14" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" @@ -350,6 +505,11 @@ autoprefixer@^10.4.14: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -385,6 +545,26 @@ browserslist@^4.21.5: node-releases "^2.0.8" update-browserslist-db "^1.0.10" +builtins@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase-css@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" @@ -395,6 +575,35 @@ caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz#56a08885228edf62cbe1ac8980f2b5dae159997e" integrity sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg== +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chart.js@4, chart.js@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.3.0.tgz#ac363030ab3fec572850d2d872956f32a46326a1" + integrity sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g== + dependencies: + "@kurkle/color" "^0.3.0" + +chartjs-adapter-date-fns@>=3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chartjs-adapter-date-fns/-/chartjs-adapter-date-fns-3.0.0.tgz#c25f63c7f317c1f96f9a7c44bd45eeedb8a478e5" + integrity sha512-Rs3iEB3Q5pJ973J93OBTpnP7qoGwvq3nUnoMdtxO+9aoJof7UFcRbWcIDteXuYd1fgAvct/32T9qaLyLuZVwCg== + +chartkick@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/chartkick/-/chartkick-5.0.1.tgz#f557ff8560f974343dc65c7fc34ce1e8326d8ee7" + integrity sha512-4F3tWI3eBQgnjCYZIZ+fHOaJuNyxeyhDE2Tm+voOWB19hDjSJceys/spzN52DOn8bWepNESGXvPVTGU1jeFsbA== + optionalDependencies: + chart.js "4" + chartjs-adapter-date-fns ">=3" + date-fns ">=2" + chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -410,6 +619,18 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -420,18 +641,54 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -debug@^4.3, debug@^4.3.4: +date-fns@>=2: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1, debug@^4.3, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -442,11 +699,97 @@ dlv@^1.1.3: resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + electron-to-chromium@^1.4.284: version "1.4.390" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.390.tgz#84fa525ef2779a5bdb5ade59866eef4da87c1009" integrity sha512-9h6KDGTynRfpM16U40uLSCxRO3diIKcXXI0mPChKls7sfkxOlCH1sgSJ14Rb00BFomQNHY/p67gaZSu5Mu8j6w== +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + esbuild@^0.17.18: version "0.17.18" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.18.tgz#f4f8eb6d77384d68cd71c53eb6601c7efe05e746" @@ -508,6 +851,226 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-standard-jsx@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz#70852d395731a96704a592be5b0bfaccfeded239" + integrity sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ== + +eslint-config-standard@17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" + integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== + +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-es@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" + integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== + dependencies: + eslint-utils "^2.0.0" + regexpp "^3.0.0" + +eslint-plugin-import@^2.27.5: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-n@^15.7.0: + version "15.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz#e29221d8f5174f84d18f2eb94765f2eeea033b90" + integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q== + dependencies: + builtins "^5.0.1" + eslint-plugin-es "^4.1.0" + eslint-utils "^3.0.0" + ignore "^5.1.1" + is-core-module "^2.11.0" + minimatch "^3.1.2" + resolve "^1.22.1" + semver "^7.3.8" + +eslint-plugin-promise@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz#269a3e2772f62875661220631bd4dafcb4083816" + integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig== + +eslint-plugin-react@^7.32.2: + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.0.tgz#f21ebdafda02352f103634b96dd47d9f81ca117b" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint@^8.41.0: + version "8.43.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.43.0.tgz#3e8c6066a57097adfd9d390b8fc93075f257a094" + integrity sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.0.3" + "@eslint/js" "8.43.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.5.2" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.5.2: + version "9.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" + integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + fast-glob@^3.2.12: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -519,6 +1082,16 @@ fast-glob@^3.2.12: merge2 "^1.3.0" micromatch "^4.0.4" +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -526,6 +1099,13 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -533,6 +1113,41 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + fraction.js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" @@ -553,6 +1168,44 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -579,6 +1232,83 @@ glob@7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.15: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -586,6 +1316,24 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +ignore@^5.1.1, ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -599,6 +1347,36 @@ inherits@2: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +internal-slot@^1.0.3, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -606,6 +1384,19 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-core-module@^2.11.0: version "2.12.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" @@ -613,28 +1404,161 @@ is-core-module@^2.11.0: dependencies: has "^1.0.3" +is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + jiti@^1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + dependencies: + array-includes "^3.1.5" + object.assign "^4.1.3" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + lilconfig@^2.0.5, lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -645,6 +1569,51 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +load-json-file@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" + integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== + dependencies: + graceful-fs "^4.1.15" + parse-json "^4.0.0" + pify "^4.0.1" + strip-bom "^3.0.0" + type-fest "^0.3.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -663,13 +1632,18 @@ mini-svg-data-uri@^1.2.3: resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== -minimatch@^3.0.4: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + morphdom@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/morphdom/-/morphdom-2.7.0.tgz#9ef0c4bc15ac8725df398d127c6984f62e7f89e8" @@ -680,6 +1654,11 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -694,6 +1673,11 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + node-releases@^2.0.8: version "2.0.10" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" @@ -709,7 +1693,7 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -object-assign@^4.0.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -719,6 +1703,61 @@ object-hash@^3.0.0: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.3, object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -726,11 +1765,86 @@ once@^1.3.0: dependencies: wrappy "1" +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -751,11 +1865,24 @@ pify@^2.3.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pirates@^4.0.1: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== +pkg-conf@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" + integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== + dependencies: + find-up "^3.0.0" + load-json-file "^5.2.0" + postcss-import@^15.1.0: version "15.1.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" @@ -809,11 +1936,45 @@ postcss@^8.4.23: picocolors "^1.0.0" source-map-js "^1.0.2" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-plugin-tailwindcss@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.3.0.tgz#8299b307c7f6467f52732265579ed9375be6c818" + integrity sha512-009/Xqdy7UmkcTBpwlq7jsViDqXAYSOMLDrHAdTMlVZOrKfM2o9Ci7EMWTMZ7SkKBFTG04UM9F9iM2+4i6boDA== + +prettier@^2.8.8: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -828,7 +1989,31 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -resolve@^1.1.7, resolve@^1.22.2: +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regexp.prototype.flags@^1.4.3: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpp@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.1.7, resolve@^1.22.1, resolve@^1.22.2: version "1.22.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== @@ -837,11 +2022,27 @@ resolve@^1.1.7, resolve@^1.22.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rollup@^3.21.0: version "3.24.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.24.1.tgz#7ed67b778fb90a6f5e32e64510af9e28b03e47a8" @@ -856,11 +2057,78 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.0.0, semver@^7.3.8: + version "7.5.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.2.tgz#5b851e66d1be07c1cdaf37dfc856f543325a2beb" + integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ== + dependencies: + lru-cache "^6.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +standard-engine@^15.0.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-15.1.0.tgz#717409a002edd13cd57f6554fdd3464d9a22a774" + integrity sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw== + dependencies: + get-stdin "^8.0.0" + minimist "^1.2.6" + pkg-conf "^3.1.0" + xdg-basedir "^4.0.0" + +standard@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/standard/-/standard-17.1.0.tgz#829eeeb3139ad50714294d3531592d60ad1286af" + integrity sha512-jaDqlNSzLtWYW4lvQmU0EnxWMUGQiwHasZl5ZEIwx3S/ijZDjZOzs1y1QqKwKs5vqnFpGtizo4NOYX2s0Voq/g== + dependencies: + eslint "^8.41.0" + eslint-config-standard "17.1.0" + eslint-config-standard-jsx "^11.0.0" + eslint-plugin-import "^2.27.5" + eslint-plugin-n "^15.7.0" + eslint-plugin-promise "^6.1.1" + eslint-plugin-react "^7.32.2" + standard-engine "^15.0.0" + version-guard "^1.1.1" + stimulus-use@^0.52.0: version "0.52.0" resolved "https://registry.yarnpkg.com/stimulus-use/-/stimulus-use-0.52.0.tgz#a52df4e2b59f3273fc6941f98fa173f0892d4e9d" @@ -871,6 +2139,64 @@ stimulus-vite-helpers@^3.0.0, stimulus-vite-helpers@^3.0.1: resolved "https://registry.yarnpkg.com/stimulus-vite-helpers/-/stimulus-vite-helpers-3.0.1.tgz#930a3c88b01e0754d43e5250ed66f09e5ad242c8" integrity sha512-v8vii8wTyzbH5REE3Z6DbtKqnXEuEQ3ylYs4jQRmLAQrH9vlii7p98MG8gIii1anEEPmnBB1JWWvxKXGZh7apQ== +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + sucrase@^3.32.0: version "3.32.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.32.0.tgz#c4a95e0f1e18b6847127258a75cf360bc568d4a7" @@ -884,6 +2210,13 @@ sucrase@^3.32.0: pirates "^4.0.1" ts-interface-checker "^0.1.9" +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -918,6 +2251,11 @@ tailwindcss@^3.3.2: resolve "^1.22.2" sucrase "^3.32.0" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" @@ -944,6 +2282,52 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + update-browserslist-db@^1.0.10: version "1.0.11" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" @@ -952,6 +2336,13 @@ update-browserslist-db@^1.0.10: escalade "^3.1.1" picocolors "^1.0.0" +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -962,6 +2353,11 @@ validate-target@^2.0.0: resolved "https://registry.yarnpkg.com/validate-target/-/validate-target-2.0.0.tgz#b8fb4f8ccbed9503e8316d9f5d419daec82efab6" integrity sha512-ELRDv4dNxEPrwavvk8OSNtyvUYZVqKIo9c3deHBxf8YhnNJMN9qtZJkW1sRCqI7gMElHWjy/AaIyJq/DdsKN2Q== +version-guard@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/version-guard/-/version-guard-1.1.1.tgz#7a6e87a1babff1b43d6a7b0fd239731e278262fa" + integrity sha512-MGQLX89UxmYHgDvcXyjBI0cbmoW+t/dANDppNPrno64rYr8nH4SHSuElQuSYdXGEs0mUzdQe1BY+FhVPNsAmJQ== + vite-plugin-full-reload@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/vite-plugin-full-reload/-/vite-plugin-full-reload-1.0.5.tgz#6cddfa94e51909843bc7156ab728dbac972b8560" @@ -1004,12 +2400,62 @@ vlitejs@^5.0.2: dependencies: validate-target "^2.0.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^2.1.1: version "2.2.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.2.tgz#ec551ef37326e6d42872dad1970300f8eb83a073" integrity sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==