From 3933edac432a45d19907a1bb77a205a03e01c8db Mon Sep 17 00:00:00 2001 From: Garrett Bowman Date: Thu, 12 Sep 2024 02:30:26 -0500 Subject: [PATCH 1/8] WIP: 2am forgot to make commits --- .gitignore | 2 ++ app/controllers/api/v1/artist_controller.rb | 20 ++++++++++++++++++ app/facades/artist_facade.rb | 8 +++++++ app/models/artist.rb | 7 +++++++ app/models/user.rb | 2 ++ app/models/user_artist.rb | 7 +++++++ app/poros/artist.rb | 8 +++++++ app/serializers/artist_serializer.rb | 4 ++++ app/services/artist_service.rb | 13 ++++++++++++ db/migrate/20240912070735_create_artists.rb | 12 +++++++++++ .../20240912070736_create_user_artists.rb | 16 ++++++++++++++ db/schema.rb | 21 ++++++++++++++++++- spec/factories/artist.rb | 6 ++++++ spec/factories/users.rb | 0 spec/rails_helper.rb | 3 +++ 15 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 app/controllers/api/v1/artist_controller.rb create mode 100644 app/facades/artist_facade.rb create mode 100644 app/models/artist.rb create mode 100644 app/models/user_artist.rb create mode 100644 app/poros/artist.rb create mode 100644 app/serializers/artist_serializer.rb create mode 100644 app/services/artist_service.rb create mode 100644 db/migrate/20240912070735_create_artists.rb create mode 100644 db/migrate/20240912070736_create_user_artists.rb create mode 100644 spec/factories/artist.rb create mode 100644 spec/factories/users.rb diff --git a/.gitignore b/.gitignore index 7e6b54f..72c2e25 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ # Ignore master key for decrypting credentials and more. /config/master.key + +coverage diff --git a/app/controllers/api/v1/artist_controller.rb b/app/controllers/api/v1/artist_controller.rb new file mode 100644 index 0000000..fd9a689 --- /dev/null +++ b/app/controllers/api/v1/artist_controller.rb @@ -0,0 +1,20 @@ +class ArtistController < ApplicationController + def index + artists = ArtistFacade.all_artists + render json: ArtistSerializer.new(artists) + end + + def create + user = User.find(params[:user_id]) + artist = Artist.find_or_create_by(name: params[:name], musicbrainz_id: params[:musicbrainz_id]) + user.artists << artist unless user.artists.include?(artist) + render json: user.artists + end + + def destroy + user = User.find(params[:user_id]) + artist = user.artists.find(params[:id]) + user.artists.delete(artist) + render json: user.artists + end +end \ No newline at end of file diff --git a/app/facades/artist_facade.rb b/app/facades/artist_facade.rb new file mode 100644 index 0000000..ddd254f --- /dev/null +++ b/app/facades/artist_facade.rb @@ -0,0 +1,8 @@ +class ArtistFacade + def self.all_artists + artists = ArtistService.get_all_arrtists + artists.map do |artist| + Artist.new(artist) + end + end +end \ No newline at end of file diff --git a/app/models/artist.rb b/app/models/artist.rb new file mode 100644 index 0000000..6180c10 --- /dev/null +++ b/app/models/artist.rb @@ -0,0 +1,7 @@ +class Artist < ApplicationRecord + has_many :user_artists, dependent: :destroy + has_many :users, through: :user_artists + + validates :name, presence: true + validates :musicbrainz_id, presence: true, uniqueness: true +end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index d00d5d3..b7a8400 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,6 +1,8 @@ class User < ApplicationRecord has_many :user_events has_many :events, through: :user_events + has_many :user_artists, dependent: :destroy + has_many :artists, through: :user_artists validates :name, presence: true validates :email, presence: true diff --git a/app/models/user_artist.rb b/app/models/user_artist.rb new file mode 100644 index 0000000..b28286f --- /dev/null +++ b/app/models/user_artist.rb @@ -0,0 +1,7 @@ +class UserArtist < ApplicationRecord + belongs_to :user + belongs_to :artist + + validates :user_id, presence: true + validates :artist_id, presence: true +end \ No newline at end of file diff --git a/app/poros/artist.rb b/app/poros/artist.rb new file mode 100644 index 0000000..40af636 --- /dev/null +++ b/app/poros/artist.rb @@ -0,0 +1,8 @@ +class Artist + attr_reader :name, :musicbrainz_id + + def initialize(data) + @name = data[:name] + @musicbrainz_id = data[:musicbrainz_id] + end +end \ No newline at end of file diff --git a/app/serializers/artist_serializer.rb b/app/serializers/artist_serializer.rb new file mode 100644 index 0000000..ac5f2cc --- /dev/null +++ b/app/serializers/artist_serializer.rb @@ -0,0 +1,4 @@ +class ArtistSerializer + include JSONAPI::Serializer + attributes :name, :musicbrainz_id +end \ No newline at end of file diff --git a/app/services/artist_service.rb b/app/services/artist_service.rb new file mode 100644 index 0000000..6d41fa4 --- /dev/null +++ b/app/services/artist_service.rb @@ -0,0 +1,13 @@ +class ArtistService + def self.get_conn + Faraday.new(url: 'https://musicbrainz.org/ws/2') do |faraday| + faraday.headers['Content-Type'] = 'application/json' + faraday.adapter Faraday.default_adapter + end + end + + def self.get_all_artists + response = get_conn.get('/artist', { query: 'artist:*' }, fmt: 'json') + JSON.parse(response.body, symbolize_names: true) + end +end \ No newline at end of file diff --git a/db/migrate/20240912070735_create_artists.rb b/db/migrate/20240912070735_create_artists.rb new file mode 100644 index 0000000..ce3f4eb --- /dev/null +++ b/db/migrate/20240912070735_create_artists.rb @@ -0,0 +1,12 @@ +class CreateArtists < ActiveRecord::Migration[6.0] + def change + create_table :artists do |t| + t.string :name, null: false + t.string :musicbrainz_id, null: false, unique: true + + t.timestamps + end + + add_index :artists, :musicbrainz_id, unique: true + end +end diff --git a/db/migrate/20240912070736_create_user_artists.rb b/db/migrate/20240912070736_create_user_artists.rb new file mode 100644 index 0000000..3b342b3 --- /dev/null +++ b/db/migrate/20240912070736_create_user_artists.rb @@ -0,0 +1,16 @@ +class CreateUserArtists < ActiveRecord::Migration[6.0] + def change + create_table :user_artists do |t| + t.bigint :user_id, null: false + t.bigint :artist_id, null: false + t.datetime :created_at, null: false + t.datetime :updated_at, null: false + + t.index :user_id, name: "index_user_artists_on_user_id" + t.index :artist_id, name: "index_user_artists_on_artist_id" + end + + add_foreign_key :user_artists, :users + add_foreign_key :user_artists, :artists + end +end \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index b4b78fb..0b813c5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,10 +10,18 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_09_11_203732) do +ActiveRecord::Schema[7.1].define(version: 2024_09_12_070736) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" + create_table "artists", force: :cascade do |t| + t.string "name", null: false + t.string "musicbrainz_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["musicbrainz_id"], name: "index_artists_on_musicbrainz_id", unique: true + end + create_table "events", force: :cascade do |t| t.string "venue_name" t.string "event_name" @@ -24,6 +32,15 @@ t.datetime "updated_at", null: false end + create_table "user_artists", force: :cascade do |t| + t.bigint "user_id", null: false + t.bigint "artist_id", null: false + t.datetime "created_at", precision: nil, null: false + t.datetime "updated_at", precision: nil, null: false + t.index ["artist_id"], name: "index_user_artists_on_artist_id" + t.index ["user_id"], name: "index_user_artists_on_user_id" + end + create_table "user_events", force: :cascade do |t| t.boolean "host" t.bigint "user_id", null: false @@ -41,6 +58,8 @@ t.datetime "updated_at", null: false end + add_foreign_key "user_artists", "artists" + add_foreign_key "user_artists", "users" add_foreign_key "user_events", "events" add_foreign_key "user_events", "users" end diff --git a/spec/factories/artist.rb b/spec/factories/artist.rb new file mode 100644 index 0000000..db97db0 --- /dev/null +++ b/spec/factories/artist.rb @@ -0,0 +1,6 @@ +FactoryBot.define do + factory :artist do + name { Faker::Music.band } + musicbrainz_id { SecureRandom.uuid } + end +end \ No newline at end of file diff --git a/spec/factories/users.rb b/spec/factories/users.rb new file mode 100644 index 0000000..e69de29 diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index 528b850..ec5088c 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -77,5 +77,8 @@ config.default_cassette_options = { re_record_interval: 7.days } config.configure_rspec_metadata! end + + require 'webmock/rspec' + WebMock.disable_net_connect!(allow_localhost: true) end From 2df1d30bb91338805fe8ca3d500b0ad66bab4fd7 Mon Sep 17 00:00:00 2001 From: Garrett Bowman Date: Thu, 12 Sep 2024 02:52:25 -0500 Subject: [PATCH 2/8] WIP: Misunderstood MB Docs --- app/controllers/api/v1/artist_controller.rb | 9 +++++++-- app/facades/artist_facade.rb | 8 ++++---- app/services/artist_service.rb | 6 +++--- config/routes.rb | 1 + spec/factories/users.rb | 6 ++++++ spec/requests/api/v1/artist_request_spec.rb | 10 ++++++++++ 6 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 spec/requests/api/v1/artist_request_spec.rb diff --git a/app/controllers/api/v1/artist_controller.rb b/app/controllers/api/v1/artist_controller.rb index fd9a689..1b96a08 100644 --- a/app/controllers/api/v1/artist_controller.rb +++ b/app/controllers/api/v1/artist_controller.rb @@ -1,7 +1,12 @@ class ArtistController < ApplicationController def index - artists = ArtistFacade.all_artists - render json: ArtistSerializer.new(artists) + if params[:name] + artists = ArtistFacade.search_artists(params[:name]) + render json: ArtistSerializer.new(artists) + else + error = ErrorSerializer.new(StandardError.new('Name parameter is required')) + render json: error.serialize_json, status: :bad_request + end end def create diff --git a/app/facades/artist_facade.rb b/app/facades/artist_facade.rb index ddd254f..c7613ac 100644 --- a/app/facades/artist_facade.rb +++ b/app/facades/artist_facade.rb @@ -1,8 +1,8 @@ class ArtistFacade - def self.all_artists - artists = ArtistService.get_all_arrtists - artists.map do |artist| - Artist.new(artist) + def self.search_artists(name) + artists_data = ArtistService.search_artists_by_name(name) + artists_data.map do |artist_data| + ArtistPoro.new(artist_data) end end end \ No newline at end of file diff --git a/app/services/artist_service.rb b/app/services/artist_service.rb index 6d41fa4..5d99db4 100644 --- a/app/services/artist_service.rb +++ b/app/services/artist_service.rb @@ -6,8 +6,8 @@ def self.get_conn end end - def self.get_all_artists - response = get_conn.get('/artist', { query: 'artist:*' }, fmt: 'json') - JSON.parse(response.body, symbolize_names: true) + def self.get_artist_by_name(name) + response = get_conn.get('/artist', { query: "artist:#{name}", fmt: 'json' }) + JSON.parse(response.body, symbolize_names: true)[:artists] end end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index abfd131..a3367e6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,7 @@ resources :events, only: [:show, :create, :update, :destroy] resources :users, only: [:show, :create, :update, :destroy] resources :user_events, only: [:show, :create, :update, :destroy] + resources :artists, only: [:index, :create, :destroy] end end end diff --git a/spec/factories/users.rb b/spec/factories/users.rb index e69de29..5507d59 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -0,0 +1,6 @@ +FactoryBot.define do + factory :user do + name { Faker::Name.name } + email { Faker::Internet.email } + end +end \ No newline at end of file diff --git a/spec/requests/api/v1/artist_request_spec.rb b/spec/requests/api/v1/artist_request_spec.rb new file mode 100644 index 0000000..95f3157 --- /dev/null +++ b/spec/requests/api/v1/artist_request_spec.rb @@ -0,0 +1,10 @@ +require "rails_helper" + +RSpec.describe "Api::V1::Artists", type: :request do + describe "GET /api/v1/artists" do + it "returns all artists" do + get "/api/v1/artists" + expect(response).to have_http_status(200) + end + end +end \ No newline at end of file From 44643092d200d70ea70bd84ded7191d2d4c325ab Mon Sep 17 00:00:00 2001 From: Garrett Bowman Date: Thu, 12 Sep 2024 03:15:24 -0500 Subject: [PATCH 3/8] WIP: Moved to Branch --- app/controllers/api/v1/artist_controller.rb | 2 +- coverage/.resultset.json | 82 +- coverage/index.html | 904 ++------------ spec/fixtures/artist_search.json | 1224 +++++++++++++++++++ spec/requests/api/v1/artist_request_spec.rb | 17 +- 5 files changed, 1377 insertions(+), 852 deletions(-) create mode 100644 spec/fixtures/artist_search.json diff --git a/app/controllers/api/v1/artist_controller.rb b/app/controllers/api/v1/artist_controller.rb index 1b96a08..214e77b 100644 --- a/app/controllers/api/v1/artist_controller.rb +++ b/app/controllers/api/v1/artist_controller.rb @@ -1,4 +1,4 @@ -class ArtistController < ApplicationController +class Api::V1::ArtistController < ApplicationController def index if params[:name] artists = ArtistFacade.search_artists(params[:name]) diff --git a/coverage/.resultset.json b/coverage/.resultset.json index daf3d1f..a2db904 100644 --- a/coverage/.resultset.json +++ b/coverage/.resultset.json @@ -1,7 +1,7 @@ { "RSpec": { "coverage": { - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/config/environment.rb": { + "/Users/gbowman/turing_mod_4/rails_be/config/environment.rb": { "lines": [ null, 1, @@ -10,7 +10,7 @@ 1 ] }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/config/application.rb": { + "/Users/gbowman/turing_mod_4/rails_be/config/application.rb": { "lines": [ 1, null, @@ -58,7 +58,7 @@ null ] }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/config/boot.rb": { + "/Users/gbowman/turing_mod_4/rails_be/config/boot.rb": { "lines": [ 1, null, @@ -66,7 +66,7 @@ 1 ] }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/config/environments/test.rb": { + "/Users/gbowman/turing_mod_4/rails_be/config/environments/test.rb": { "lines": [ 1, null, @@ -134,7 +134,7 @@ null ] }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/config/initializers/cors.rb": { + "/Users/gbowman/turing_mod_4/rails_be/config/initializers/cors.rb": { "lines": [ null, null, @@ -154,7 +154,7 @@ null ] }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/config/initializers/filter_parameter_logging.rb": { + "/Users/gbowman/turing_mod_4/rails_be/config/initializers/filter_parameter_logging.rb": { "lines": [ null, null, @@ -166,7 +166,7 @@ null ] }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/config/initializers/inflections.rb": { + "/Users/gbowman/turing_mod_4/rails_be/config/initializers/inflections.rb": { "lines": [ null, null, @@ -186,33 +186,18 @@ null ] }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/config/routes.rb": { + "/Users/gbowman/turing_mod_4/rails_be/spec/factories/artist.rb": { "lines": [ 1, - null, - null, - null, - null, - 1, - null, - null, - null, - null, - null, 1, 1, 1, null, - null, null ] }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/app/models/event.rb": { + "/Users/gbowman/turing_mod_4/rails_be/spec/factories/users.rb": { "lines": [ - 1, - 1, - 1, - null, 1, 1, 1, @@ -221,74 +206,29 @@ null ] }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/app/models/application_record.rb": { - "lines": [ - 1, - 1, - null - ] - }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/spec/models/user_event_spec.rb": { + "/Users/gbowman/turing_mod_4/rails_be/config/routes.rb": { "lines": [ 1, null, - 1, - 1, - 2, - 2, null, null, - 1, - 2, - 2, null, - null - ] - }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/app/models/user_event.rb": { - "lines": [ 1, null, - 1, - 1, - 1, null, - 1, - 1, - 1, - null - ] - }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/spec/models/user_spec.rb": { - "lines": [ - 1, null, 1, 1, - 2, - 2, - null, - null, 1, - 2, - 2, - null, - null - ] - }, - "/Users/rodrigochavez/turing_work/4mod/capstone/rails_be/app/models/user.rb": { - "lines": [ 1, 1, 1, null, - 1, - 1, null, null ] } }, - "timestamp": 1726100681 + "timestamp": 1726128719 } } diff --git a/coverage/index.html b/coverage/index.html index faa7c5f..20115bc 100644 --- a/coverage/index.html +++ b/coverage/index.html @@ -14,7 +14,7 @@ loading
-
Generated 2024-09-11T18:24:42-06:00
+
Generated 2024-09-12T03:11:59-05:00
    @@ -29,8 +29,8 @@

    covered at - - 1.1 + + 1.0 hits/line ) @@ -39,12 +39,12 @@

    - 14 files in total. + 10 files in total.
    - 84 relevant lines, - 84 lines covered and + 58 relevant lines, + 58 lines covered and 0 lines missed. ( 100.0% @@ -71,51 +71,7 @@

    - app/models/application_record.rb - 100.00 % - 3 - 2 - 2 - 0 - 1.00 - - - - - app/models/event.rb - 100.00 % - 10 - 7 - 7 - 0 - 1.00 - - - - - app/models/user.rb - 100.00 % - 8 - 5 - 5 - 0 - 1.00 - - - - - app/models/user_event.rb - 100.00 % - 10 - 7 - 7 - 0 - 1.00 - - - - - config/application.rb + config/application.rb 100.00 % 44 18 @@ -126,7 +82,7 @@

    - config/boot.rb + config/boot.rb 100.00 % 4 3 @@ -137,7 +93,7 @@

    - config/environment.rb + config/environment.rb 100.00 % 5 2 @@ -148,7 +104,7 @@

    - config/environments/test.rb + config/environments/test.rb 100.00 % 64 18 @@ -159,7 +115,7 @@

    - config/initializers/cors.rb + config/initializers/cors.rb 100.00 % 16 0 @@ -170,543 +126,78 @@

    - config/initializers/filter_parameter_logging.rb + config/initializers/filter_parameter_logging.rb 100.00 % 8 1 1 - 0 - 1.00 - - - - - config/initializers/inflections.rb - 100.00 % - 16 - 0 - 0 - 0 - 0.00 - - - - - config/routes.rb - 100.00 % - 17 - 5 - 5 - 0 - 1.00 - - - - - spec/models/user_event_spec.rb - 100.00 % - 13 - 8 - 8 - 0 - 1.50 - - - - - spec/models/user_spec.rb - 100.00 % - 13 - 8 - 8 - 0 - 1.50 - - - - - -

    -

    - - - -
    - - - -
    - -
    -
    -

    app/models/application_record.rb

    -

    - - 100.0% - - - lines covered -

    - - - -
    - 2 relevant lines. - 2 lines covered and - 0 lines missed. -
    - - - -
    - -
    -    
      - -
      -
    1. - 1 - - - - - class ApplicationRecord < ActiveRecord::Base -
    2. -
      - -
      -
    3. - 1 - - - - - primary_abstract_class -
    4. -
      - -
      -
    5. - - - - - - end -
    6. -
      - -
    -
    -
    - - -
    -
    -

    app/models/event.rb

    -

    - - 100.0% - - - lines covered -

    - - - -
    - 7 relevant lines. - 7 lines covered and - 0 lines missed. -
    - - - -
    - -
    -    
      - -
      -
    1. - 1 - - - - - class Event < ApplicationRecord -
    2. -
      - -
      -
    3. - 1 - - - - - has_many :user_events -
    4. -
      - -
      -
    5. - 1 - - - - - has_many :users, through: :user_events -
    6. -
      - -
      -
    7. - - - - - - -
    8. -
      - -
      -
    9. - 1 - - - - - validates :venue_name, presence: true -
    10. -
      - -
      -
    11. - 1 - - - - - validates :date_time, presence: true -
    12. -
      - -
      -
    13. - 1 - - - - - validates :artist, presence: true -
    14. -
      - -
      -
    15. - 1 - - - - - validates :location, presence: true -
    16. -
      - -
      -
    17. - - - - - - -
    18. -
      - -
      -
    19. - - - - - - end -
    20. -
      - -
    -
    -
    - - -
    -
    -

    app/models/user.rb

    -

    - - 100.0% - - - lines covered -

    - - - -
    - 5 relevant lines. - 5 lines covered and - 0 lines missed. -
    - - - -
    - -
    -    
      - -
      -
    1. - 1 - - - - - class User < ApplicationRecord -
    2. -
      - -
      -
    3. - 1 - - - - - has_many :user_events -
    4. -
      - -
      -
    5. - 1 - - - - - has_many :events, through: :user_events -
    6. -
      - -
      -
    7. - - - - - - -
    8. -
      - -
      -
    9. - 1 - - - - - validates :name, presence: true -
    10. -
      - -
      -
    11. - 1 - - - - - validates :email, presence: true -
    12. -
      - -
      -
    13. - - - - - - -
    14. -
      - -
      -
    15. - - - - - - end -
    16. -
      - -
    -
    -
    - - -
    -
    -

    app/models/user_event.rb

    -

    - - 100.0% - - - lines covered -

    - - - -
    - 7 relevant lines. - 7 lines covered and - 0 lines missed. -
    - - - -
    - -
    -    
      - -
      -
    1. - 1 - - - - - require "rails_helper" -
    2. -
      - -
      -
    3. - - - - - - -
    4. -
      - -
      -
    5. - 1 - - - - - class UserEvent < ApplicationRecord -
    6. -
      - -
      -
    7. - 1 - - - - - belongs_to :user -
    8. -
      - -
      -
    9. - 1 - - - - - belongs_to :event -
    10. -
      - -
      -
    11. - - - - - - -
    12. -
      - -
      -
    13. - 1 - - - - - validates :host, inclusion: { in: [true, false] } -
    14. -
      - -
      -
    15. - 1 - - + 0 + 1.00 - - validates :user_id, presence: true -
    16. -
      - -
      -
    17. - 1 + + + + config/initializers/inflections.rb + 100.00 % + 16 + 0 + 0 + 0 + 0.00 - + + + + config/routes.rb + 100.00 % + 18 + 8 + 8 + 0 + 1.00 - - validates :event_id, presence: true -
    18. -
      - -
      -
    19. + + + + spec/factories/artist.rb + 100.00 % + 6 + 4 + 4 + 0 + 1.00 + + + + spec/factories/users.rb + 100.00 % + 6 + 4 + 4 + 0 + 1.00 + + + + +
    20. +
    - - end - -
    - - - - + + + + +
    -
    +

    config/application.rb

    @@ -1221,7 +712,7 @@

    -
    +

    config/boot.rb

    @@ -1296,7 +787,7 @@

    -
    +

    config/environment.rb

    @@ -1382,7 +873,7 @@

    -
    +

    config/environments/test.rb

    @@ -2117,7 +1608,7 @@

    -
    +

    config/initializers/cors.rb

    @@ -2324,7 +1815,7 @@

    -
    +

    config/initializers/filter_parameter_logging.rb

    @@ -2443,7 +1934,7 @@

    -
    +

    config/initializers/inflections.rb

    @@ -2650,7 +2141,7 @@

    -
    +

    config/routes.rb

    @@ -2664,8 +2155,8 @@

    - 5 relevant lines. - 5 lines covered and + 8 relevant lines. + 8 lines covered and 0 lines missed.
    @@ -2776,24 +2267,24 @@

    -
  • - +
  • + 1 - + namespace :api do
  • -
  • - +
  • + 1 - + namespace :v1 do
  • @@ -2804,7 +2295,7 @@

    - namespace :api do + resources :events, only: [:show, :create, :update, :destroy]

    @@ -2815,7 +2306,7 @@

    - namespace :v1 do + resources :users, only: [:show, :create, :update, :destroy]

    @@ -2826,12 +2317,23 @@

    - resources :events, only: [:show, :create, :update, :destroy] + resources :user_events, only: [:show, :create, :update, :destroy]

    -
  • +
  • + 1 + + + + + resources :artists, only: [:index, :create, :destroy] +
  • +
    + +
    +
  • @@ -2842,7 +2344,7 @@

  • -
  • +
  • @@ -2853,7 +2355,7 @@

  • -
  • +
  • @@ -2868,9 +2370,9 @@

  • -
    +
    -

    spec/models/user_event_spec.rb

    +

    spec/factories/artist.rb

    100.0% @@ -2882,8 +2384,8 @@

    - 8 relevant lines. - 8 lines covered and + 4 relevant lines. + 4 lines covered and 0 lines missed.
    @@ -2901,18 +2403,18 @@

    - require "rails_helper" + FactoryBot.define do

    -
  • - +
  • + 1 - + factory :artist do
  • @@ -2923,7 +2425,7 @@

    - RSpec.describe UserEvent, type: :model do + name { Faker::Music.band }

    @@ -2934,89 +2436,12 @@

    - describe "validations" do - -

    - -
    -
  • - 2 - - - - - it { should validate_presence_of(:user_id) } -
  • -
    - -
    -
  • - 2 - - - - - it { should validate_presence_of(:event_id) } -
  • -
    - -
    -
  • - - - - - - end -
  • -
    - -
    -
  • - - - - - - -
  • -
    - -
    -
  • - 1 - - - - - describe "associations" do -
  • -
    - -
    -
  • - 2 - - - - - it { should belong_to(:user) } -
  • -
    - -
    -
  • - 2 - - - - - it { should belong_to(:event) } + musicbrainz_id { SecureRandom.uuid }
  • -
  • +
  • @@ -3027,7 +2452,7 @@

  • -
  • +
  • @@ -3042,9 +2467,9 @@

  • -
    +
    -

    spec/models/user_spec.rb

    +

    spec/factories/users.rb

    100.0% @@ -3056,8 +2481,8 @@

    - 8 relevant lines. - 8 lines covered and + 4 relevant lines. + 4 lines covered and 0 lines missed.
    @@ -3075,18 +2500,18 @@

    - require 'rails_helper' + FactoryBot.define do

    -
  • - +
  • + 1 - + factory :user do
  • @@ -3097,7 +2522,7 @@

    - RSpec.describe User, type: :model do + name { Faker::Name.name }

    @@ -3108,89 +2533,12 @@

    - describe 'validations' do - -

    - -
    -
  • - 2 - - - - - it { should validate_presence_of(:name) } -
  • -
    - -
    -
  • - 2 - - - - - it { should validate_presence_of(:email) } -
  • -
    - -
    -
  • - - - - - - end -
  • -
    - -
    -
  • - - - - - - -
  • -
    - -
    -
  • - 1 - - - - - describe 'associations' do -
  • -
    - -
    -
  • - 2 - - - - - it { should have_many(:user_events) } -
  • -
    - -
    -
  • - 2 - - - - - it { should have_many(:events).through(:user_events) } + email { Faker::Internet.email }
  • -
  • +
  • @@ -3201,7 +2549,7 @@

  • -
  • +
  • diff --git a/spec/fixtures/artist_search.json b/spec/fixtures/artist_search.json new file mode 100644 index 0000000..aee1b18 --- /dev/null +++ b/spec/fixtures/artist_search.json @@ -0,0 +1,1224 @@ +{ + "created": "2024-09-12T07:54:06.911Z", + "count": 3974, + "offset": 0, + "artists": [ + { + "id": "084308bd-1654-436f-ba03-df6697104e19", + "type": "Group", + "type-id": "e431f5f6-b5d2-343d-8b36-72607fffb74b", + "score": 100, + "name": "Green Day", + "sort-name": "Green Day", + "country": "US", + "area": { + "id": "489ce91b-6658-3307-9877-795b68554c98", + "type": "Country", + "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de", + "name": "United States", + "sort-name": "United States", + "life-span": { + "ended": null + } + }, + "begin-area": { + "id": "f9719692-c39a-4d9c-bf8c-dd4035b09534", + "type": "City", + "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78", + "name": "Berkeley", + "sort-name": "Berkeley", + "life-span": { + "ended": null + } + }, + "isnis": [ + "0000000122711282" + ], + "life-span": { + "begin": "1989", + "ended": null + }, + "aliases": [ + { + "sort-name": "Greenday", + "name": "Greenday", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + } + ], + "tags": [ + { + "count": 8, + "name": "rock" + }, + { + "count": 0, + "name": "pop" + }, + { + "count": 14, + "name": "alternative rock" + }, + { + "count": 5, + "name": "punk" + }, + { + "count": 2, + "name": "american" + }, + { + "count": 27, + "name": "punk rock" + }, + { + "count": 0, + "name": "grunge" + }, + { + "count": 0, + "name": "post-punk" + }, + { + "count": 0, + "name": "ska punk" + }, + { + "count": 0, + "name": "usa" + }, + { + "count": 3, + "name": "power pop" + }, + { + "count": 0, + "name": "pop-punk" + }, + { + "count": 0, + "name": "américain" + }, + { + "count": 0, + "name": "post-grunge" + }, + { + "count": 1, + "name": "pop rock" + }, + { + "count": 24, + "name": "pop punk" + }, + { + "count": 1, + "name": "skate punk" + }, + { + "count": 0, + "name": "punk pop" + }, + { + "count": 0, + "name": "california" + }, + { + "count": 0, + "name": "bay area" + }, + { + "count": 0, + "name": "pop and chart" + }, + { + "count": 0, + "name": "united states" + }, + { + "count": 2, + "name": "queer" + }, + { + "count": 0, + "name": "classic pop punk" + }, + { + "count": 0, + "name": "california punk" + }, + { + "count": 0, + "name": "classic punk" + }, + { + "count": 0, + "name": "bay area punk" + }, + { + "count": 0, + "name": "pop/rock" + }, + { + "count": 0, + "name": "2240665859492" + } + ] + }, + { + "id": "fb7272ba-f130-4f0a-934d-6eeea4c18c9a", + "type": "Person", + "type-id": "b6e035f4-3ce9-331c-97df-83397230b0df", + "score": 96, + "gender-id": "36d3d30a-839d-3eda-8cb3-29be4384e4a9", + "name": "Al Green", + "sort-name": "Green, Al", + "gender": "male", + "country": "US", + "area": { + "id": "489ce91b-6658-3307-9877-795b68554c98", + "type": "Country", + "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de", + "name": "United States", + "sort-name": "United States", + "life-span": { + "ended": null + } + }, + "begin-area": { + "id": "c4d48bca-3716-4533-8966-a25b8c7b50a5", + "type": "City", + "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78", + "name": "Forrest City", + "sort-name": "Forrest City", + "life-span": { + "ended": null + } + }, + "disambiguation": "US soul singer, songwriter, pastor and record producer", + "ipis": [ + "00012614624", + "00055306003", + "00141754583" + ], + "isnis": [ + "000000008398392X" + ], + "life-span": { + "begin": "1946-04-13", + "ended": null + }, + "aliases": [ + { + "sort-name": "アル・グリーン", + "type-id": "894afba6-2816-3c24-8072-eadb66bd04bc", + "name": "アル・グリーン", + "locale": "ja", + "type": "Artist name", + "primary": true, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Greene, Albert Leornes", + "type-id": "d4dcd0c0-b341-3612-a332-c0ce797b25cf", + "name": "Albert Leornes Greene", + "locale": null, + "type": "Legal name", + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Green, Al", + "name": "Green, Al", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + } + ], + "tags": [ + { + "count": 1, + "name": "contemporary gospel" + }, + { + "count": 2, + "name": "memphis soul" + }, + { + "count": 1, + "name": "christmas music" + }, + { + "count": 4, + "name": "smooth soul" + }, + { + "count": 1, + "name": "2008 universal fire victim" + }, + { + "count": 0, + "name": "soul and reggae" + }, + { + "count": 2, + "name": "southern soul" + }, + { + "count": 3, + "name": "gospel" + }, + { + "count": 1, + "name": "1970s" + }, + { + "count": 1, + "name": "1980s" + }, + { + "count": 11, + "name": "soul" + }, + { + "count": 1, + "name": "pop-soul" + } + ] + }, + { + "id": "1a88b270-d763-48d5-a62c-2bb9cabb140c", + "type": "Person", + "type-id": "b6e035f4-3ce9-331c-97df-83397230b0df", + "score": 90, + "gender-id": "36d3d30a-839d-3eda-8cb3-29be4384e4a9", + "name": "Grant Green", + "sort-name": "Green, Grant", + "gender": "male", + "country": "US", + "area": { + "id": "489ce91b-6658-3307-9877-795b68554c98", + "type": "Country", + "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de", + "name": "United States", + "sort-name": "United States", + "life-span": { + "ended": null + } + }, + "begin-area": { + "id": "759f9567-9107-40ef-a825-e57824a62e70", + "type": "City", + "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78", + "name": "St. Louis", + "sort-name": "St. Louis", + "life-span": { + "ended": null + } + }, + "end-area": { + "id": "74e50e58-5deb-4b99-93a2-decbb365c07f", + "type": "City", + "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78", + "name": "New York", + "sort-name": "New York", + "life-span": { + "ended": null + } + }, + "disambiguation": "jazz guitarist", + "ipis": [ + "00012619609" + ], + "isnis": [ + "000000011034995X" + ], + "life-span": { + "begin": "1935-06-06", + "end": "1979-01-31", + "ended": true + }, + "aliases": [ + { + "sort-name": "Grant Geeen", + "name": "Grant Geeen", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + } + ], + "tags": [ + { + "count": 3, + "name": "jazz" + }, + { + "count": 1, + "name": "american" + }, + { + "count": 2, + "name": "hard bop" + }, + { + "count": 1, + "name": "jazz-funk" + }, + { + "count": 1, + "name": "cool jazz" + }, + { + "count": 2, + "name": "soul jazz" + }, + { + "count": 1, + "name": "latin jazz" + }, + { + "count": -1, + "name": "death by heart attack" + } + ] + }, + { + "id": "e425b041-c28a-4ae8-9d5c-997890433cd4", + "type": "Person", + "type-id": "b6e035f4-3ce9-331c-97df-83397230b0df", + "score": 88, + "gender-id": "36d3d30a-839d-3eda-8cb3-29be4384e4a9", + "name": "Green Velvet", + "sort-name": "Green Velvet", + "gender": "male", + "country": "US", + "area": { + "id": "489ce91b-6658-3307-9877-795b68554c98", + "type": "Country", + "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de", + "name": "United States", + "sort-name": "United States", + "life-span": { + "ended": null + } + }, + "begin-area": { + "id": "29a709d8-0320-493e-8d0c-f2c386662b7f", + "type": "City", + "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78", + "name": "Chicago", + "sort-name": "Chicago", + "life-span": { + "ended": null + } + }, + "isnis": [ + "0000000073285343" + ], + "life-span": { + "begin": "1967-04-26", + "ended": null + }, + "aliases": [ + { + "sort-name": "Green Verlet", + "name": "Green Verlet", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Curan Stone", + "name": "Curan Stone", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + } + ], + "tags": [ + { + "count": 1, + "name": "house" + }, + { + "count": 1, + "name": "electro" + }, + { + "count": 1, + "name": "minimal techno" + }, + { + "count": 1, + "name": "edm" + } + ] + }, + { + "id": "a1a16614-d1ba-4107-a8f2-fbe94eff3eb8", + "type": "Person", + "type-id": "b6e035f4-3ce9-331c-97df-83397230b0df", + "score": 87, + "gender-id": "36d3d30a-839d-3eda-8cb3-29be4384e4a9", + "name": "Philip Green", + "sort-name": "Green, Philip", + "gender": "male", + "country": "GB", + "area": { + "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", + "type": "Country", + "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de", + "name": "United Kingdom", + "sort-name": "United Kingdom", + "life-span": { + "ended": null + } + }, + "begin-area": { + "id": "4882cb62-4ffe-4206-8a18-5c53cc560560", + "type": "District", + "type-id": "84039871-5e47-38ca-a66a-45e512c8290f", + "name": "Whitechapel", + "sort-name": "Whitechapel", + "life-span": { + "ended": null + } + }, + "end-area": { + "id": "462e7952-4fa9-43cd-bc24-2c5c9cd5dd47", + "type": "City", + "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78", + "name": "Dublin", + "sort-name": "Dublin", + "life-span": { + "ended": null + } + }, + "disambiguation": "British conductor, composer and instrumentalist", + "ipis": [ + "00088262352" + ], + "isnis": [ + "000000011580910X" + ], + "life-span": { + "begin": "1911-07-19", + "end": "1982-10-06", + "ended": true + }, + "aliases": [ + { + "sort-name": "P. Green", + "name": "P. Green", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + } + ] + }, + { + "id": "768ecb0b-bcc8-4c99-9f2d-54a13f33c5f6", + "type": "Group", + "type-id": "e431f5f6-b5d2-343d-8b36-72607fffb74b", + "score": 87, + "name": "the brilliant green", + "sort-name": "brilliant green, the", + "country": "JP", + "area": { + "id": "2db42837-c832-3c27-b4a3-08198f75693c", + "type": "Country", + "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de", + "name": "Japan", + "sort-name": "Japan", + "life-span": { + "ended": null + } + }, + "life-span": { + "begin": "1995", + "ended": null + }, + "aliases": [ + { + "sort-name": "brilliant green, the", + "type-id": "894afba6-2816-3c24-8072-eadb66bd04bc", + "name": "the brilliant green", + "locale": "en", + "type": "Artist name", + "primary": true, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "ザ・ブリリアントグリーン", + "name": "ザ・ブリリアントグリーン", + "locale": "ja", + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "tbg", + "type-id": "1937e404-b981-3cb7-8151-4c86ebfc8d8e", + "name": "tbg", + "locale": null, + "type": "Search hint", + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "ブリリアント・グリーン", + "type-id": "894afba6-2816-3c24-8072-eadb66bd04bc", + "name": "the brilliant green", + "locale": "ja", + "type": "Artist name", + "primary": true, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "ブリグリ", + "type-id": "1937e404-b981-3cb7-8151-4c86ebfc8d8e", + "name": "ブリグリ", + "locale": null, + "type": "Search hint", + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "ザ・ブリリアント・グリーン", + "name": "ザ・ブリリアント・グリーン", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + } + ], + "tags": [ + { + "count": 0, + "name": "n" + }, + { + "count": 0, + "name": "likedis auto" + } + ] + }, + { + "id": "03eb47c4-61a5-4334-bf03-1efc1e75dfb3", + "type": "Group", + "type-id": "e431f5f6-b5d2-343d-8b36-72607fffb74b", + "score": 86, + "name": "Fiddler’s Green", + "sort-name": "Fiddler’s Green", + "country": "DE", + "area": { + "id": "85752fda-13c4-31a3-bee5-0e5cb1f51dad", + "type": "Country", + "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de", + "name": "Germany", + "sort-name": "Germany", + "life-span": { + "ended": null + } + }, + "begin-area": { + "id": "85752fda-13c4-31a3-bee5-0e5cb1f51dad", + "type": "Country", + "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de", + "name": "Germany", + "sort-name": "Germany", + "life-span": { + "ended": null + } + }, + "disambiguation": "Irish folk rock band from Erlangen, Germany", + "isnis": [ + "0000000087774711" + ], + "life-span": { + "begin": "1990", + "ended": null + }, + "aliases": [ + { + "sort-name": "Fiddlers Green", + "name": "Fiddlers Green", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + } + ], + "tags": [ + { + "count": 1, + "name": "folk punk" + }, + { + "count": 2, + "name": "speedfolk" + }, + { + "count": 1, + "name": "irish folk" + }, + { + "count": 1, + "name": "german" + }, + { + "count": 3, + "name": "folk rock" + }, + { + "count": 1, + "name": "irish folk rock" + } + ] + }, + { + "id": "9a6adb63-10a9-417a-8cd9-3b0fcf5475c5", + "type": "Person", + "type-id": "b6e035f4-3ce9-331c-97df-83397230b0df", + "score": 86, + "gender-id": "36d3d30a-839d-3eda-8cb3-29be4384e4a9", + "name": "Peter Green", + "sort-name": "Green, Peter", + "gender": "male", + "country": "GB", + "area": { + "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", + "type": "Country", + "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de", + "name": "United Kingdom", + "sort-name": "United Kingdom", + "life-span": { + "ended": null + } + }, + "begin-area": { + "id": "a72bf6e5-ca76-4c29-8326-df91422d2be8", + "type": "City", + "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78", + "name": "Bethnal Green", + "sort-name": "Bethnal Green", + "life-span": { + "ended": null + } + }, + "end-area": { + "id": "abbac9a8-7ef2-4b7b-b06d-46618f3f5433", + "type": "City", + "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78", + "name": "Canvey Island", + "sort-name": "Canvey Island", + "life-span": { + "ended": null + } + }, + "disambiguation": "former member of Fleetwood Mac", + "ipis": [ + "00039856931" + ], + "isnis": [ + "0000000116766201" + ], + "life-span": { + "begin": "1946-10-29", + "end": "2020-07-25", + "ended": true + }, + "aliases": [ + { + "sort-name": "Greenbaum, Peter Allen", + "type-id": "d4dcd0c0-b341-3612-a332-c0ce797b25cf", + "name": "Peter Allen Greenbaum", + "locale": null, + "type": "Legal name", + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Peter Allen Green", + "type-id": "1937e404-b981-3cb7-8151-4c86ebfc8d8e", + "name": "Peter Allen Green", + "locale": null, + "type": "Search hint", + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Peter Alan Green", + "type-id": "1937e404-b981-3cb7-8151-4c86ebfc8d8e", + "name": "Peter Alan Green", + "locale": null, + "type": "Search hint", + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Pete Green", + "type-id": "1937e404-b981-3cb7-8151-4c86ebfc8d8e", + "name": "Pete Green", + "locale": null, + "type": "Search hint", + "primary": null, + "begin-date": null, + "end-date": null + } + ], + "tags": [ + { + "count": 1, + "name": "electric blues" + }, + { + "count": 1, + "name": "classic pop and rock" + }, + { + "count": 1, + "name": "pop rock" + }, + { + "count": 2, + "name": "blues rock" + }, + { + "count": 1, + "name": "guitar" + }, + { + "count": 2, + "name": "blues" + }, + { + "count": 1, + "name": "rock" + } + ] + }, + { + "id": "2c69465c-0f76-45ce-90a2-1ed0fdacc997", + "type": "Person", + "type-id": "b6e035f4-3ce9-331c-97df-83397230b0df", + "score": 85, + "gender-id": "36d3d30a-839d-3eda-8cb3-29be4384e4a9", + "name": "CeeLo Green", + "sort-name": "Green, CeeLo", + "gender": "male", + "country": "US", + "area": { + "id": "489ce91b-6658-3307-9877-795b68554c98", + "type": "Country", + "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de", + "name": "United States", + "sort-name": "United States", + "life-span": { + "ended": null + } + }, + "begin-area": { + "id": "26e0e534-19ea-4645-bfb3-1aa4e83a4046", + "type": "City", + "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78", + "name": "Atlanta", + "sort-name": "Atlanta", + "life-span": { + "ended": null + } + }, + "ipis": [ + "00183086070", + "00421939556" + ], + "isnis": [ + "0000000055544591", + "000000036837997X" + ], + "life-span": { + "begin": "1974-05-30", + "ended": null + }, + "aliases": [ + { + "sort-name": "Callaway, Thomas", + "name": "Thomas Callaway", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Callaway, Thomas DeCarlo", + "type-id": "d4dcd0c0-b341-3612-a332-c0ce797b25cf", + "name": "Thomas DeCarlo Callaway", + "locale": null, + "type": "Legal name", + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Cee Lo Green", + "type-id": "1937e404-b981-3cb7-8151-4c86ebfc8d8e", + "name": "Cee Lo Green", + "locale": null, + "type": "Search hint", + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Green, Cee‐Lo", + "type-id": "894afba6-2816-3c24-8072-eadb66bd04bc", + "name": "Cee‐Lo Green", + "locale": null, + "type": "Artist name", + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Cee Lo", + "name": "Cee Lo", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Cee‐Lo", + "type-id": "894afba6-2816-3c24-8072-eadb66bd04bc", + "name": "Cee‐Lo", + "locale": null, + "type": "Artist name", + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Cee‐Lo Goodie", + "name": "Cee‐Lo Goodie", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Ceelo", + "name": "Ceelo", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Carlos Green", + "name": "Carlos Green", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Callaway, T.", + "type-id": "894afba6-2816-3c24-8072-eadb66bd04bc", + "name": "T. Callaway", + "locale": "en", + "type": "Artist name", + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Thomas Calloway", + "name": "Thomas Calloway", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Cee-Lo", + "name": "Cee-Lo", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Thomas Burton", + "name": "Thomas Burton", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Callaway, Thomas DeCarlo", + "type-id": "d4dcd0c0-b341-3612-a332-c0ce797b25cf", + "name": "Thomas DeCarlo Callaway", + "locale": "en", + "type": "Legal name", + "primary": null, + "begin-date": null, + "end-date": null + } + ], + "tags": [ + { + "count": 2, + "name": "hip hop" + }, + { + "count": 0, + "name": "criminal" + }, + { + "count": 1, + "name": "2010s" + }, + { + "count": 2, + "name": "r&b" + }, + { + "count": 0, + "name": "hip hop rnb and dance hall" + }, + { + "count": 0, + "name": "rnb" + }, + { + "count": 3, + "name": "soul" + }, + { + "count": 1, + "name": "funk" + }, + { + "count": 0, + "name": "hip-hop" + }, + { + "count": 3, + "name": "pop" + } + ] + }, + { + "id": "bd13909f-1c29-4c27-a874-d4aaf27c5b1a", + "type": "Group", + "type-id": "e431f5f6-b5d2-343d-8b36-72607fffb74b", + "score": 84, + "name": "Fleetwood Mac", + "sort-name": "Fleetwood Mac", + "country": "GB", + "area": { + "id": "8a754a16-0027-3a29-b6d7-2b40ea0481ed", + "type": "Country", + "type-id": "06dd0ae4-8c74-30bb-b43d-95dcedf961de", + "name": "United Kingdom", + "sort-name": "United Kingdom", + "life-span": { + "ended": null + } + }, + "begin-area": { + "id": "f03d09b3-39dc-4083-afd6-159e3f0d462f", + "type": "City", + "type-id": "6fd8f29a-3d0a-32fc-980d-ea697b69da78", + "name": "London", + "sort-name": "London", + "life-span": { + "ended": null + } + }, + "isnis": [ + "0000000112090777" + ], + "life-span": { + "begin": "1967-07", + "ended": null + }, + "aliases": [ + { + "sort-name": "Green's Fleetwood Mac, Peter", + "name": "Peter Green's Fleetwood Mac", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Mac Fleetwood", + "name": "Mac Fleetwood", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Flettwood Mac", + "name": "Flettwood Mac", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Fleetwood Mack", + "name": "Fleetwood Mack", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Fleedwood Mac", + "name": "Fleedwood Mac", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + }, + { + "sort-name": "Vince, Earl and the Valiants", + "name": "Earl Vince and the Valiants", + "locale": null, + "type": null, + "primary": null, + "begin-date": null, + "end-date": null + } + ], + "tags": [ + { + "count": -1, + "name": "american" + }, + { + "count": 0, + "name": "british-american" + }, + { + "count": 0, + "name": "fleetwood mac" + }, + { + "count": 0, + "name": "pop/rock" + }, + { + "count": 0, + "name": "classic pop and rock" + }, + { + "count": 1, + "name": "english" + }, + { + "count": 6, + "name": "british blues" + }, + { + "count": 0, + "name": "electric blues" + }, + { + "count": 8, + "name": "pop rock" + }, + { + "count": 0, + "name": "acoustic rock" + }, + { + "count": 12, + "name": "soft rock" + }, + { + "count": 0, + "name": "classic rock" + }, + { + "count": 0, + "name": "jam band" + }, + { + "count": 9, + "name": "blues rock" + }, + { + "count": 1, + "name": "psychedelic rock" + }, + { + "count": 0, + "name": "folk rock" + }, + { + "count": -1, + "name": "band" + }, + { + "count": 2, + "name": "british" + }, + { + "count": 6, + "name": "blues" + }, + { + "count": 3, + "name": "pop" + }, + { + "count": 15, + "name": "rock" + } + ] + } + ] +} \ No newline at end of file diff --git a/spec/requests/api/v1/artist_request_spec.rb b/spec/requests/api/v1/artist_request_spec.rb index 95f3157..d25819a 100644 --- a/spec/requests/api/v1/artist_request_spec.rb +++ b/spec/requests/api/v1/artist_request_spec.rb @@ -2,9 +2,22 @@ RSpec.describe "Api::V1::Artists", type: :request do describe "GET /api/v1/artists" do - it "returns all artists" do - get "/api/v1/artists" + it "returns a list of artist matching search" do + artist_json = File.read('spec/fixtures/artist_search.json') + + stub_request(:get, "https://musicbrainz.org/ws/2/artist") + .with(query: { query: "Green", fmt: "json", limit: 10 }) + .to_return(status: 200, body: artist_json, headers: { 'Content-Type' => 'application/json' }) + + get "/api/v1/artists", params: { name: "Green" } + expect(response).to have_http_status(200) + data = JSON.parse(response.body, symbolize_names: true) + + expect(data).to be_a(Hash) + expect(data).to have_key(:data) + expect(data[:data]).to be_an(Array) + expect(data[:data].count).to eq(25) end end end \ No newline at end of file From b80f66e32abd2832c41850b3a33294efa9603bc7 Mon Sep 17 00:00:00 2001 From: Garrett Bowman Date: Thu, 12 Sep 2024 03:16:28 -0500 Subject: [PATCH 4/8] WIP: Removed Coverage that was tracked by git --- coverage/.last_run.json | 5 - coverage/.resultset.json | 234 -- coverage/.resultset.json.lock | 0 .../DataTables-1.10.20/images/sort_asc.png | Bin 160 -> 0 bytes .../images/sort_asc_disabled.png | Bin 148 -> 0 bytes .../DataTables-1.10.20/images/sort_both.png | Bin 201 -> 0 bytes .../DataTables-1.10.20/images/sort_desc.png | Bin 158 -> 0 bytes .../images/sort_desc_disabled.png | Bin 146 -> 0 bytes coverage/assets/0.12.3/application.css | 1 - coverage/assets/0.12.3/application.js | 7 - coverage/assets/0.12.3/colorbox/border.png | Bin 163 -> 0 bytes coverage/assets/0.12.3/colorbox/controls.png | Bin 2033 -> 0 bytes coverage/assets/0.12.3/colorbox/loading.gif | Bin 9427 -> 0 bytes .../0.12.3/colorbox/loading_background.png | Bin 166 -> 0 bytes coverage/assets/0.12.3/favicon_green.png | Bin 1009 -> 0 bytes coverage/assets/0.12.3/favicon_red.png | Bin 1009 -> 0 bytes coverage/assets/0.12.3/favicon_yellow.png | Bin 1009 -> 0 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 178 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 120 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 105 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 111 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 110 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 119 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 101 -> 0 bytes .../0.12.3/images/ui-icons_222222_256x240.png | Bin 4369 -> 0 bytes .../0.12.3/images/ui-icons_2e83ff_256x240.png | Bin 4369 -> 0 bytes .../0.12.3/images/ui-icons_454545_256x240.png | Bin 4369 -> 0 bytes .../0.12.3/images/ui-icons_888888_256x240.png | Bin 4369 -> 0 bytes .../0.12.3/images/ui-icons_cd0a0a_256x240.png | Bin 4369 -> 0 bytes coverage/assets/0.12.3/loading.gif | Bin 7247 -> 0 bytes coverage/assets/0.12.3/magnify.png | Bin 1301 -> 0 bytes coverage/index.html | 2570 ----------------- 33 files changed, 2817 deletions(-) delete mode 100644 coverage/.last_run.json delete mode 100644 coverage/.resultset.json delete mode 100644 coverage/.resultset.json.lock delete mode 100644 coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png delete mode 100644 coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png delete mode 100644 coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png delete mode 100644 coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png delete mode 100644 coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc_disabled.png delete mode 100644 coverage/assets/0.12.3/application.css delete mode 100644 coverage/assets/0.12.3/application.js delete mode 100644 coverage/assets/0.12.3/colorbox/border.png delete mode 100644 coverage/assets/0.12.3/colorbox/controls.png delete mode 100644 coverage/assets/0.12.3/colorbox/loading.gif delete mode 100644 coverage/assets/0.12.3/colorbox/loading_background.png delete mode 100644 coverage/assets/0.12.3/favicon_green.png delete mode 100644 coverage/assets/0.12.3/favicon_red.png delete mode 100644 coverage/assets/0.12.3/favicon_yellow.png delete mode 100644 coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100644 coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png delete mode 100644 coverage/assets/0.12.3/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100644 coverage/assets/0.12.3/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100644 coverage/assets/0.12.3/images/ui-icons_222222_256x240.png delete mode 100644 coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png delete mode 100644 coverage/assets/0.12.3/images/ui-icons_454545_256x240.png delete mode 100644 coverage/assets/0.12.3/images/ui-icons_888888_256x240.png delete mode 100644 coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png delete mode 100644 coverage/assets/0.12.3/loading.gif delete mode 100644 coverage/assets/0.12.3/magnify.png delete mode 100644 coverage/index.html diff --git a/coverage/.last_run.json b/coverage/.last_run.json deleted file mode 100644 index 52d2bf2..0000000 --- a/coverage/.last_run.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "result": { - "line": 100.0 - } -} diff --git a/coverage/.resultset.json b/coverage/.resultset.json deleted file mode 100644 index a2db904..0000000 --- a/coverage/.resultset.json +++ /dev/null @@ -1,234 +0,0 @@ -{ - "RSpec": { - "coverage": { - "/Users/gbowman/turing_mod_4/rails_be/config/environment.rb": { - "lines": [ - null, - 1, - null, - null, - 1 - ] - }, - "/Users/gbowman/turing_mod_4/rails_be/config/application.rb": { - "lines": [ - 1, - null, - 1, - null, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - null, - null, - null, - null, - 1, - null, - 1, - 1, - null, - 1, - null, - null, - null, - null, - 1, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 1, - null, - null - ] - }, - "/Users/gbowman/turing_mod_4/rails_be/config/boot.rb": { - "lines": [ - 1, - null, - 1, - 1 - ] - }, - "/Users/gbowman/turing_mod_4/rails_be/config/environments/test.rb": { - "lines": [ - 1, - null, - null, - null, - null, - null, - null, - 1, - null, - null, - null, - 1, - null, - null, - null, - null, - null, - 1, - null, - null, - 1, - 1, - null, - null, - null, - null, - 1, - 1, - 1, - null, - null, - 1, - null, - null, - 1, - null, - null, - 1, - null, - 1, - null, - null, - null, - null, - 1, - null, - null, - 1, - null, - null, - 1, - null, - null, - 1, - null, - null, - null, - null, - null, - null, - null, - null, - 1, - null - ] - }, - "/Users/gbowman/turing_mod_4/rails_be/config/initializers/cors.rb": { - "lines": [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null - ] - }, - "/Users/gbowman/turing_mod_4/rails_be/config/initializers/filter_parameter_logging.rb": { - "lines": [ - null, - null, - null, - null, - null, - 1, - null, - null - ] - }, - "/Users/gbowman/turing_mod_4/rails_be/config/initializers/inflections.rb": { - "lines": [ - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null - ] - }, - "/Users/gbowman/turing_mod_4/rails_be/spec/factories/artist.rb": { - "lines": [ - 1, - 1, - 1, - 1, - null, - null - ] - }, - "/Users/gbowman/turing_mod_4/rails_be/spec/factories/users.rb": { - "lines": [ - 1, - 1, - 1, - 1, - null, - null - ] - }, - "/Users/gbowman/turing_mod_4/rails_be/config/routes.rb": { - "lines": [ - 1, - null, - null, - null, - null, - 1, - null, - null, - null, - 1, - 1, - 1, - 1, - 1, - 1, - null, - null, - null - ] - } - }, - "timestamp": 1726128719 - } -} diff --git a/coverage/.resultset.json.lock b/coverage/.resultset.json.lock deleted file mode 100644 index e69de29..0000000 diff --git a/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png b/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc.png deleted file mode 100644 index e1ba61a8055fcb18273f2468d335572204667b1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3I*bWaz@5R22v2@;zYta_*?F5u6Q zWR@in#&u+WgT?Hi<}D3B3}GOXuX|8Oj3tosHiJ3*4TN zC7>_x-r1O=t(?KoTC+`+>7&2GzdqLHBg&F)2Q?&EGZ+}|Rpsc~9`m>jw35No)z4*} HQ$iB}HK{Sd diff --git a/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png b/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_asc_disabled.png deleted file mode 100644 index fb11dfe24a6c564cb7ddf8bc96703ebb121df1e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S0wixl{&NRX(Vi}jAsXkC6BcOhI9!^3NY?Do zDX;f`c1`y6n0RgO@$!H7chZT&|Jn0dmaqO^XNm-CGtk!Ur<_=Jws3;%W$<+Mb6Mw<&;$T1GdZXL diff --git a/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png b/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_both.png deleted file mode 100644 index af5bc7c5a10b9d6d57cb641aeec752428a07f0ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S0wixl{&NRX6FglULp08Bycxyy87-Q;~nRxO8@-UU*I^KVWyN+&SiMHu5xDOu|HNvwzODfTdXjhVyNu1 z#7^XbGKZ7LW3XeONb$RKLeE*WhqbYpIXPIqK@r4)v+qN8um%99%MPpS9d#7Ed7SL@Bp00i_>zopr0H-Zb Aj{pDw diff --git a/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png b/coverage/assets/0.12.3/DataTables-1.10.20/images/sort_desc.png deleted file mode 100644 index 0e156deb5f61d18f9e2ec5da4f6a8c94a5b4fb41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3I*R8JSj5R22v2@yo z(czD9$NuDl3Ljm9c#_#4$vXUz=f1~&WY3aa=h!;z7fOEN>ySP9QA=6C-^Dmb&tuM= z4Z&=WZU;2WF>e%GI&mWJk^K!jrbro{W;-I>FeCfLGJl3}+Z^2)3Kw?+EoAU?^>bP0 Hl+XkKC^j|Q{b@g3TV7E(Grjn^aLC2o)_ptHrtUEoT$S@q)~)7U@V;W{6)!%@ u>N?4t-1qslpJw9!O?PJ&w0Cby.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,white),color-stop(100%,#dcdcdc));background:-webkit-linear-gradient(top,white 0,#dcdcdc 100%);background:-moz-linear-gradient(top,white 0,#dcdcdc 100%);background:-ms-linear-gradient(top,white 0,#dcdcdc 100%);background:-o-linear-gradient(top,white 0,#dcdcdc 100%);background:linear-gradient(to bottom,white 0,#dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#585858),color-stop(100%,#111));background:-webkit-linear-gradient(top,#585858 0,#111 100%);background:-moz-linear-gradient(top,#585858 0,#111 100%);background:-ms-linear-gradient(top,#585858 0,#111 100%);background:-o-linear-gradient(top,#585858 0,#111 100%);background:linear-gradient(to bottom,#585858 0,#111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:0;background-color:#2b2b2b;background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#2b2b2b),color-stop(100%,#0c0c0c));background:-webkit-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-moz-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-ms-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-o-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:linear-gradient(to bottom,#2b2b2b 0,#0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,0)),color-stop(25%,rgba(255,255,255,0.9)),color-stop(75%,rgba(255,255,255,0.9)),color-stop(100%,rgba(255,255,255,0)));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:0}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width:767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width:640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}}pre .comment,pre .template_comment,pre .diff .header,pre .javadoc{color:#998;font-style:italic}pre .keyword,pre .css .rule .keyword,pre .winutils,pre .javascript .title,pre .lisp .title{color:#000;font-weight:bold}pre .number,pre .hexcolor{color:#458}pre .string,pre .tag .value,pre .phpdoc,pre .tex .formula{color:#d14}pre .subst{color:#712}pre .constant,pre .title,pre .id{color:#900;font-weight:bold}pre .javascript .title,pre .lisp .title,pre .subst{font-weight:normal}pre .class .title,pre .haskell .label,pre .tex .command{color:#458;font-weight:bold}pre .tag,pre .tag .title,pre .rules .property,pre .django .tag .keyword{color:navy;font-weight:normal}pre .attribute,pre .variable,pre .instancevar,pre .lisp .body{color:teal}pre .regexp{color:#009926}pre .class{color:#458;font-weight:bold}pre .symbol,pre .ruby .symbol .string,pre .ruby .symbol .keyword,pre .ruby .symbol .keymethods,pre .lisp .keyword,pre .tex .special,pre .input_number{color:#990073}pre .builtin,pre .built_in,pre .lisp .title{color:#0086b3}pre .preprocessor,pre .pi,pre .doctype,pre .shebang,pre .cdata{color:#999;font-weight:bold}pre .deletion{background:#fdd}pre .addition{background:#dfd}pre .diff .change{background:#0086b3}pre .chunk{color:#aaa}pre .tex .formula{opacity:.5}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{position:absolute;left:-99999999px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}.ui-helper-clearfix{display:inline-block}/*\*/* html .ui-helper-clearfix{height:1%}.ui-helper-clearfix{display:block}/**/.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default !important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-widget :active{outline:0}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-icon{width:16px;height:16px;background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-off{background-position:-96px -144px}.ui-icon-radio-on{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-corner-top{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-bottom{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-corner-right{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-corner-left{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.30;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.30;filter:Alpha(Opacity=30);-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px}#colorbox,#cboxOverlay,#cboxWrapper{position:absolute;top:0;left:0;z-index:9999;overflow:hidden}#cboxOverlay{position:fixed;width:100%;height:100%}#cboxMiddleLeft,#cboxBottomLeft{clear:left}#cboxContent{position:relative}#cboxLoadedContent{overflow:auto}#cboxTitle{margin:0}#cboxLoadingOverlay,#cboxLoadingGraphic{position:absolute;top:0;left:0;width:100%;height:100%}#cboxPrevious,#cboxNext,#cboxClose,#cboxSlideshow{cursor:pointer}.cboxPhoto{float:left;margin:auto;border:0;display:block;max-width:none}.cboxIframe{width:100%;height:100%;display:block;border:0}#colorbox,#cboxContent,#cboxLoadedContent{box-sizing:content-box}#cboxOverlay{background:#000}#cboxTopLeft{width:14px;height:14px;background:url(colorbox/controls.png) no-repeat 0 0}#cboxTopCenter{height:14px;background:url(colorbox/border.png) repeat-x top left}#cboxTopRight{width:14px;height:14px;background:url(colorbox/controls.png) no-repeat -36px 0}#cboxBottomLeft{width:14px;height:43px;background:url(colorbox/controls.png) no-repeat 0 -32px}#cboxBottomCenter{height:43px;background:url(colorbox/border.png) repeat-x bottom left}#cboxBottomRight{width:14px;height:43px;background:url(colorbox/controls.png) no-repeat -36px -32px}#cboxMiddleLeft{width:14px;background:url(colorbox/controls.png) repeat-y -175px 0}#cboxMiddleRight{width:14px;background:url(colorbox/controls.png) repeat-y -211px 0}#cboxContent{background:#fff;overflow:visible}.cboxIframe{background:#fff}#cboxError{padding:50px;border:1px solid #ccc}#cboxLoadedContent{margin-bottom:5px}#cboxLoadingOverlay{background:url(colorbox/loading_background.png) no-repeat center center}#cboxLoadingGraphic{background:url(colorbox/loading.gif) no-repeat center center}#cboxTitle{position:absolute;bottom:-25px;left:0;text-align:center;width:100%;font-weight:bold;color:#7c7c7c}#cboxCurrent{position:absolute;bottom:-25px;left:58px;font-weight:bold;color:#7c7c7c}#cboxPrevious,#cboxNext,#cboxClose,#cboxSlideshow{position:absolute;bottom:-29px;background:url(colorbox/controls.png) no-repeat 0 0;width:23px;height:23px;text-indent:-9999px}#cboxPrevious{left:0;background-position:-51px -25px}#cboxPrevious:hover{background-position:-51px 0}#cboxNext{left:27px;background-position:-75px -25px}#cboxNext:hover{background-position:-75px 0}#cboxClose{right:0;background-position:-100px -25px}#cboxClose:hover{background-position:-100px 0}.cboxSlideshow_on #cboxSlideshow{background-position:-125px 0;right:27px}.cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0}.cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px;right:27px}.cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0}#loading{position:fixed;left:40%;top:50%}a{color:#333;text-decoration:none}a:hover{color:#000;text-decoration:underline}body{font-family:"Lucida Grande",Helvetica,"Helvetica Neue",Arial,sans-serif;padding:12px;background-color:#333}h1,h2,h3,h4{color:#1c2324;margin:0;padding:0;margin-bottom:12px}table{width:100%}#content{clear:left;background-color:white;border:2px solid #ddd;border-top:8px solid #ddd;padding:18px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;-webkit-border-top-right-radius:5px;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-moz-border-radius-topright:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top-right-radius:5px}.dataTables_filter,.dataTables_info{padding:2px 6px}abbr.timeago{text-decoration:none;border:0;font-weight:bold}.timestamp{float:right;color:#ddd}.group_tabs{list-style:none;float:left;margin:0;padding:0}.group_tabs li{display:inline;float:left}.group_tabs li a{font-family:Helvetica,Arial,sans-serif;display:block;float:left;text-decoration:none;padding:4px 8px;background-color:#aaa;background:-webkit-gradient(linear,0 0,0 bottom,from(#ddd),to(#aaa));background:-moz-linear-gradient(#ddd,#aaa);background:linear-gradient(#ddd,#aaa);text-shadow:#e5e5e5 1px 1px 0;border-bottom:0;color:#333;font-weight:bold;margin-right:8px;border-top:1px solid #efefef;-webkit-border-top-left-radius:2px;-webkit-border-top-right-radius:2px;-moz-border-radius-topleft:2px;-moz-border-radius-topright:2px;border-top-left-radius:2px;border-top-right-radius:2px}.group_tabs li a:hover{background-color:#ccc;background:-webkit-gradient(linear,0 0,0 bottom,from(#eee),to(#aaa));background:-moz-linear-gradient(#eee,#aaa);background:linear-gradient(#eee,#aaa)}.group_tabs li a:active{padding-top:5px;padding-bottom:3px}.group_tabs li.active a{color:black;text-shadow:#fff 1px 1px 0;background-color:#ddd;background:-webkit-gradient(linear,0 0,0 bottom,from(white),to(#ddd));background:-moz-linear-gradient(white,#ddd);background:linear-gradient(white,#ddd)}.file_list{margin-bottom:18px}.file_list--responsive{overflow-x:auto;overflow-y:hidden}a.src_link{background:url("./magnify.png") no-repeat left 50%;padding-left:18px}tr,td{margin:0;padding:0}th{white-space:nowrap}th.ui-state-default{cursor:pointer}th span.ui-icon{float:left}td{padding:4px 8px}td.strong{font-weight:bold}.cell--number{text-align:right}.source_table h3,.source_table h4{padding:0;margin:0;margin-bottom:4px}.source_table .header{padding:10px}.source_table pre{margin:0;padding:0;white-space:normal;color:#000;font-family:"Monaco","Inconsolata","Consolas",monospace}.source_table code{color:#000;font-family:"Monaco","Inconsolata","Consolas",monospace}.source_table pre{background-color:#333}.source_table pre ol{margin:0;padding:0;margin-left:45px;font-size:12px;color:white}.source_table pre li{margin:0;padding:2px 6px;border-left:5px solid white}.source_table pre li code{white-space:pre;white-space:pre-wrap}.source_table pre .hits{float:right;margin-left:10px;padding:2px 4px;background-color:#444;background:-webkit-gradient(linear,0 0,0 bottom,from(#222),to(#666));background:-moz-linear-gradient(#222,#666);background:linear-gradient(#222,#666);color:white;font-family:Helvetica,"Helvetica Neue",Arial,sans-serif;font-size:10px;font-weight:bold;text-align:center;border-radius:6px}#footer{color:#ddd;font-size:12px;font-weight:bold;margin-top:12px;text-align:right}#footer a{color:#eee;text-decoration:underline}#footer a:hover{color:#fff;text-decoration:none}.green{color:#090}.red{color:#900}.yellow{color:#da0}.blue{color:blue}thead th{background:white}.source_table .covered{border-color:#090}.source_table .missed{border-color:#900}.source_table .never{border-color:black}.source_table .skipped{border-color:#fc0}.source_table .missed-branch{border-color:#bf0000}.source_table .covered:nth-child(odd){background-color:#cdf2cd}.source_table .covered:nth-child(even){background-color:#dbf2db}.source_table .missed:nth-child(odd){background-color:#f7c0c0}.source_table .missed:nth-child(even){background-color:#f7cfcf}.source_table .never:nth-child(odd){background-color:#efefef}.source_table .never:nth-child(even){background-color:#f4f4f4}.source_table .skipped:nth-child(odd){background-color:#fbf0c0}.source_table .skipped:nth-child(even){background-color:#fbffcf}.source_table .missed-branch:nth-child(odd){background-color:#cc8e8e}.source_table .missed-branch:nth-child(even){background-color:#cc6e6e} \ No newline at end of file diff --git a/coverage/assets/0.12.3/application.js b/coverage/assets/0.12.3/application.js deleted file mode 100644 index e1c2ab2..0000000 --- a/coverage/assets/0.12.3/application.js +++ /dev/null @@ -1,7 +0,0 @@ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(T,e){"use strict";function g(e,t,n){var r,a,i=(n=n||le).createElement("script");if(i.text=e,t)for(r in Se)(a=t[r]||t.getAttribute&&t.getAttribute(r))&&i.setAttribute(r,a);n.head.appendChild(i).parentNode.removeChild(i)}function m(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?pe[ge.call(e)]||"object":typeof e}function s(e){var t=!!e&&"length"in e&&e.length,n=m(e);return!we(e)&&!xe(e)&&("array"===n||0===t||"number"==typeof t&&0D.cacheLength&&delete n[r.shift()],n[e+" "]=t}var r=[];return n}function l(e){return e[q]=!0,e}function a(e){var t=E.createElement("fieldset");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function t(e,t){for(var n=e.split("|"),r=n.length;r--;)D.attrHandle[n[r]]=t}function u(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function r(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function i(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function o(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&_e(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function s(o){return l(function(i){return i=+i,l(function(e,t){for(var n,r=o([],e.length,i),a=r.length;a--;)e[n=r[a]]&&(e[n]=!(t[n]=e[n]))})})}function p(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function c(){}function g(e){for(var t=0,n=e.length,r="";t+~]|"+re+")"+re+"*"),fe=new RegExp(re+"|>"),de=new RegExp(oe),he=new RegExp("^"+ae+"$"),pe={ID:new RegExp("^#("+ae+")"),CLASS:new RegExp("^\\.("+ae+")"),TAG:new RegExp("^("+ae+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+re+"*(even|odd|(([+-]|)(\\d*)n|)"+re+"*(?:([+-]|)"+re+"*(\\d+)|))"+re+"*\\)|)","i"),bool:new RegExp("^(?:"+ne+")$","i"),needsContext:new RegExp("^"+re+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+re+"*((?:-\\d)?\\d*)"+re+"*\\)|)(?=[^-]|$)","i")},ge=/HTML$/i,me=/^(?:input|select|textarea|button)$/i,ve=/^h\d$/i,ye=/^[^{]+\{\s*\[native \w/,be=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,we=/[+~]/,xe=new RegExp("\\\\([\\da-f]{1,6}"+re+"?|("+re+")|.)","ig"),Se=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},De=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,Te=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},Ce=function(){L()},_e=f(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{Q.apply(Y=ee.call(W.childNodes),W.childNodes),Y[W.childNodes.length].nodeType}catch(Ae){Q={apply:Y.length?function(e,t){K.apply(e,ee.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}for(v in S=w.support={},C=w.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!ge.test(t||n&&n.nodeName||"HTML")},L=w.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:W;return r!==E&&9===r.nodeType&&r.documentElement&&(R=(E=r).documentElement,F=!C(E),W!==E&&(n=E.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ce,!1):n.attachEvent&&n.attachEvent("onunload",Ce)),S.attributes=a(function(e){return e.className="i",!e.getAttribute("className")}),S.getElementsByTagName=a(function(e){return e.appendChild(E.createComment("")),!e.getElementsByTagName("*").length}),S.getElementsByClassName=ye.test(E.getElementsByClassName),S.getById=a(function(e){return R.appendChild(e).id=q,!E.getElementsByName||!E.getElementsByName(q).length}),S.getById?(D.filter.ID=function(e){var t=e.replace(xe,Se);return function(e){return e.getAttribute("id")===t}},D.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n=t.getElementById(e);return n?[n]:[]}}):(D.filter.ID=function(e){var n=e.replace(xe,Se);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},D.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&F){var n,r,a,i=t.getElementById(e);if(i){if((n=i.getAttributeNode("id"))&&n.value===e)return[i];for(a=t.getElementsByName(e),r=0;i=a[r++];)if((n=i.getAttributeNode("id"))&&n.value===e)return[i]}return[]}}),D.find.TAG=S.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):S.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],a=0,i=t.getElementsByTagName(e);if("*"!==e)return i;for(;n=i[a++];)1===n.nodeType&&r.push(n);return r},D.find.CLASS=S.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&F)return t.getElementsByClassName(e)},H=[],P=[],(S.qsa=ye.test(E.querySelectorAll))&&(a(function(e){R.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&P.push("[*^$]="+re+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||P.push("\\["+re+"*(?:value|"+ne+")"),e.querySelectorAll("[id~="+q+"-]").length||P.push("~="),e.querySelectorAll(":checked").length||P.push(":checked"),e.querySelectorAll("a#"+q+"+*").length||P.push(".#.+[+~]")}),a(function(e){e.innerHTML="";var t=E.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&P.push("name"+re+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&P.push(":enabled",":disabled"),R.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&P.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),P.push(",.*:")})),(S.matchesSelector=ye.test(M=R.matches||R.webkitMatchesSelector||R.mozMatchesSelector||R.oMatchesSelector||R.msMatchesSelector))&&a(function(e){S.disconnectedMatch=M.call(e,"*"),M.call(e,"[s!='']:x"),H.push("!=",oe)}),P=P.length&&new RegExp(P.join("|")),H=H.length&&new RegExp(H.join("|")),t=ye.test(R.compareDocumentPosition),O=t||ye.test(R.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},G=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!S.sortDetached&&t.compareDocumentPosition(e)===n?e===E||e.ownerDocument===W&&O(W,e)?-1:t===E||t.ownerDocument===W&&O(W,t)?1:I?te(I,e)-te(I,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,a=e.parentNode,i=t.parentNode,o=[e],s=[t];if(!a||!i)return e===E?-1:t===E?1:a?-1:i?1:I?te(I,e)-te(I,t):0;if(a===i)return u(e,t);for(n=e;n=n.parentNode;)o.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;o[r]===s[r];)r++;return r?u(o[r],s[r]):o[r]===W?-1:s[r]===W?1:0}),E},w.matches=function(e,t){return w(e,null,null,t)},w.matchesSelector=function(e,t){if((e.ownerDocument||e)!==E&&L(e),S.matchesSelector&&F&&!V[t+" "]&&(!H||!H.test(t))&&(!P||!P.test(t)))try{var n=M.call(e,t);if(n||S.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(Ae){V(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xe,Se),e[3]=(e[3]||e[4]||e[5]||"").replace(xe,Se),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||w.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&w.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&de.test(n)&&(t=_(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(xe,Se).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=U[e+" "];return t||(t=new RegExp("(^|"+re+")"+e+"("+re+"|$)"))&&U(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,a){return function(e){var t=w.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===a:"!="===r?t!==a:"^="===r?a&&0===t.indexOf(a):"*="===r?a&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;Te.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?Te.find.matchesSelector(r,e)?[r]:[]:Te.find.matches(e,Te.grep(t,function(e){return 1===e.nodeType}))},Te.fn.extend({find:function(e){var t,n,r=this.length,a=this;if("string"!=typeof e)return this.pushStack(Te(e).filter(function(){for(t=0;t)[^>]*|#([\w-]+))$/;(Te.fn.init=function(e,t,n){var r,a;if(!e)return this;if(n=n||je,"string"!=typeof e)return e.nodeType?(this[0]=e,this.length=1,this):we(e)?n.ready!==undefined?n.ready(e):e(Te):Te.makeArray(e,this);if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:Le.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof Te?t[0]:t,Te.merge(this,Te.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:le,!0)),Ie.test(r[1])&&Te.isPlainObject(t))for(r in t)we(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(a=le.getElementById(r[2]))&&(this[0]=a,this.length=1),this}).prototype=Te.fn,je=Te(le);var Ee=/^(?:parents|prev(?:Until|All))/,Re={children:!0,contents:!0,next:!0,prev:!0};Te.fn.extend({has:function(e){var t=Te(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,rt=/^$|^module$|\/(?:java|ecma)script/i,at={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};at.optgroup=at.option,at.tbody=at.tfoot=at.colgroup=at.caption=at.thead,at.th=at.td;var it,ot,st=/<|&#?\w+;/;it=le.createDocumentFragment().appendChild(le.createElement("div")),(ot=le.createElement("input")).setAttribute("type","radio"),ot.setAttribute("checked","checked"),ot.setAttribute("name","t"),it.appendChild(ot),be.checkClone=it.cloneNode(!0).cloneNode(!0).lastChild.checked,it.innerHTML="",be.noCloneChecked=!!it.cloneNode(!0).lastChild.defaultValue;var lt=/^key/,ut=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ct=/^([^.]*)(?:\.(.+)|)/;Te.event={global:{},add:function(t,e,n,r,a){var i,o,s,l,u,c,f,d,h,p,g,m=Be.get(t);if(m)for(n.handler&&(n=(i=n).handler,a=i.selector),a&&Te.find.matchesSelector(Je,a),n.guid||(n.guid=Te.guid++),(l=m.events)||(l=m.events={}),(o=m.handle)||(o=m.handle=function(e){return void 0!==Te&&Te.event.triggered!==e.type?Te.event.dispatch.apply(t,arguments):undefined}),u=(e=(e||"").match(Fe)||[""]).length;u--;)h=g=(s=ct.exec(e[u])||[])[1],p=(s[2]||"").split(".").sort(),h&&(f=Te.event.special[h]||{},h=(a?f.delegateType:f.bindType)||h,f=Te.event.special[h]||{},c=Te.extend({type:h,origType:g,data:r,handler:n,guid:n.guid,selector:a,needsContext:a&&Te.expr.match.needsContext.test(a),namespace:p.join(".")},i),(d=l[h])||((d=l[h]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,p,o)||t.addEventListener&&t.addEventListener(h,o)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),a?d.splice(d.delegateCount++,0,c):d.push(c),Te.event.global[h]=!0)},remove:function(e,t,n,r,a){var i,o,s,l,u,c,f,d,h,p,g,m=Be.hasData(e)&&Be.get(e);if(m&&(l=m.events)){for(u=(t=(t||"").match(Fe)||[""]).length;u--;)if(h=g=(s=ct.exec(t[u])||[])[1],p=(s[2]||"").split(".").sort(),h){for(f=Te.event.special[h]||{},d=l[h=(r?f.delegateType:f.bindType)||h]||[],s=s[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),o=i=d.length;i--;)c=d[i],!a&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(d.splice(i,1),c.selector&&d.delegateCount--,f.remove&&f.remove.call(e,c));o&&!d.length&&(f.teardown&&!1!==f.teardown.call(e,p,m.handle)||Te.removeEvent(e,h,m.handle),delete l[h])}else for(h in l)Te.event.remove(e,h+t[u],n,r,!0);Te.isEmptyObject(l)&&Be.remove(e,"handle events")}},dispatch:function(e){var t,n,r,a,i,o,s=Te.event.fix(e),l=new Array(arguments.length),u=(Be.get(this,"events")||{})[s.type]||[],c=Te.event.special[s.type]||{};for(l[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,dt=/\s*$/g;Te.extend({htmlPrefilter:function(e){return e.replace(ft,"<$1>")},clone:function(e,t,n){var r,a,i,o,s=e.cloneNode(!0),l=Ye(e);if(!(be.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||Te.isXMLDoc(e)))for(o=w(s),r=0,a=(i=w(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",a=function(e){r.remove(),a=null,e&&t("error"===e.type?404:200,e.type)}),le.head.appendChild(r[0])},abort:function(){a&&a()}}});var an,on=[],sn=/(=)\?(?=&|$)|\?\?/;Te.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=on.pop()||Te.expando+"_"+Ot++;return this[e]=!0,e}}),Te.ajaxPrefilter("json jsonp",function(e,t,n){var r,a,i,o=!1!==e.jsonp&&(sn.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&sn.test(e.data)&&"data");if(o||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=we(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,o?e[o]=e[o].replace(sn,"$1"+r):!1!==e.jsonp&&(e.url+=(qt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return i||Te.error(r+" was not called"),i[0]},e.dataTypes[0]="json",a=T[r],T[r]=function(){i=arguments},n.always(function(){a===undefined?Te(T).removeProp(r):T[r]=a,e[r]&&(e.jsonpCallback=t.jsonpCallback,on.push(r)),i&&we(a)&&a(i[0]),i=a=undefined}),"script"}),be.createHTMLDocument=((an=le.implementation.createHTMLDocument("").body).innerHTML="
    ",2===an.childNodes.length),Te.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(be.createHTMLDocument?((r=(t=le.implementation.createHTMLDocument("")).createElement("base")).href=le.location.href,t.head.appendChild(r)):t=le),i=!n&&[],(a=Ie.exec(e))?[t.createElement(a[1])]:(a=S([e],t,i),i&&i.length&&Te(i).remove(),Te.merge([],a.childNodes)));var r,a,i},Te.fn.load=function(e,t,n){var r,a,i,o=this,s=e.indexOf(" ");return-1").append(Te.parseHTML(e)).find(r):e)}).always(n&&function(e,t){o.each(function(){n.apply(this,i||[e.responseText,t,e])})}),this},Te.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){Te.fn[t]=function(e){return this.on(t,e)}}),Te.expr.pseudos.animated=function(t){return Te.grep(Te.timers,function(e){return t===e.elem}).length},Te.offset={setOffset:function(e,t,n){var r,a,i,o,s,l,u=Te.css(e,"position"),c=Te(e),f={};"static"===u&&(e.style.position="relative"),s=c.offset(),i=Te.css(e,"top"),l=Te.css(e,"left"),("absolute"===u||"fixed"===u)&&-1<(i+l).indexOf("auto")?(o=(r=c.position()).top,a=r.left):(o=parseFloat(i)||0,a=parseFloat(l)||0),we(t)&&(t=t.call(e,n,Te.extend({},s))),null!=t.top&&(f.top=t.top-s.top+o),null!=t.left&&(f.left=t.left-s.left+a),"using"in t?t.using.call(e,f):c.css(f)}},Te.fn.extend({offset:function(t){if(arguments.length)return t===undefined?this:this.each(function(e){Te.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],a={top:0,left:0};if("fixed"===Te.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===Te.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((a=Te(e).offset()).top+=Te.css(e,"borderTopWidth",!0),a.left+=Te.css(e,"borderLeftWidth",!0))}return{top:t.top-a.top-Te.css(r,"marginTop",!0),left:t.left-a.left-Te.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===Te.css(e,"position");)e=e.offsetParent;return e||Je})}}),Te.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,a){var i="pageYOffset"===a;Te.fn[t]=function(e){return Me(this,function(e,t,n){var r;if(xe(e)?r=e:9===e.nodeType&&(r=e.defaultView),n===undefined)return r?r[a]:e[t];r?r.scrollTo(i?r.pageXOffset:n,i?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),Te.each(["top","left"],function(e,n){Te.cssHooks[n]=M(be.pixelPosition,function(e,t){if(t)return t=H(e,n),gt.test(t)?Te(e).position()[n]+"px":t})}),Te.each({Height:"height",Width:"width"},function(o,s){Te.each({padding:"inner"+o,content:s,"":"outer"+o},function(r,i){Te.fn[i]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),a=r||(!0===e||!0===t?"margin":"border");return Me(this,function(e,t,n){var r;return xe(e)?0===i.indexOf("outer")?e["inner"+o]:e.document.documentElement["client"+o]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+o],r["scroll"+o],e.body["offset"+o],r["offset"+o],r["client"+o])):n===undefined?Te.css(e,t,a):Te.style(e,t,n,a)},s,n?e:undefined,n)}})}),Te.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){Te.fn[n]=function(e,t){return 0"}for(var i=0,o="",s=[];e.length||t.length;){var l=r().splice(0,1)[0];if(o+=x(n.substr(i,l.offset-i)),i=l.offset,"start"==l.event)o+=a(l.node),s.push(l.node);else if("stop"==l.event){var u=s.length;do{var c=s[--u];o+=""}while(c!=l.node);for(s.splice(u,1);u'+x(a[0])+""):n+=x(a[0]),r=t.lR.lastIndex,a=t.lR.exec(e)}return n+=x(e.substr(r,e.length-r))}function f(e,t){if(t.sL&&T[t.sL]){var n=D(t.sL,e);return g+=n.keyword_count,n.value}return r(e,t)}function d(e,t){var n=e.cN?'':"";e.rB?(m+=n,e.buffer=""):e.eB?(m+=x(t)+n,e.buffer=""):(m+=n,e.buffer=t),h.push(e),p+=e.r}function i(e,t,n){var r=h[h.length-1];if(n)return m+=f(r.buffer+e,r),!1;var a=l(t,r);if(a)return m+=f(r.buffer+e,r),d(a,t),a.rB;var i=u(h.length-1,t);if(i){var o=r.cN?"":"";for(r.rE?m+=f(r.buffer+e,r)+o:r.eE?m+=f(r.buffer+e,r)+o+x(t):m+=f(r.buffer+e+t,r)+o;1":"",m+=o,i--,h.length--;var s=h[h.length-1];return h.length--,h[h.length-1].buffer="",s.starts&&d(s.starts,""),r.rE}if(c(t,r))throw"Illegal"}var s=T[e],h=[s.dM],p=0,g=0,m="";try{var v=0;s.dM.buffer="";do{var y=n(t,v),b=i(y[0],y[1],y[2]);v+=y[0].length,b||(v+=y[1].length)}while(!y[2]);if(1o.keyword_count+o.r&&(o=l),l.keyword_count+l.r>i.keyword_count+i.r&&(o=i,i=l)}}var u=e.className;u.match(i.language)||(u=u?u+" "+i.language:i.language);var c=g(e);if(c.length)(f=document.createElement("pre")).innerHTML=i.value,i.value=m(c,g(f),r);if(n&&(i.value=i.value.replace(/^((<[^>]+>|\t)+)/gm,function(e,t){return t.replace(/\t/g,n)})),t&&(i.value=i.value.replace(/\n/g,"
    ")),/MSIE [678]/.test(navigator.userAgent)&&"CODE"==e.tagName&&"PRE"==e.parentNode.tagName){var f=e.parentNode,d=document.createElement("div");d.innerHTML="
    "+i.value+"
    ",e=d.firstChild.firstChild,d.firstChild.cN=f.cN,f.parentNode.replaceChild(d.firstChild,f)}else e.innerHTML=i.value;e.className=u,e.dataset={},e.dataset.result={language:i.language,kw:i.keyword_count,re:i.r},o&&o.language&&(e.dataset.second_best={language:o.language,kw:o.keyword_count,re:o.r})}}function i(){if(!i.called){i.called=!0,v();for(var e=document.getElementsByTagName("pre"),t=0;t|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",this.BE={b:"\\\\.",r:0},this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0},this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0},this.CLCM={cN:"comment",b:"//",e:"$"},this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"},this.HCM={cN:"comment",b:"#",e:"$"},this.NM={cN:"number",b:this.NR,r:0},this.CNM={cN:"number",b:this.CNR,r:0},this.inherit=function(e,t){var n={};for(var r in e)n[r]=e[r];if(t)for(var r in t)n[r]=t[r];return n}};hljs.LANGUAGES.ruby=function(){var e="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?",t="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",n={keyword:{and:1,"false":1,then:1,defined:1,module:1,"in":1,"return":1,redo:1,"if":1,BEGIN:1,retry:1,end:1,"for":1,"true":1,self:1,when:1,next:1,until:1,"do":1,begin:1,unless:1,END:1,rescue:1,nil:1,"else":1,"break":1,undef:1,not:1,"super":1,"class":1,"case":1,require:1,"yield":1,alias:1,"while":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,"all?":1,allocate:1,ancestors:1,"any?":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,"autoload?":1,"between?":1,binding:1,binmode:1,"block_given?":1,call:1,callcc:1,caller:1,capitalize:1,"capitalize!":1,casecmp:1,"catch":1,ceil:1,center:1,chomp:1,"chomp!":1,chop:1,"chop!":1,chr:1,"class":1,class_eval:1,"class_variable_defined?":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,"closed?":1,coerce:1,collect:1,"collect!":1,compact:1,"compact!":1,concat:1,"const_defined?":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,"default":1,default_proc:1,"delete":1,"delete!":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,"downcase!":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,"empty?":1,entries:1,eof:1,"eof?":1,"eql?":1,"equal?":1,eval:1,exec:1,exit:1,"exit!":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,"flatten!":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,"frozen?":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,"gsub!":1,"has_key?":1,"has_value?":1,hash:1,hex:1,id:1,include:1,"include?":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,"instance_of?":1,"instance_variable_defined?":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,"integer?":1,intern:1,invert:1,ioctl:1,"is_a?":1,isatty:1,"iterator?":1,join:1,"key?":1,keys:1,"kind_of?":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,"lstrip!":1,map:1,"map!":1,match:1,max:1,"member?":1,merge:1,"merge!":1,method:1,"method_defined?":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,"new":1,next:1,"next!":1,"nil?":1,nitems:1,"nonzero?":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,"private_method_defined?":1,private_methods:1,proc:1,protected_instance_methods:1, -"protected_method_defined?":1,protected_methods:1,public_class_method:1,public_instance_methods:1,"public_method_defined?":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,"reject!":1,remainder:1,reopen:1,replace:1,require:1,"respond_to?":1,reverse:1,"reverse!":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,"rstrip!":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,"slice!":1,sort:1,"sort!":1,sort_by:1,split:1,sprintf:1,squeeze:1,"squeeze!":1,srand:1,stat:1,step:1,store:1,strip:1,"strip!":1,sub:1,"sub!":1,succ:1,"succ!":1,sum:1,superclass:1,swapcase:1,"swapcase!":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,"tainted?":1,tell:1,test:1,"throw":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,"tr!":1,tr_s:1,"tr_s!":1,trace_var:1,transpose:1,trap:1,truncate:1,"tty?":1,type:1,ungetc:1,uniq:1,"uniq!":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,"upcase!":1,update:1,upto:1,"value?":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,"zero?":1,zip:1}},r={cN:"yardoctag",b:"@[A-Za-z]+"},a={cN:"comment",b:"#",e:"$",c:[r]},i={cN:"comment",b:"^\\=begin",e:"^\\=end",c:[r],r:10},o={cN:"comment",b:"^__END__",e:"\\n$"},s={cN:"subst",b:"#\\{",e:"}",l:e,k:n},l=[hljs.BE,s],u={cN:"string",b:"'",e:"'",c:l,r:0},c={cN:"string",b:'"',e:'"',c:l,r:0},f={cN:"string",b:"%[qw]?\\(",e:"\\)",c:l,r:10},d={cN:"string",b:"%[qw]?\\[",e:"\\]",c:l,r:10},h={cN:"string",b:"%[qw]?{",e:"}",c:l,r:10},p={cN:"string",b:"%[qw]?<",e:">",c:l,r:10},g={cN:"string",b:"%[qw]?/",e:"/",c:l,r:10},m={cN:"string",b:"%[qw]?%",e:"%",c:l,r:10},v={cN:"string",b:"%[qw]?-",e:"-",c:l,r:10},y={cN:"string",b:"%[qw]?\\|",e:"\\|",c:l,r:10},b={cN:"function",b:"\\bdef\\s+",e:" |$|;",l:e,k:n,c:[{cN:"title",b:t,l:e,k:n},{cN:"params",b:"\\(",e:"\\)",l:e,k:n},a,i,o]},w={cN:"identifier",b:e,l:e,k:n,r:0},x=[a,i,o,u,c,f,d,h,p,g,m,v,y,{cN:"class",b:"\\b(class|module)\\b",e:"$|;",k:{"class":1,module:1},c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+hljs.IR+"::)?"+hljs.IR}]},a,i,o]},b,{cN:"constant",b:"(::)?([A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[u,c,f,d,h,p,g,m,v,y,w],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},w,{b:"("+hljs.RSR+")\\s*",c:[a,i,o,{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[hljs.BE]}],r:0}];return s.c=x,{dM:{l:e,k:n,c:b.c[1].c=x}}}(),function(c,s,o){function l(e,t,n){var r=s.createElement(e);return t&&(r.id=te+t),n&&(r.style.cssText=n),c(r)}function f(){return o.innerHeight?o.innerHeight:c(o).height()}function u(e,n){n!==Object(n)&&(n={}),this.cache={},this.el=e,this.value=function(e){var t;return this.cache[e]===undefined&&((t=c(this.el).attr("data-cbox-"+e))!==undefined?this.cache[e]=t:n[e]!==undefined?this.cache[e]=n[e]:Q[e]!==undefined&&(this.cache[e]=Q[e])),this.cache[e]},this.get=function(e){var t=this.value(e);return c.isFunction(t)?t.call(this.el,this):t}}function i(e){var t=k.length,n=(X+e)%t;return n<0?t+n:n}function d(e,t){return Math.round((/%/.test(e)?("x"===t?I.width():f())/100:1)*parseInt(e,10))}function h(e,t){return e.get("photo")||e.get("photoRegex").test(t)}function p(e,t){return e.get("retinaUrl")&&1"),w()}}function a(){S||(t=!1,I=c(o),S=l(ce).attr({id:ee,"class":!1===c.support.opacity?te+"IE":"",role:"dialog",tabindex:"-1"}).hide(),x=l(ce,"Overlay").hide(),E=c([l(ce,"LoadingOverlay")[0],l(ce,"LoadingGraphic")[0]]),D=l(ce,"Wrapper"),T=l(ce,"Content").append(R=l(ce,"Title"),F=l(ce,"Current"),M=c('
  • ")}),$(".group_tabs a").each(function(){$(this).addClass($(this).attr("href").replace("#",""))}),$(".group_tabs").on("focus","a",function(){$(this).blur()});var e=$('link[rel="shortcut icon"]').attr("href");if($(".group_tabs").on("click","a",function(){return $(this).parent().hasClass("active")||($(".group_tabs a").parent().removeClass("active"),$(this).parent().addClass("active"),$(".file_list_container").hide(),$(".file_list_container"+$(this).attr("href")).show(),window.location.href=window.location.href.split("#")[0]+$(this).attr("href").replace("#","#_"),$('link[rel="shortcut icon"]').remove(),$("head").append('')),!1}),window.location.hash){var r=window.location.hash.substring(1);40==r.length?$('a.src_link[href="#'+r+'"]').click():$(".group_tabs a."+r.replace("_","")).click()}else $(".group_tabs a:first").click();$("abbr.timeago").timeago(),$("#loading").fadeOut(),$("#wrapper").show(),$(".dataTables_filter input").focus()}); \ No newline at end of file diff --git a/coverage/assets/0.12.3/colorbox/border.png b/coverage/assets/0.12.3/colorbox/border.png deleted file mode 100644 index df13bb6daf79307915e7dd1cf29d48730a50c29d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^j6m$o!3-qZIAk{hDdPa25Z9ofAa{3ne}8{RM@MgO z?|^^+D=VvngoLiHE@NZkOP4N1MMVV$27dbVsk5{5|NsBbo<1!vSziv+uI=gK7*Y|p z^k6G*gM$FWhIux5zx_}1v|LF#mgu27<@e;v&wgfZpEc#erGmW@9n6=)zqo$~YGd$p L^>bP0l+XkK8G}75 diff --git a/coverage/assets/0.12.3/colorbox/controls.png b/coverage/assets/0.12.3/colorbox/controls.png deleted file mode 100644 index 65cfd1dc95c5ee4c6c3d0848b1dcfc0ec69f6aea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2033 zcmVY16Dl9G~IT3Xc9)Z^ph#l^+1udkq>pj%s8x3{-FJw3a- zyTZc4tgNhJVPUGOs=2wjTUuIPU0s)#m&C-xo0^)sxw(yvjeLB3^78U4D=RH6Ei5c7 zO-)TME-o-IFwM=)IXOA(>+9v^gnk!Dk@A&OhZFMI5;>mGBP$cHrd(PIyySo z*x1a>%u7p4z`(#lLPF^0=SN3JF)=YpN=iXNLGSMFH#av(NJvFRMNv^v@$vCHJ3Bl) zJTo&hNl8iR>FGvBMo>^t>+0%WUS93(?OFDTAPEK`obwEHsK0ZFDr>E}i?Y_RgTwGjIQc{VDiO$Z>?Ck7QQ&aZ#_VDoVc6N4O zUti|s<#>2_pP!#*wE#@J%|ZXjkIv8d15RfRBQxe$bh z9TUw{N+{bY1z&)8>k2t;d{xYxg76&eJ5GSmab7cm2*kJn zLPONkBzslPWkA+%7~Rthzj+ZdH;HAk-Pq6JDgZ%}1qZgnS8` z|A!BGUTY0vuJ8~Q8k9-cggFrxrb5iS-G06qcV|ScTS@l&{bZ%90njJ((hDH>go-Ov zZbB$mN3X(#_fF&Gsyr1MX$KPpfH2>rC?r$(w4Y$dt3?|Rbk9;C`p(jcaF$k70KON_ zQXS~iuoPW9OL=;PXDK^qs;!en!tGwM8Dm32zK3Hnob~aBRzMgVd)VIwFSb@T|pRnFQtL^ zQVJ_)!)j6(b&PC(dhopzE0a4<>r<@qU z`!EtA#BilIes-lde&oVm?AXss0zni9@U)s;c2)_BE*-ve3qd+Xkx|kwB9dCkgI$6` z2)acBb&UMSYiGCKj*SBn@)q-Z5n&E~kT-AMBO%kChC#@X|0tXb=fe3-(?1oCZXuoB zLi}_KX?F|Z?iRyJn&Er?*=Fkav37KPz4^Q2i%?hdj$hRY5$X6y8bhS1yyTxuueKWC z5CSWPU;%-YXn=qr((#(QE2FU06#>QwQ5V+BI|UkI(*RRqvv@oZ-B#&@=C_U&BCHmt zC#jJURR)BX9qafF9iN(TLwU10A{?j~CXS78W{8Uu@HZ?#PAyEpFp1S*%EGlpZ`N&L zTO`O5246{p*$9hz`Xxjbs;;d1D5fGugh*6-y27O=ZrgP)q5m%J z%*b8(_kO793Uc&AR^jAtn*OA38fGEGyOcr5Fk7$*{qtd@niJ25{6h8_pFvpWJ0e#STIxNJ)pDn{H0&eE#G130bNngTwLQ z{r-aw>G;0=r|=|0AtWIQNk~Exl8}TXBq0e&sC~j#A{E;EQlD^{NCv_KN?|hzt4p`= zmiMYgEZpwcxm$P_8++%CQ5bCMy}oe)uer?ORv)df%L>+~SMRSwxVo4v42N~krH0-D zsqp7BEemF3oQ#jZH?};MT1`)gSQr3NRVET5olgiEnaToD3Vmr;&eR^luC95&D|F|1 zySmIE&VwgJDV!&k+duls&IXn^h1S?O8(9D%7J?Dx?3|Gb?cRJt`cH*#(!#mIWIQCf P00000NkvXXu0mjf=5OWV diff --git a/coverage/assets/0.12.3/colorbox/loading.gif b/coverage/assets/0.12.3/colorbox/loading.gif deleted file mode 100644 index b4695d811d4f84ed693eff7b5e6b4d61a3e8c48d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9427 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 diff --git a/coverage/assets/0.12.3/favicon_red.png b/coverage/assets/0.12.3/favicon_red.png deleted file mode 100644 index fbe093a551114bd5ba92550b83ec04a886238bdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmbVLO>Wab7bYf2utF_0Br^M-! z9Yvvdaul*51?`xOX_u04_WBz=P?XJ4)E|g}e`*IT)<}WT@;H@j zML9UkQxaTI0fuxOC64;@(`OY#p`*U6`_NB4I*CrMIqhAa^@Hn+pc$%%Pr*TMOM#dQ z0`mAW$?V)w=eoAs7uUK9<`8k=s0*hCeg}ArQ&87nC4eRbCel!~W?9x_U_b(45K0um28#>l2?*! zzf{093wV@@h$WymuBpW2eKZc{gNzmce9}aD7~>?@JJSgTw)en#WWFZ?5OgO7Dk~BQ3E1m)u3fS zvw@I{u-k%-n$@r{ZopQlv5xCD%qliK1DkaZp%y$ct-4n?jVgAJk%g)yx1D5yBmph$ zM$+z*i*DrF9;ZYw-e>Hx?10XM36@P*3cOw&_#}vu;#`zx5iO=XdPBow&SEgnuN|$i z4~>7tz2JublQUg9qZiHbSF@B?vIC3ls`cezH9Rzt6T{_byxRM5OODl@&S}5(em-Fz o?)}1Yv(v^${rvmz{Qm8)3izUI>?#{iT=#i_X}8YsNB8{gZ@}R!9smFU diff --git a/coverage/assets/0.12.3/favicon_yellow.png b/coverage/assets/0.12.3/favicon_yellow.png deleted file mode 100644 index e53847ea09aea9a5a16237a2acbebd0bef7f9436..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmbVL&u-H&7|%3;VA8a415Q?U;jkulx;AaLFg0<;Dwa{TmFRJ9;eJ#kmiX9Mq>;)n%m16w*8lZ-ldARVZ09vn08R3}~jQ%4>lxM4$c%<5qMr zyvnKBrvXT zW(y$?VK0EKJ-cON+=4-+aU0if*#Qg!4>ub=LILbF?S|iIT6OFlAsf{zZZ|6g$s$_$ zO{Cuyw{s`g@i`@e@gZXuRR{EDOt50ca^MddAS6+eslB?MWww~|pPHF67*jRJU(He-$qrP@o7R_`o8h6EoER=gqyAy{ksPc0y^~?^^P`$D o)I$%Y+3MoXu>3JTdwlPk2EJ-*+uGW`=e<;rZg7e}d1vo_0~HY~(EtDd diff --git a/coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png b/coverage/assets/0.12.3/images/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index 5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 diff --git a/coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png b/coverage/assets/0.12.3/images/ui-bg_flat_75_ffffff_40x100.png deleted file mode 100644 index ac8b229af950c29356abf64a6c4aa894575445f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= diff --git a/coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png b/coverage/assets/0.12.3/images/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100644 index ad3d6346e00f246102f72f2e026ed0491988b394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hLi978O6-<~(*I$*%ybaDOn z{W;e!B}_MSUQoPXhYd^Y6RUoS1yepnPx`2Kz)7OXQG!!=-jY=F+d2OOy?#DnJ32>z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v diff --git a/coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png b/coverage/assets/0.12.3/images/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100644 index 42ccba269b6e91bef12ad0fa18be651b5ef0ee68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& diff --git a/coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png b/coverage/assets/0.12.3/images/ui-bg_glass_75_dadada_1x400.png deleted file mode 100644 index 5a46b47cb16631068aee9e0bd61269fc4e95e5cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse diff --git a/coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/coverage/assets/0.12.3/images/ui-bg_highlight-soft_75_cccccc_1x100.png deleted file mode 100644 index 7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101 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 diff --git a/coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png b/coverage/assets/0.12.3/images/ui-icons_2e83ff_256x240.png deleted file mode 100644 index 09d1cdc856c292c4ab6dd818c7543ac0828bd616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 diff --git a/coverage/assets/0.12.3/images/ui-icons_454545_256x240.png b/coverage/assets/0.12.3/images/ui-icons_454545_256x240.png deleted file mode 100644 index 59bd45b907c4fd965697774ce8c5fc6b2fd9c105..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 oBo%DI*Kv;w;*%(i9W@f3_WCF#rGn diff --git a/coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png b/coverage/assets/0.12.3/images/ui-icons_cd0a0a_256x240.png deleted file mode 100644 index 2ab019b73ec11a485fa09378f3a0e155194f6a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4369 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 diff --git a/coverage/assets/0.12.3/magnify.png b/coverage/assets/0.12.3/magnify.png deleted file mode 100644 index 6073b9530ed197d0431ab30ca79ed262f4b910fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1301 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CP!3HERJk;|9Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?{&CLn2Bde0{8v^Ko2Tt~skz|cV7z)0WFNY~KZ%Gk)tz(4^Clz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiFN27#ZmTRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$Ab zT4JjNbScCOxdpzyaD(%Tp#cR9GX09g0)0b01O41wkiWpHi%Wu15zfG>x;Uh=AXPso zwK%`DC>aHCFybnZQU%%yG$2F3nBNEAe!(RRYTBrDUd98JJoa z7#fLwm{}MaS{S&PxH=kI8aca~nVK0J!py*?*VNqH(b&z&+|k6`#L&>i&C$@& z*wN9@%*oZ*)ycrb38vRGuec;JFF6%vZzj-Qs9rO?daay`QWHz^i$e1Ab6_bTAS1sd zzc?emK*2fKRKYhfIWrH$2SpFWw=StgnPsUdZbkXI3gGay%EV$nVShvPreF&*U?|}Y zGku_A^g)RODY3wWfGH5fgeQF<2cCIS^ME;~2$(gL-@n|+z`*G0>EaktajRw0L9dno zk+%0&6)$)$+Nzu6AkfL76}2_%qHx3)uDvb4^e!sRPZYbPmUVHFfHTLUiPtWPG~N0l zZ#n&l+OLO)AAjB7Ui^QxNPqy#CXKGeHs{qNr>(s->-DbU0z`y zvr6dr$F>Ni``^>&J&$coyz%zJ3gg+&AF#zVco%Tny^yX9X%_4~_?3AFvsJM_@4>k9 z$|k19Q#LoAQGV8H_r+$eqvyAIlg$53a?31u`=R*Y7LjRQK3q&Le8wT*lABgaxY9)S-2*+#8CINRCwstB#E|+S#Dc$ zwO{YLR_Gu9;oL6fRnl*|)1C_USH7J5{&}o${cFKJg}F_K6W5$Bxw~5P=*fENxPy~_ qY45u7g2$OHiv4-Q?6`fb5)4Z;>fX&^evkqxs61W$T-G@yGywqb{mBae diff --git a/coverage/index.html b/coverage/index.html deleted file mode 100644 index 20115bc..0000000 --- a/coverage/index.html +++ /dev/null @@ -1,2570 +0,0 @@ - - - - Code coverage for Rails be - - - - - - - - -

    - loading -
    -
    -
    Generated 2024-09-12T03:11:59-05:00
    -
      - -
      -
      -

      - All Files - ( - - 100.0% - - - - covered at - - - 1.0 - - hits/line - ) -

      - -
      - -
      - 10 files in total. -
      - -
      - 58 relevant lines, - 58 lines covered and - 0 lines missed. - ( - 100.0% - -) -
      - - - -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      File% coveredLinesRelevant LinesLines coveredLines missedAvg. Hits / Line
      config/application.rb100.00 %44181801.00
      config/boot.rb100.00 %43301.00
      config/environment.rb100.00 %52201.00
      config/environments/test.rb100.00 %64181801.00
      config/initializers/cors.rb100.00 %160000.00
      config/initializers/filter_parameter_logging.rb100.00 %81101.00
      config/initializers/inflections.rb100.00 %160000.00
      config/routes.rb100.00 %188801.00
      spec/factories/artist.rb100.00 %64401.00
      spec/factories/users.rb100.00 %64401.00
      -
      -
      - - - -
      - - - -
      - -
      -
      -

      config/application.rb

      -

      - - 100.0% - - - lines covered -

      - - - -
      - 18 relevant lines. - 18 lines covered and - 0 lines missed. -
      - - - -
      - -
      -    
        - -
        -
      1. - 1 - - - - - require_relative "boot" -
      2. -
        - -
        -
      3. - - - - - - -
      4. -
        - -
        -
      5. - 1 - - - - - require "rails" -
      6. -
        - -
        -
      7. - - - - - - # Pick the frameworks you want: -
      8. -
        - -
        -
      9. - 1 - - - - - require "active_model/railtie" -
      10. -
        - -
        -
      11. - 1 - - - - - require "active_job/railtie" -
      12. -
        - -
        -
      13. - 1 - - - - - require "active_record/railtie" -
      14. -
        - -
        -
      15. - 1 - - - - - require "active_storage/engine" -
      16. -
        - -
        -
      17. - 1 - - - - - require "action_controller/railtie" -
      18. -
        - -
        -
      19. - 1 - - - - - require "action_mailer/railtie" -
      20. -
        - -
        -
      21. - 1 - - - - - require "action_mailbox/engine" -
      22. -
        - -
        -
      23. - 1 - - - - - require "action_text/engine" -
      24. -
        - -
        -
      25. - 1 - - - - - require "action_view/railtie" -
      26. -
        - -
        -
      27. - 1 - - - - - require "action_cable/engine" -
      28. -
        - -
        -
      29. - - - - - - # require "rails/test_unit/railtie" -
      30. -
        - -
        -
      31. - - - - - - -
      32. -
        - -
        -
      33. - - - - - - # Require the gems listed in Gemfile, including any gems -
      34. -
        - -
        -
      35. - - - - - - # you've limited to :test, :development, or :production. -
      36. -
        - -
        -
      37. - 1 - - - - - Bundler.require(*Rails.groups) -
      38. -
        - -
        -
      39. - - - - - - -
      40. -
        - -
        -
      41. - 1 - - - - - module ConcertmateBeRails -
      42. -
        - -
        -
      43. - 1 - - - - - class Application < Rails::Application -
      44. -
        - -
        -
      45. - - - - - - # Initialize configuration defaults for originally generated Rails version. -
      46. -
        - -
        -
      47. - 1 - - - - - config.load_defaults 7.1 -
      48. -
        - -
        -
      49. - - - - - - -
      50. -
        - -
        -
      51. - - - - - - # Please, add to the `ignore` list any other `lib` subdirectories that do -
      52. -
        - -
        -
      53. - - - - - - # not contain `.rb` files, or that should not be reloaded or eager loaded. -
      54. -
        - -
        -
      55. - - - - - - # Common ones are `templates`, `generators`, or `middleware`, for example. -
      56. -
        - -
        -
      57. - 1 - - - - - config.autoload_lib(ignore: %w(assets tasks)) -
      58. -
        - -
        -
      59. - - - - - - -
      60. -
        - -
        -
      61. - - - - - - # Configuration for the application, engines, and railties goes here. -
      62. -
        - -
        -
      63. - - - - - - # -
      64. -
        - -
        -
      65. - - - - - - # These settings can be overridden in specific environments using the files -
      66. -
        - -
        -
      67. - - - - - - # in config/environments, which are processed later. -
      68. -
        - -
        -
      69. - - - - - - # -
      70. -
        - -
        -
      71. - - - - - - # config.time_zone = "Central Time (US & Canada)" -
      72. -
        - -
        -
      73. - - - - - - # config.eager_load_paths << Rails.root.join("extras") -
      74. -
        - -
        -
      75. - - - - - - -
      76. -
        - -
        -
      77. - - - - - - # Only loads a smaller set of middleware suitable for API only apps. -
      78. -
        - -
        -
      79. - - - - - - # Middleware like session, flash, cookies can be added back manually. -
      80. -
        - -
        -
      81. - - - - - - # Skip views, helpers and assets when generating a new resource. -
      82. -
        - -
        -
      83. - 1 - - - - - config.api_only = true -
      84. -
        - -
        -
      85. - - - - - - end -
      86. -
        - -
        -
      87. - - - - - - end -
      88. -
        - -
      -
      -
      - - -
      -
      -

      config/boot.rb

      -

      - - 100.0% - - - lines covered -

      - - - -
      - 3 relevant lines. - 3 lines covered and - 0 lines missed. -
      - - - -
      - -
      -    
        - -
        -
      1. - 1 - - - - - ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) -
      2. -
        - -
        -
      3. - - - - - - -
      4. -
        - -
        -
      5. - 1 - - - - - require "bundler/setup" # Set up gems listed in the Gemfile. -
      6. -
        - -
        -
      7. - 1 - - - - - require "bootsnap/setup" # Speed up boot time by caching expensive operations. -
      8. -
        - -
      -
      -
      - - -
      -
      -

      config/environment.rb

      -

      - - 100.0% - - - lines covered -

      - - - -
      - 2 relevant lines. - 2 lines covered and - 0 lines missed. -
      - - - -
      - -
      -    
        - -
        -
      1. - - - - - - # Load the Rails application. -
      2. -
        - -
        -
      3. - 1 - - - - - require_relative "application" -
      4. -
        - -
        -
      5. - - - - - - -
      6. -
        - -
        -
      7. - - - - - - # Initialize the Rails application. -
      8. -
        - -
        -
      9. - 1 - - - - - Rails.application.initialize! -
      10. -
        - -
      -
      -
      - - -
      -
      -

      config/environments/test.rb

      -

      - - 100.0% - - - lines covered -

      - - - -
      - 18 relevant lines. - 18 lines covered and - 0 lines missed. -
      - - - -
      - -
      -    
        - -
        -
      1. - 1 - - - - - require "active_support/core_ext/integer/time" -
      2. -
        - -
        -
      3. - - - - - - -
      4. -
        - -
        -
      5. - - - - - - # The test environment is used exclusively to run your application's -
      6. -
        - -
        -
      7. - - - - - - # test suite. You never need to work with it otherwise. Remember that -
      8. -
        - -
        -
      9. - - - - - - # your test database is "scratch space" for the test suite and is wiped -
      10. -
        - -
        -
      11. - - - - - - # and recreated between test runs. Don't rely on the data there! -
      12. -
        - -
        -
      13. - - - - - - -
      14. -
        - -
        -
      15. - 1 - - - - - Rails.application.configure do -
      16. -
        - -
        -
      17. - - - - - - # Settings specified here will take precedence over those in config/application.rb. -
      18. -
        - -
        -
      19. - - - - - - -
      20. -
        - -
        -
      21. - - - - - - # While tests run files are not watched, reloading is not necessary. -
      22. -
        - -
        -
      23. - 1 - - - - - config.enable_reloading = false -
      24. -
        - -
        -
      25. - - - - - - -
      26. -
        - -
        -
      27. - - - - - - # Eager loading loads your entire application. When running a single test locally, -
      28. -
        - -
        -
      29. - - - - - - # this is usually not necessary, and can slow down your test suite. However, it's -
      30. -
        - -
        -
      31. - - - - - - # recommended that you enable it in continuous integration systems to ensure eager -
      32. -
        - -
        -
      33. - - - - - - # loading is working properly before deploying your code. -
      34. -
        - -
        -
      35. - 1 - - - - - config.eager_load = ENV["CI"].present? -
      36. -
        - -
        -
      37. - - - - - - -
      38. -
        - -
        -
      39. - - - - - - # Configure public file server for tests with Cache-Control for performance. -
      40. -
        - -
        -
      41. - 1 - - - - - config.public_file_server.enabled = true -
      42. -
        - -
        -
      43. - 1 - - - - - config.public_file_server.headers = { -
      44. -
        - -
        -
      45. - - - - - - "Cache-Control" => "public, max-age=#{1.hour.to_i}" -
      46. -
        - -
        -
      47. - - - - - - } -
      48. -
        - -
        -
      49. - - - - - - -
      50. -
        - -
        -
      51. - - - - - - # Show full error reports and disable caching. -
      52. -
        - -
        -
      53. - 1 - - - - - config.consider_all_requests_local = true -
      54. -
        - -
        -
      55. - 1 - - - - - config.action_controller.perform_caching = false -
      56. -
        - -
        -
      57. - 1 - - - - - config.cache_store = :null_store -
      58. -
        - -
        -
      59. - - - - - - -
      60. -
        - -
        -
      61. - - - - - - # Render exception templates for rescuable exceptions and raise for other exceptions. -
      62. -
        - -
        -
      63. - 1 - - - - - config.action_dispatch.show_exceptions = :rescuable -
      64. -
        - -
        -
      65. - - - - - - -
      66. -
        - -
        -
      67. - - - - - - # Disable request forgery protection in test environment. -
      68. -
        - -
        -
      69. - 1 - - - - - config.action_controller.allow_forgery_protection = false -
      70. -
        - -
        -
      71. - - - - - - -
      72. -
        - -
        -
      73. - - - - - - # Store uploaded files on the local file system in a temporary directory. -
      74. -
        - -
        -
      75. - 1 - - - - - config.active_storage.service = :test -
      76. -
        - -
        -
      77. - - - - - - -
      78. -
        - -
        -
      79. - 1 - - - - - config.action_mailer.perform_caching = false -
      80. -
        - -
        -
      81. - - - - - - -
      82. -
        - -
        -
      83. - - - - - - # Tell Action Mailer not to deliver emails to the real world. -
      84. -
        - -
        -
      85. - - - - - - # The :test delivery method accumulates sent emails in the -
      86. -
        - -
        -
      87. - - - - - - # ActionMailer::Base.deliveries array. -
      88. -
        - -
        -
      89. - 1 - - - - - config.action_mailer.delivery_method = :test -
      90. -
        - -
        -
      91. - - - - - - -
      92. -
        - -
        -
      93. - - - - - - # Print deprecation notices to the stderr. -
      94. -
        - -
        -
      95. - 1 - - - - - config.active_support.deprecation = :stderr -
      96. -
        - -
        -
      97. - - - - - - -
      98. -
        - -
        -
      99. - - - - - - # Raise exceptions for disallowed deprecations. -
      100. -
        - -
        -
      101. - 1 - - - - - config.active_support.disallowed_deprecation = :raise -
      102. -
        - -
        -
      103. - - - - - - -
      104. -
        - -
        -
      105. - - - - - - # Tell Active Support which deprecation messages to disallow. -
      106. -
        - -
        -
      107. - 1 - - - - - config.active_support.disallowed_deprecation_warnings = [] -
      108. -
        - -
        -
      109. - - - - - - -
      110. -
        - -
        -
      111. - - - - - - # Raises error for missing translations. -
      112. -
        - -
        -
      113. - - - - - - # config.i18n.raise_on_missing_translations = true -
      114. -
        - -
        -
      115. - - - - - - -
      116. -
        - -
        -
      117. - - - - - - # Annotate rendered view with file names. -
      118. -
        - -
        -
      119. - - - - - - # config.action_view.annotate_rendered_view_with_filenames = true -
      120. -
        - -
        -
      121. - - - - - - -
      122. -
        - -
        -
      123. - - - - - - # Raise error when a before_action's only/except options reference missing actions -
      124. -
        - -
        -
      125. - 1 - - - - - config.action_controller.raise_on_missing_callback_actions = true -
      126. -
        - -
        -
      127. - - - - - - end -
      128. -
        - -
      -
      -
      - - -
      -
      -

      config/initializers/cors.rb

      -

      - - 100.0% - - - lines covered -

      - - - -
      - 0 relevant lines. - 0 lines covered and - 0 lines missed. -
      - - - -
      - -
      -    
        - -
        -
      1. - - - - - - # Be sure to restart your server when you modify this file. -
      2. -
        - -
        -
      3. - - - - - - -
      4. -
        - -
        -
      5. - - - - - - # Avoid CORS issues when API is called from the frontend app. -
      6. -
        - -
        -
      7. - - - - - - # Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin Ajax requests. -
      8. -
        - -
        -
      9. - - - - - - -
      10. -
        - -
        -
      11. - - - - - - # Read more: https://github.com/cyu/rack-cors -
      12. -
        - -
        -
      13. - - - - - - -
      14. -
        - -
        -
      15. - - - - - - # Rails.application.config.middleware.insert_before 0, Rack::Cors do -
      16. -
        - -
        -
      17. - - - - - - # allow do -
      18. -
        - -
        -
      19. - - - - - - # origins "example.com" -
      20. -
        - -
        -
      21. - - - - - - # -
      22. -
        - -
        -
      23. - - - - - - # resource "*", -
      24. -
        - -
        -
      25. - - - - - - # headers: :any, -
      26. -
        - -
        -
      27. - - - - - - # methods: [:get, :post, :put, :patch, :delete, :options, :head] -
      28. -
        - -
        -
      29. - - - - - - # end -
      30. -
        - -
        -
      31. - - - - - - # end -
      32. -
        - -
      -
      -
      - - -
      -
      -

      config/initializers/filter_parameter_logging.rb

      -

      - - 100.0% - - - lines covered -

      - - - -
      - 1 relevant lines. - 1 lines covered and - 0 lines missed. -
      - - - -
      - -
      -    
        - -
        -
      1. - - - - - - # Be sure to restart your server when you modify this file. -
      2. -
        - -
        -
      3. - - - - - - -
      4. -
        - -
        -
      5. - - - - - - # Configure parameters to be partially matched (e.g. passw matches password) and filtered from the log file. -
      6. -
        - -
        -
      7. - - - - - - # Use this to limit dissemination of sensitive information. -
      8. -
        - -
        -
      9. - - - - - - # See the ActiveSupport::ParameterFilter documentation for supported notations and behaviors. -
      10. -
        - -
        -
      11. - 1 - - - - - Rails.application.config.filter_parameters += [ -
      12. -
        - -
        -
      13. - - - - - - :passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn -
      14. -
        - -
        -
      15. - - - - - - ] -
      16. -
        - -
      -
      -
      - - -
      -
      -

      config/initializers/inflections.rb

      -

      - - 100.0% - - - lines covered -

      - - - -
      - 0 relevant lines. - 0 lines covered and - 0 lines missed. -
      - - - -
      - -
      -    
        - -
        -
      1. - - - - - - # Be sure to restart your server when you modify this file. -
      2. -
        - -
        -
      3. - - - - - - -
      4. -
        - -
        -
      5. - - - - - - # Add new inflection rules using the following format. Inflections -
      6. -
        - -
        -
      7. - - - - - - # are locale specific, and you may define rules for as many different -
      8. -
        - -
        -
      9. - - - - - - # locales as you wish. All of these examples are active by default: -
      10. -
        - -
        -
      11. - - - - - - # ActiveSupport::Inflector.inflections(:en) do |inflect| -
      12. -
        - -
        -
      13. - - - - - - # inflect.plural /^(ox)$/i, "\\1en" -
      14. -
        - -
        -
      15. - - - - - - # inflect.singular /^(ox)en/i, "\\1" -
      16. -
        - -
        -
      17. - - - - - - # inflect.irregular "person", "people" -
      18. -
        - -
        -
      19. - - - - - - # inflect.uncountable %w( fish sheep ) -
      20. -
        - -
        -
      21. - - - - - - # end -
      22. -
        - -
        -
      23. - - - - - - -
      24. -
        - -
        -
      25. - - - - - - # These inflection rules are supported but not enabled by default: -
      26. -
        - -
        -
      27. - - - - - - # ActiveSupport::Inflector.inflections(:en) do |inflect| -
      28. -
        - -
        -
      29. - - - - - - # inflect.acronym "RESTful" -
      30. -
        - -
        -
      31. - - - - - - # end -
      32. -
        - -
      -
      -
      - - -
      -
      -

      config/routes.rb

      -

      - - 100.0% - - - lines covered -

      - - - -
      - 8 relevant lines. - 8 lines covered and - 0 lines missed. -
      - - - -
      - -
      -    
        - -
        -
      1. - 1 - - - - - Rails.application.routes.draw do -
      2. -
        - -
        -
      3. - - - - - - # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html -
      4. -
        - -
        -
      5. - - - - - - -
      6. -
        - -
        -
      7. - - - - - - # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500. -
      8. -
        - -
        -
      9. - - - - - - # Can be used by load balancers and uptime monitors to verify that the app is live. -
      10. -
        - -
        -
      11. - 1 - - - - - get "up" => "rails/health#show", as: :rails_health_check -
      12. -
        - -
        -
      13. - - - - - - -
      14. -
        - -
        -
      15. - - - - - - # Defines the root path route ("/") -
      16. -
        - -
        -
      17. - - - - - - # root "posts#index" -
      18. -
        - -
        -
      19. - 1 - - - - - namespace :api do -
      20. -
        - -
        -
      21. - 1 - - - - - namespace :v1 do -
      22. -
        - -
        -
      23. - 1 - - - - - resources :events, only: [:show, :create, :update, :destroy] -
      24. -
        - -
        -
      25. - 1 - - - - - resources :users, only: [:show, :create, :update, :destroy] -
      26. -
        - -
        -
      27. - 1 - - - - - resources :user_events, only: [:show, :create, :update, :destroy] -
      28. -
        - -
        -
      29. - 1 - - - - - resources :artists, only: [:index, :create, :destroy] -
      30. -
        - -
        -
      31. - - - - - - end -
      32. -
        - -
        -
      33. - - - - - - end -
      34. -
        - -
        -
      35. - - - - - - end -
      36. -
        - -
      -
      -
      - - -
      -
      -

      spec/factories/artist.rb

      -

      - - 100.0% - - - lines covered -

      - - - -
      - 4 relevant lines. - 4 lines covered and - 0 lines missed. -
      - - - -
      - -
      -    
        - -
        -
      1. - 1 - - - - - FactoryBot.define do -
      2. -
        - -
        -
      3. - 1 - - - - - factory :artist do -
      4. -
        - -
        -
      5. - 1 - - - - - name { Faker::Music.band } -
      6. -
        - -
        -
      7. - 1 - - - - - musicbrainz_id { SecureRandom.uuid } -
      8. -
        - -
        -
      9. - - - - - - end -
      10. -
        - -
        -
      11. - - - - - - end -
      12. -
        - -
      -
      -
      - - -
      -
      -

      spec/factories/users.rb

      -

      - - 100.0% - - - lines covered -

      - - - -
      - 4 relevant lines. - 4 lines covered and - 0 lines missed. -
      - - - -
      - -
      -    
        - -
        -
      1. - 1 - - - - - FactoryBot.define do -
      2. -
        - -
        -
      3. - 1 - - - - - factory :user do -
      4. -
        - -
        -
      5. - 1 - - - - - name { Faker::Name.name } -
      6. -
        - -
        -
      7. - 1 - - - - - email { Faker::Internet.email } -
      8. -
        - -
        -
      9. - - - - - - end -
      10. -
        - -
        -
      11. - - - - - - end -
      12. -
        - -
      -
      -
      - - -
      -
      - - From 44d473c1862dca7644c9ac5938351e1eeba1f440 Mon Sep 17 00:00:00 2001 From: Garrett Bowman Date: Thu, 12 Sep 2024 03:50:27 -0500 Subject: [PATCH 5/8] Feat: Get List of Artist by Search --- ...st_controller.rb => artists_controller.rb} | 2 +- app/facades/artist_facade.rb | 8 +++-- app/poros/artist.rb | 2 +- app/services/artist_service.rb | 2 +- spec/requests/api/v1/artist_request_spec.rb | 30 ++++++++++++------- 5 files changed, 28 insertions(+), 16 deletions(-) rename app/controllers/api/v1/{artist_controller.rb => artists_controller.rb} (92%) diff --git a/app/controllers/api/v1/artist_controller.rb b/app/controllers/api/v1/artists_controller.rb similarity index 92% rename from app/controllers/api/v1/artist_controller.rb rename to app/controllers/api/v1/artists_controller.rb index 214e77b..d30f8da 100644 --- a/app/controllers/api/v1/artist_controller.rb +++ b/app/controllers/api/v1/artists_controller.rb @@ -1,4 +1,4 @@ -class Api::V1::ArtistController < ApplicationController +class Api::V1::ArtistsController < ApplicationController def index if params[:name] artists = ArtistFacade.search_artists(params[:name]) diff --git a/app/facades/artist_facade.rb b/app/facades/artist_facade.rb index c7613ac..5f3d498 100644 --- a/app/facades/artist_facade.rb +++ b/app/facades/artist_facade.rb @@ -1,8 +1,12 @@ class ArtistFacade def self.search_artists(name) - artists_data = ArtistService.search_artists_by_name(name) + artists_data = ArtistService.get_artists_by_name(name) artists_data.map do |artist_data| - ArtistPoro.new(artist_data) + condensed_data = { + name: artist_data[:name], + id: artist_data[:id] + } + Artist.new(condensed_data) end end end \ No newline at end of file diff --git a/app/poros/artist.rb b/app/poros/artist.rb index 40af636..e5b50ca 100644 --- a/app/poros/artist.rb +++ b/app/poros/artist.rb @@ -3,6 +3,6 @@ class Artist def initialize(data) @name = data[:name] - @musicbrainz_id = data[:musicbrainz_id] + @musicbrainz_id = data[:id] end end \ No newline at end of file diff --git a/app/services/artist_service.rb b/app/services/artist_service.rb index 5d99db4..b631b52 100644 --- a/app/services/artist_service.rb +++ b/app/services/artist_service.rb @@ -6,7 +6,7 @@ def self.get_conn end end - def self.get_artist_by_name(name) + def self.get_artists_by_name(name) response = get_conn.get('/artist', { query: "artist:#{name}", fmt: 'json' }) JSON.parse(response.body, symbolize_names: true)[:artists] end diff --git a/spec/requests/api/v1/artist_request_spec.rb b/spec/requests/api/v1/artist_request_spec.rb index d25819a..91d1628 100644 --- a/spec/requests/api/v1/artist_request_spec.rb +++ b/spec/requests/api/v1/artist_request_spec.rb @@ -3,21 +3,29 @@ RSpec.describe "Api::V1::Artists", type: :request do describe "GET /api/v1/artists" do it "returns a list of artist matching search" do - artist_json = File.read('spec/fixtures/artist_search.json') + VCR.turned_off do + artist_json = File.read('spec/fixtures/artist_search.json') - stub_request(:get, "https://musicbrainz.org/ws/2/artist") - .with(query: { query: "Green", fmt: "json", limit: 10 }) - .to_return(status: 200, body: artist_json, headers: { 'Content-Type' => 'application/json' }) + stub_request(:get, "https://musicbrainz.org/artist?fmt=json&query=artist:Green"). + with( + headers: { + 'Accept'=>'*/*', + 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', + 'Content-Type'=>'application/json', + 'User-Agent'=>'Faraday v2.11.0' + }). + to_return(status: 200, body: artist_json, headers: { 'Content-Type' => 'application/json' }) - get "/api/v1/artists", params: { name: "Green" } + get "/api/v1/artists", params: { name: "Green" } - expect(response).to have_http_status(200) - data = JSON.parse(response.body, symbolize_names: true) + expect(response).to have_http_status(200) + data = JSON.parse(response.body, symbolize_names: true) - expect(data).to be_a(Hash) - expect(data).to have_key(:data) - expect(data[:data]).to be_an(Array) - expect(data[:data].count).to eq(25) + expect(data).to be_a(Hash) + expect(data).to have_key(:data) + expect(data[:data]).to be_an(Array) + expect(data[:data].count).to eq(10) + end end end end \ No newline at end of file From 332278f62d8f4e7ee63eafed46c208e57fd900b0 Mon Sep 17 00:00:00 2001 From: Garrett Bowman Date: Thu, 12 Sep 2024 03:55:14 -0500 Subject: [PATCH 6/8] Feat: Sad Path for get artist --- spec/requests/api/v1/artist_request_spec.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/spec/requests/api/v1/artist_request_spec.rb b/spec/requests/api/v1/artist_request_spec.rb index 91d1628..c201c0d 100644 --- a/spec/requests/api/v1/artist_request_spec.rb +++ b/spec/requests/api/v1/artist_request_spec.rb @@ -27,5 +27,15 @@ expect(data[:data].count).to eq(10) end end + it "returns an error if no search name is passed" do + VCR.turned_off do + get "/api/v1/artists" + + expect(response).to have_http_status(:bad_request) + data = JSON.parse(response.body, symbolize_names: true)[:errors] + expect(data).to be_an(Array) + expect(data.first[:detail]).to eq("Name parameter is required") + end + end end end \ No newline at end of file From 5fe31fb37d1b700f6f0c54ca48ed45492f4c9073 Mon Sep 17 00:00:00 2001 From: Garrett Bowman Date: Thu, 12 Sep 2024 05:16:58 -0500 Subject: [PATCH 7/8] Feat: Artist index search, and add/removing artist --- app/controllers/api/v1/artists_controller.rb | 38 +++++++++--- app/models/artist.rb | 2 +- app/models/user.rb | 2 +- spec/factories/user_artist.rb | 6 ++ spec/rails_helper.rb | 6 ++ spec/requests/api/v1/artist_request_spec.rb | 62 ++++++++++++++++++++ 6 files changed, 105 insertions(+), 11 deletions(-) create mode 100644 spec/factories/user_artist.rb diff --git a/app/controllers/api/v1/artists_controller.rb b/app/controllers/api/v1/artists_controller.rb index d30f8da..43f9127 100644 --- a/app/controllers/api/v1/artists_controller.rb +++ b/app/controllers/api/v1/artists_controller.rb @@ -1,8 +1,14 @@ class Api::V1::ArtistsController < ApplicationController def index if params[:name] - artists = ArtistFacade.search_artists(params[:name]) - render json: ArtistSerializer.new(artists) + begin + artists = ArtistFacade.search_artists(params[:name]) + render json: ArtistSerializer.new(artists) + rescue JSON::ParserError => e + render json: { errors: [{ detail: "Failed to parse response: #{e.message}" }] }, status: :internal_server_error + rescue StandardError => e + render json: ErrorSerializer.new(e).serialize_json, status: :internal_server_error + end else error = ErrorSerializer.new(StandardError.new('Name parameter is required')) render json: error.serialize_json, status: :bad_request @@ -11,15 +17,29 @@ def index def create user = User.find(params[:user_id]) - artist = Artist.find_or_create_by(name: params[:name], musicbrainz_id: params[:musicbrainz_id]) - user.artists << artist unless user.artists.include?(artist) - render json: user.artists + artist = Artist.find_or_create_by!(artist_params) + + UserArtist.find_or_create_by!(user: user, artist: artist) + + render json: artist, status: :ok + rescue ActiveRecord::RecordNotFound => e + render json: ErrorSerializer.new(e).serialize_json, status: :not_found + rescue ActiveRecord::RecordInvalid => e + render json: ErrorSerializer.new(e).serialize_json, status: :bad_request end def destroy - user = User.find(params[:user_id]) - artist = user.artists.find(params[:id]) - user.artists.delete(artist) - render json: user.artists + user_artist = UserArtist.find_by!(user_id: params[:user_id], artist_id: params[:id]) + user_artist.destroy + + render json: { message: "Artist removed from user's saved artists" }, status: :ok + rescue ActiveRecord::RecordNotFound => e + render json: ErrorSerializer.new(e).serialize_json, status: :not_found + end + + private + + def artist_params + params.require(:artist).permit(:name, :musicbrainz_id) end end \ No newline at end of file diff --git a/app/models/artist.rb b/app/models/artist.rb index 6180c10..341376b 100644 --- a/app/models/artist.rb +++ b/app/models/artist.rb @@ -1,5 +1,5 @@ class Artist < ApplicationRecord - has_many :user_artists, dependent: :destroy + has_many :user_artists has_many :users, through: :user_artists validates :name, presence: true diff --git a/app/models/user.rb b/app/models/user.rb index b7a8400..4e127b4 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,7 +1,7 @@ class User < ApplicationRecord has_many :user_events has_many :events, through: :user_events - has_many :user_artists, dependent: :destroy + has_many :user_artists, through: :user_artists has_many :artists, through: :user_artists validates :name, presence: true diff --git a/spec/factories/user_artist.rb b/spec/factories/user_artist.rb new file mode 100644 index 0000000..cb3da00 --- /dev/null +++ b/spec/factories/user_artist.rb @@ -0,0 +1,6 @@ +FactoryBot.define do + factory :user_artist do + user + artist + end +end \ No newline at end of file diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index ec5088c..d4678e5 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -1,5 +1,6 @@ # This file is copied to spec/ when you run 'rails generate rspec:install' require 'spec_helper' +require 'faker' require "simplecov" SimpleCov.start ENV['RAILS_ENV'] ||= 'test' @@ -80,5 +81,10 @@ require 'webmock/rspec' WebMock.disable_net_connect!(allow_localhost: true) + + RSpec.configure do |config| + config.include FactoryBot::Syntax::Methods + end + end diff --git a/spec/requests/api/v1/artist_request_spec.rb b/spec/requests/api/v1/artist_request_spec.rb index c201c0d..dfc3fbb 100644 --- a/spec/requests/api/v1/artist_request_spec.rb +++ b/spec/requests/api/v1/artist_request_spec.rb @@ -38,4 +38,66 @@ end end end + + describe "POST /api/v1/artists" do + + let(:user) { create(:user) } + let(:artist_params) { { artist: { name: "Green Day", musicbrainz_id: "id" }, user_id: user.id } } + + it "adds an artist to a user's artists" do + post "/api/v1/artists", params: artist_params + + expect(response).to have_http_status(:ok) + data = JSON.parse(response.body, symbolize_names: true) + + expect(data).to be_an(Hash) + expect(data).to have_key(:name) + expect(data[:name]).to eq("Green Day") + expect(data).to have_key(:musicbrainz_id) + expect(data[:musicbrainz_id]).to eq("id") + end + + it "returns an error if required parameters are missing" do + post "/api/v1/artists", params: { artist: { name: nil, musicbrainz_id: nil }, user_id: user.id } + + expect(response).to have_http_status(:bad_request) + data = JSON.parse(response.body, symbolize_names: true)[:errors] + expect(data).to be_an(Array) + expect(data.first[:detail]).to eq("Validation failed: Name can't be blank, Musicbrainz can't be blank") + end + + it "returns an error if the user does not exist" do + post "/api/v1/artists", params: { artist: { name: "Green Day", musicbrainz_id: "id" }, user_id: -1 } + + expect(response).to have_http_status(:not_found) + data = JSON.parse(response.body, symbolize_names: true)[:errors] + expect(data).to be_an(Array) + expect(data.first[:detail]).to eq("Couldn't find User with 'id'=-1") + end + end + + describe "DELETE /api/v1/artists/:id" do + let(:user) { create(:user) } + let(:artist) { create(:artist) } + let!(:user_artist) { create(:user_artist, user: user, artist: artist) } # Create the association + + it "deletes an artist from a user's saved artists" do + delete "/api/v1/artists/#{artist.id}", params: { user_id: user.id } + + expect(response).to have_http_status(:ok) + data = JSON.parse(response.body, symbolize_names: true) + + expect(data[:message]).to eq("Artist removed from user's saved artists") + end + + it "returns an error if the user does not exist" do + delete "/api/v1/artists/#{artist.id}", params: { user_id: -1 } + + expect(response).to have_http_status(:not_found) + data = JSON.parse(response.body, symbolize_names: true) + + expect(data[:errors]).to be_an(Array) + expect(data[:errors].first[:detail]).to eq("Couldn't find UserArtist with [WHERE \"user_artists\".\"user_id\" = $1 AND \"user_artists\".\"artist_id\" = $2]") + end + end end \ No newline at end of file From c222ff6ca2da10cd8ecab1ea325e577b2a9fd694 Mon Sep 17 00:00:00 2001 From: Garrett Bowman Date: Thu, 12 Sep 2024 05:26:41 -0500 Subject: [PATCH 8/8] Updated yml for CI --- .github/workflows/rubyonrails.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rubyonrails.yml b/.github/workflows/rubyonrails.yml index af3d220..a1152c5 100644 --- a/.github/workflows/rubyonrails.yml +++ b/.github/workflows/rubyonrails.yml @@ -50,7 +50,7 @@ jobs: with: bundler-cache: true - name: Generate binstubs - run: bundle binstubs bundler-audit brakeman rubocop + run: bundle binstubs bundler-audit brakeman # Add or replace any other lints here - name: Security audit dependencies run: bin/bundler-audit --update