metal_archives 2.2.0 → 2.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ci.yml +46 -0
  3. data/.github/workflows/release.yml +69 -0
  4. data/.gitignore +6 -6
  5. data/.overcommit.yml +35 -0
  6. data/.rspec +1 -0
  7. data/.rubocop.yml +54 -8
  8. data/.rubocop_todo.yml +92 -0
  9. data/CHANGELOG.md +22 -0
  10. data/Gemfile +1 -1
  11. data/LICENSE.md +1 -1
  12. data/README.md +35 -64
  13. data/Rakefile +8 -7
  14. data/bin/console +41 -0
  15. data/bin/setup +8 -0
  16. data/docker-compose.yml +14 -0
  17. data/lib/metal_archives.rb +48 -29
  18. data/lib/metal_archives/{utils/collection.rb → collection.rb} +0 -0
  19. data/lib/metal_archives/configuration.rb +9 -33
  20. data/lib/metal_archives/{error.rb → errors.rb} +0 -0
  21. data/lib/metal_archives/http_client.rb +13 -8
  22. data/lib/metal_archives/{utils/lru_cache.rb → lru_cache.rb} +0 -0
  23. data/lib/metal_archives/middleware/cache_check.rb +2 -4
  24. data/lib/metal_archives/middleware/encoding.rb +2 -2
  25. data/lib/metal_archives/middleware/headers.rb +5 -5
  26. data/lib/metal_archives/middleware/rewrite_endpoint.rb +2 -2
  27. data/lib/metal_archives/models/artist.rb +40 -24
  28. data/lib/metal_archives/models/band.rb +47 -29
  29. data/lib/metal_archives/models/base_model.rb +64 -61
  30. data/lib/metal_archives/models/label.rb +11 -11
  31. data/lib/metal_archives/models/release.rb +17 -15
  32. data/lib/metal_archives/{utils/nil_date.rb → nil_date.rb} +10 -18
  33. data/lib/metal_archives/parsers/artist.rb +62 -31
  34. data/lib/metal_archives/parsers/band.rb +97 -74
  35. data/lib/metal_archives/parsers/label.rb +21 -21
  36. data/lib/metal_archives/parsers/parser.rb +23 -8
  37. data/lib/metal_archives/parsers/release.rb +77 -72
  38. data/lib/metal_archives/{utils/range.rb → range.rb} +5 -2
  39. data/lib/metal_archives/version.rb +12 -1
  40. data/metal_archives.env.example +7 -0
  41. data/metal_archives.gemspec +40 -28
  42. data/nginx/default.conf +60 -0
  43. metadata +126 -65
  44. data/.travis.yml +0 -12
  45. data/spec/configuration_spec.rb +0 -96
  46. data/spec/factories/artist_factory.rb +0 -37
  47. data/spec/factories/band_factory.rb +0 -60
  48. data/spec/factories/nil_date_factory.rb +0 -9
  49. data/spec/factories/range_factory.rb +0 -8
  50. data/spec/models/artist_spec.rb +0 -138
  51. data/spec/models/band_spec.rb +0 -164
  52. data/spec/models/base_model_spec.rb +0 -219
  53. data/spec/models/release_spec.rb +0 -133
  54. data/spec/parser_spec.rb +0 -19
  55. data/spec/spec_helper.rb +0 -111
  56. data/spec/support/factory_girl.rb +0 -5
  57. data/spec/support/metal_archives.rb +0 -33
  58. data/spec/utils/collection_spec.rb +0 -72
  59. data/spec/utils/lru_cache_spec.rb +0 -53
  60. data/spec/utils/nil_date_spec.rb +0 -156
  61. data/spec/utils/range_spec.rb +0 -62
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- FactoryGirl.define do
4
- factory :artist, :class => MetalArchives::Artist do
5
- id { Faker::Number.number [1, 2, 3, 4].sample }
6
- name { Faker::Name.name }
7
- gender { %i[male female].sample }
8
- biography { Faker::Lorem.words(200).join ' ' }
9
- trivia { Faker::Lorem.words(200).join ' ' }
10
-
11
- country { ISO3166::Country[Faker::Address.country_code] }
12
- location { Faker::Address.city }
13
-
14
- date_of_birth { Faker::Date.birthday 18, 65 }
15
-
16
- links do
17
- 3.times.collect do
18
- {
19
- :url => Faker::Internet.url,
20
- :type => %i[official unofficial unlisted_bands].sample,
21
- :title => Faker::Lorem.words(4).join(' ')
22
- }
23
- end
24
- end
25
-
26
- trait :has_died do
27
- date_of_death { Faker::Date.between date_of_birth, Date.today }
28
- cause_of_death { %w(Suicide N/A Accident Cancer Illness Murder).sample }
29
- end
30
-
31
- trait :with_aliases do
32
- aliases do
33
- 3.times.collect { Faker::Name.name }
34
- end
35
- end
36
- end
37
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- FactoryGirl.define do
4
- factory :band, :class => MetalArchives::Band do
5
- id { Faker::Number.number [1, 2, 3, 4].sample }
6
- name { Faker::Name.name }
7
- status { %i[active split_up on_hold unknown changed_name disputed].sample }
8
-
9
- comment { Faker::Lorem.words(200).join ' ' }
10
-
11
- country { ISO3166::Country[Faker::Address.country_code] }
12
- location { Faker::Address.city }
13
-
14
- date_formed { Faker::Date.birthday 0, 50 }
15
- date_active { build_list :range }
16
-
17
- label { [build(:label), nil].sample }
18
- independent { label.nil? }
19
-
20
- logo { Faker::Internet.url }
21
- photo { Faker::Internet.url }
22
-
23
- genres do
24
- 3.times.collect do
25
- "#{%w(Black Death Doom Power Progressive Speed Thrash).sample} Metal"
26
- end
27
- end
28
-
29
- lyrical_themes do
30
- 3.times.collect do
31
- ['Fantasy', 'Epic battles', 'Tales', 'Myths', 'Legends', 'Feelings', 'Life', 'Eden', 'Glory', 'the Four Elements', 'Metal'].sample
32
- end
33
- end
34
-
35
- similar do
36
- 4.times.collect do
37
- {
38
- :band => build(:band),
39
- :score => Faker::Number.between(1, 100)
40
- }
41
- end
42
- end
43
-
44
- links do
45
- 3.times.collect do
46
- {
47
- :url => Faker::Internet.url,
48
- :type => %i[official unofficial unlisted_bands].sample,
49
- :title => Faker::Lorem.words(4).join(' ')
50
- }
51
- end
52
- end
53
-
54
- trait :with_aliases do
55
- aliases do
56
- 3.times.collect { Faker::Name.name }
57
- end
58
- end
59
- end
60
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- FactoryGirl.define do
4
- factory :nil_date, :class => MetalArchives::NilDate do
5
- year { Faker::Date.backward(99).year }
6
- month { Faker::Date.backward(99).month }
7
- day { Faker::Date.backward(99).day }
8
- end
9
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- FactoryGirl.define do
4
- factory :range, :class => MetalArchives::Range do
5
- send(:begin) { Faker::Date.birthday 0, 50 }
6
- send(:end) { Faker::Date.birthday }
7
- end
8
- end
@@ -1,138 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe MetalArchives::Artist do
4
- describe 'properties' do
5
- it 'Alberto Rionda has properties' do
6
- artist = MetalArchives::Artist.find 60908
7
-
8
- expect(artist).to be_instance_of MetalArchives::Artist
9
- expect(artist.id).to eq 60908
10
- expect(artist.name).to eq 'Alberto Rionda'
11
- expect(artist.aliases).to be_empty
12
- expect(artist.country).to eq ISO3166::Country['ES']
13
- expect(artist.location).to eq 'Oviedo, Asturias'
14
- expect(artist.date_of_birth).to eq MetalArchives::NilDate.new(1972, 9, 2)
15
- expect(artist.gender).to eq :male
16
- expect(artist.biography).to match 'Avalanch'
17
- expect(artist.trivia).to match 'Sanctuarium Estudios'
18
- expect(artist.photo).to be_instance_of URI::HTTPS
19
- expect(artist.photo.path).to eq '/images/6/0/9/0/60908_artist.jpg'
20
- end
21
-
22
- it 'Lemmy Kilmister has properties' do
23
- artist = MetalArchives::Artist.find 260
24
-
25
- expect(artist).to be_instance_of MetalArchives::Artist
26
- expect(artist.name).to eq 'Ian Fraser Kilmister'
27
- expect(artist.aliases).to include 'Lemmy Kilmister'
28
- expect(artist.date_of_death).to eq MetalArchives::NilDate.new(2015, 12, 28)
29
- expect(artist.links.length).to eq 5
30
- expect(artist.links.count { |l| l[:type] == :official }).to eq 1
31
- expect(artist.links.count { |l| l[:type] == :unofficial }).to eq 2
32
- expect(artist.links.count { |l| l[:type] == :unlisted_bands }).to eq 2
33
- expect(artist.links.select { |l| l[:type] == :official }.first[:url]).to eq 'https://www.facebook.com/OfficialLemmy'
34
- expect(artist.links.select { |l| l[:type] == :official }.first[:title]).to eq 'Facebook'
35
- end
36
-
37
- it 'maps query parameters' do
38
- expect(MetalArchives::Parsers::Artist.map_params(:name => 'name')[:query]).to eq 'name'
39
- end
40
-
41
- it 'uses NilDate' do
42
- artist = MetalArchives::Artist.find 35049
43
-
44
- expect(artist.name).to eq 'Johan Johansson'
45
- expect(artist.date_of_birth).to be_instance_of MetalArchives::NilDate
46
- expect(artist.date_of_birth).to eq MetalArchives::NilDate.new(1975, nil, nil)
47
- end
48
- end
49
-
50
- describe 'methods' do
51
- describe 'find' do
52
- it 'finds an artist' do
53
- artist = MetalArchives::Artist.find 60908
54
-
55
- expect(artist).to be_instance_of MetalArchives::Artist
56
- expect(artist.name).to eq 'Alberto Rionda'
57
- end
58
-
59
- it 'lazily loads' do
60
- artist = MetalArchives::Artist.find -1
61
-
62
- expect(artist).to be_instance_of MetalArchives::Artist
63
- end
64
- end
65
-
66
- describe 'find!' do
67
- it 'finds an artist' do
68
- artist = MetalArchives::Artist.find! 60908
69
-
70
- expect(artist).to be_instance_of MetalArchives::Artist
71
- expect(artist.name).to eq 'Alberto Rionda'
72
- end
73
-
74
- it 'raises on invalid id' do
75
- expect(-> { MetalArchives::Artist.find! -1 }).to raise_error MetalArchives::Errors::APIError
76
- expect(-> { MetalArchives::Artist.find! 0 }).to raise_error MetalArchives::Errors::InvalidIDError
77
- expect(-> { MetalArchives::Artist.find! nil }).to raise_error MetalArchives::Errors::InvalidIDError
78
- end
79
- end
80
-
81
- describe 'find_by' do
82
- it 'finds an artist' do
83
- artist = MetalArchives::Artist.find_by :name => 'Alberto Rionda'
84
-
85
- expect(artist).to be_instance_of MetalArchives::Artist
86
- expect(artist.id).to eq 60908
87
- end
88
-
89
- it 'returns nil on invalid id' do
90
- artist = MetalArchives::Artist.find_by :name => 'SomeNonExistantName'
91
-
92
- expect(artist).to be_nil
93
- end
94
- end
95
-
96
- describe 'find_by!' do
97
- it 'finds an artist' do
98
- artist = MetalArchives::Artist.find_by! :name => 'Alberto Rionda'
99
-
100
- expect(artist).to be_instance_of MetalArchives::Artist
101
- expect(artist.id).to eq 60908
102
- end
103
-
104
- it 'returns nil on invalid id' do
105
- artist = MetalArchives::Artist.find_by! :name => 'SomeNonExistantName'
106
-
107
- expect(artist).to be_nil
108
- end
109
- end
110
-
111
- describe 'search' do
112
- it 'returns a collection' do
113
- collection = MetalArchives::Artist.search 'Alberto Rionda'
114
-
115
- expect(collection).to be_instance_of MetalArchives::Collection
116
- expect(collection.first).to be_instance_of MetalArchives::Artist
117
- end
118
-
119
- it 'returns a collection' do
120
- expect(MetalArchives::Artist.search('Alberto Rionda').count).to eq 1
121
- expect(MetalArchives::Artist.search('Name').count).to eq 10
122
- expect(MetalArchives::Artist.search('SomeNonExistantName').count).to eq 0
123
- expect(MetalArchives::Artist.search 'SomeNonExistantName').to be_empty
124
- expect(MetalArchives::Artist.search('Filip').count).to be > 200
125
- end
126
-
127
- it 'returns an empty collection' do
128
- expect(MetalArchives::Artist.search 'SomeNoneExistantName').to be_empty
129
- end
130
- end
131
-
132
- describe 'all' do
133
- it 'returns a collection' do
134
- expect(MetalArchives::Artist.all).to be_instance_of MetalArchives::Collection
135
- end
136
- end
137
- end
138
- end
@@ -1,164 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe MetalArchives::Band do
4
- describe 'properties' do
5
- it 'Pathfinder has properties' do
6
- band = MetalArchives::Band.find 122302
7
-
8
- expect(band).to be_instance_of MetalArchives::Band
9
- expect(band.name).to eq 'Pathfinder'
10
- expect(band.aliases).to be_empty
11
- expect(band.country).to eq ISO3166::Country['PL']
12
- expect(band.location).to eq 'Poznań'
13
- expect(band.date_formed).to eq MetalArchives::NilDate.new(2006)
14
- expect(band.date_active).to eq [MetalArchives::Range.new(Date.new(2006), nil)]
15
- expect(band.status).to eq :active
16
- expect(band.genres).to eq ['Symphonic Power']
17
- expect(band.lyrical_themes.sort).to eq ['Fantasy', 'Battles', 'Glory', 'The Four Elements', 'Metal'].sort
18
- expect(band.comment).to match 'Pathfinder was founded by'
19
- expect(band.logo).to be_instance_of URI::HTTPS
20
- expect(band.logo.path).to eq '/images/1/2/2/3/122302_logo.jpg'
21
- expect(band.photo).to be_instance_of URI::HTTPS
22
- expect(band.photo.path).to eq '/images/1/2/2/3/122302_photo.jpg'
23
- expect(band.independent).not_to be true
24
- expect(band.similar.length).to eq 19
25
- expect(band.links.length).to eq 15
26
- expect(band.links.count { |l| l[:type] == :official }).to eq 12
27
- expect(band.links.count { |l| l[:type] == :merchandise }).to eq 3
28
- expect(band.links.select { |l| l[:type] == :merchandise }.first[:url]).to eq 'http://www.amazon.com/Fifth-Element-Pathfinder/dp/B007MNNCVW'
29
- expect(band.links.select { |l| l[:type] == :merchandise }.first[:title]).to eq 'Amazon'
30
- end
31
-
32
- it 'Lemmy Kilmister has properties' do
33
- band = MetalArchives::Band.find 32
34
-
35
- expect(band).to be_instance_of MetalArchives::Band
36
- expect(band.name).to eq 'Rhapsody of Fire'
37
- expect(band.aliases).to match %w(Thundercross Rhapsody)
38
- end
39
-
40
- it 'maps status' do
41
- expect(MetalArchives::Parsers::Band.send(:map_status, nil)).to eq ''
42
- expect(MetalArchives::Parsers::Band.send(:map_status, :active)).to eq 'Active'
43
- expect(MetalArchives::Parsers::Band.send(:map_status, :split_up)).to eq 'Split-up'
44
- expect(MetalArchives::Parsers::Band.send(:map_status, :on_hold)).to eq 'On hold'
45
- expect(MetalArchives::Parsers::Band.send(:map_status, :unknown)).to eq 'Unknown'
46
- expect(MetalArchives::Parsers::Band.send(:map_status, :changed_name)).to eq 'Changed name'
47
- expect(MetalArchives::Parsers::Band.send(:map_status, :disputed)).to eq 'Disputed'
48
-
49
- expect(-> { MetalArchives::Parsers::Band.send(:map_status, :invalid_status) }).to raise_error MetalArchives::Errors::ParserError
50
- end
51
- end
52
-
53
- describe 'methods' do
54
- describe 'find' do
55
- it 'finds a band' do
56
- band = MetalArchives::Band.find 3540361100
57
-
58
- expect(band).not_to be_nil
59
- expect(band).to be_instance_of MetalArchives::Band
60
- expect(band.id).to eq 3540361100
61
- expect(band.name).to eq 'Alquimia'
62
- expect(band.country).to eq ISO3166::Country['ES']
63
-
64
- expect(band.logo).to be_instance_of URI::HTTPS
65
- expect(band.logo.path).to eq '/images/3/5/4/0/3540361100_logo.gif'
66
-
67
- expect(band.photo).to be_instance_of URI::HTTPS
68
- expect(band.photo.path).to eq '/images/3/5/4/0/3540361100_photo.jpg'
69
- end
70
-
71
- it 'lazily loads' do
72
- band = MetalArchives::Band.find -1
73
-
74
- expect(band).to be_instance_of MetalArchives::Band
75
- end
76
- end
77
-
78
- describe 'find!' do
79
- it 'finds a band' do
80
- band = MetalArchives::Band.find! 3540361100
81
-
82
- expect(band).to be_instance_of MetalArchives::Band
83
- expect(band.name).to eq 'Alquimia'
84
- end
85
-
86
- it 'raises on invalid id' do
87
- expect(-> { MetalArchives::Band.find! -1 }).to raise_error MetalArchives::Errors::APIError
88
- expect(-> { MetalArchives::Band.find! 0 }).to raise_error MetalArchives::Errors::InvalidIDError
89
- expect(-> { MetalArchives::Band.find! nil }).to raise_error MetalArchives::Errors::InvalidIDError
90
- end
91
- end
92
-
93
- describe 'find_by' do
94
- it 'finds a band' do
95
- band = MetalArchives::Band.find_by :name => 'Falconer'
96
-
97
- expect(band).to be_instance_of MetalArchives::Band
98
- expect(band.id).to eq 74
99
- end
100
-
101
- it 'returns nil on invalid id' do
102
- band = MetalArchives::Band.find_by :name => 'SomeNonExistantName'
103
-
104
- expect(band).to be_nil
105
- end
106
- end
107
-
108
- describe 'find_by!' do
109
- it 'finds a band' do
110
- band = MetalArchives::Band.find_by! :name => 'Falconer'
111
-
112
- expect(band).to be_instance_of MetalArchives::Band
113
- expect(band.id).to eq 74
114
- end
115
-
116
- it 'returns nil on invalid id' do
117
- band = MetalArchives::Band.find_by! :name => 'SomeNonExistantName'
118
-
119
- expect(band).to be_nil
120
- end
121
- end
122
-
123
- describe 'search' do
124
- it 'returns a collection' do
125
- collection = MetalArchives::Band.search 'Alquimia'
126
-
127
- expect(collection).to be_instance_of MetalArchives::Collection
128
- expect(collection.first).to be_instance_of MetalArchives::Band
129
- end
130
-
131
- it 'returns an empty collection' do
132
- expect(MetalArchives::Band.search 'SomeNoneExistantName').to be_empty
133
- end
134
-
135
- it 'searches by name' do
136
- expect(MetalArchives::Band.search_by(:name => 'Alquimia').count).to eq 5
137
- expect(MetalArchives::Band.search_by(:name => 'Lost Horizon').count).to eq 3
138
- expect(MetalArchives::Band.search_by(:name => 'Lost Horizon', :exact => true).count).to eq 2
139
- expect(MetalArchives::Band.search_by(:name => 'Alquimia', :genre => 'Melodic Power').count).to eq 2
140
- end
141
-
142
- it 'searches by year' do
143
- expect(MetalArchives::Band.search_by(:name => 'Alquimia', :year => MetalArchives::Range.new(nil, nil)).count).to eq 5
144
- expect(MetalArchives::Band.search_by(:name => 'Alquimia', :year => MetalArchives::Range.new(Date.new(2013), nil)).count).to eq 1
145
- expect(MetalArchives::Band.search_by(:name => 'Alquimia', :year => MetalArchives::Range.new(Date.new(2008), Date.new(2008))).count).to eq 1
146
- expect(MetalArchives::Band.search_by(:name => 'Alquimia', :year => MetalArchives::Range.new(Date.new(2008), Date.new(2013))).count).to eq 2
147
- expect(MetalArchives::Band.search_by(:name => 'Alquimia', :year => MetalArchives::Range.new(nil, Date.new(2013))).count).to eq 5
148
- end
149
-
150
- it 'searches by country' do
151
- expect(MetalArchives::Band.search_by(:name => 'Alquimia', :country => ISO3166::Country['ES']).count).to eq 1
152
- expect(MetalArchives::Band.search_by(:name => 'Alquimia', :country => ISO3166::Country['AR']).count).to eq 3
153
- expect(MetalArchives::Band.search_by(:name => 'Alquimia', :country => ISO3166::Country['AR']).count).to eq 3
154
- expect(MetalArchives::Band.search_by(:name => 'Alquimia', :label => 'Mutus Liber').count).to eq 1
155
- end
156
- end
157
-
158
- describe 'all' do
159
- it 'returns a collection' do
160
- expect(MetalArchives::Band.all).to be_instance_of MetalArchives::Collection
161
- end
162
- end
163
- end
164
- end
@@ -1,219 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
-
4
- ##
5
- # Sample model without :id property or :assemble method
6
- #
7
- class ModelOne < MetalArchives::BaseModel
8
- property :property_one
9
- end
10
-
11
- ##
12
- # Sample model without :assemble method
13
- #
14
- class ModelTwo < MetalArchives::BaseModel
15
- property :id
16
- property :property_one
17
- end
18
-
19
- ##
20
- # Sample complete model
21
- #
22
- class ModelThree < MetalArchives::BaseModel
23
- property :id
24
- property :property_one
25
-
26
- def assemble
27
- { :property_one => 'Property One' }
28
- end
29
- end
30
-
31
- ##
32
- # Sample complete model
33
- #
34
- class ModelFour < MetalArchives::BaseModel
35
- property :id
36
- property :property_one
37
-
38
- def assemble
39
- { :property_one => 'Property One' }
40
- end
41
- end
42
-
43
- ##
44
- # Sample invalid model
45
- #
46
- class ModelFive < MetalArchives::BaseModel
47
- property :id
48
- property :property_one
49
-
50
- def assemble
51
- raise MetalArchives::Errors::APIError
52
- end
53
- end
54
-
55
- RSpec.describe MetalArchives::BaseModel do
56
- it 'requires an :id property' do
57
- expect(-> { ModelOne.new(:property_one => 'foo') }).to raise_error MetalArchives::Errors::NotImplementedError
58
- end
59
-
60
- it 'requires an :assemble method' do
61
- expect(-> { ModelTwo.new(:id => 'foo').property_one }).to raise_error MetalArchives::Errors::NotImplementedError
62
- end
63
-
64
- it 'defines methods' do
65
- model = ModelTwo.new :id => 'foo'
66
-
67
- expect(model).to respond_to :id
68
- expect(model).to respond_to :id=
69
- expect(model).to respond_to :id?
70
- expect(model).to respond_to :property_one
71
- expect(model).to respond_to :property_one=
72
- expect(model).to respond_to :property_one?
73
- expect(model).not_to respond_to :property_two
74
- expect(model).not_to respond_to :property_two=
75
- expect(model).not_to respond_to :property_two?
76
- end
77
-
78
- it 'returns properties' do
79
- model = ModelThree.new :id => 'foo', :property_one => 'bar'
80
-
81
- model.instance_eval { |m| @loaded = true }
82
- expect(model.id).to eq 'foo'
83
- expect(model.property_one).to eq 'bar'
84
- end
85
-
86
- it 'sets properties' do
87
- model = ModelThree.new :id => 'foo', :property_one => 'bar'
88
-
89
- model.instance_eval { |m| @loaded = true }
90
- model.id = 'baz'
91
- model.property_one = 'bat'
92
-
93
- expect(model.id).to eq 'baz'
94
- expect(model.property_one).to eq 'bat'
95
- end
96
-
97
- it 'checks properties' do
98
- model = ModelThree.new :id => 'foo', :property_one => 'bar'
99
- model2 = ModelThree.new :id => 'foo'
100
- model2.load!
101
- model2.property_one = nil
102
-
103
- expect(model.id?).to be true
104
- expect(model.property_one?).to be true
105
-
106
- expect(model2.id?).to be true
107
- expect(model2.property_one?).to be false
108
- end
109
-
110
- it 'calls assemble' do
111
- model = ModelThree.new :id => 'foo'
112
-
113
- expect(model.id).to eq 'foo'
114
- expect(model.property_one).to eq 'Property One'
115
- end
116
-
117
- it 'lazily loads' do
118
- model = ModelThree.new :id => 'foo'
119
-
120
- expect(model).to be_instance_variable_defined '@id'
121
- expect(model).not_to be_instance_variable_defined '@property_one'
122
-
123
- model.property_one
124
-
125
- expect(model).to be_instance_variable_defined '@id'
126
- expect(model).to be_instance_variable_defined '@property_one'
127
- expect(model.property_one).to eq 'Property One'
128
- end
129
-
130
-
131
- it 'implements the load! operation' do
132
- model = ModelThree.new :id => 'foo'
133
-
134
- expect(model).to be_instance_variable_defined '@id'
135
- expect(model).not_to be_instance_variable_defined '@property_one'
136
-
137
- model.load!
138
-
139
- expect(model).to be_instance_variable_defined '@id'
140
- expect(model).to be_instance_variable_defined '@property_one'
141
- expect(model.property_one).to eq 'Property One'
142
- end
143
-
144
- it 'implements the equal operator' do
145
- m1 = ModelThree.new :id => 'id_one'
146
- m2 = ModelThree.new :id => 'id_one'
147
- m3 = ModelThree.new :id => 'id_two'
148
- m4 = ModelFour.new :id => 'id_one'
149
-
150
- expect(m1).to eq m2
151
- expect(m2).not_to eq m3
152
- expect(m1).not_to eq m3
153
- expect(m1).not_to eq m4
154
- expect(m2).not_to eq m4
155
- end
156
-
157
- describe 'loaded?' do
158
- it 'has a :loaded? method' do
159
- expect(ModelThree.new).to respond_to :loaded?
160
- end
161
-
162
- it 'returns false on lazy load' do
163
- m = ModelThree.new :id => 'id_one'
164
-
165
- expect(m).not_to be_loaded
166
- end
167
-
168
- it 'returns true on load!' do
169
- m = ModelThree.new :id => 'id_one'
170
- m.load!
171
-
172
- expect(m).to be_loaded
173
- end
174
- end
175
-
176
- describe 'cached?' do
177
- context 'valid model' do
178
- it 'has a :cached? method' do
179
- expect(ModelThree.new).to respond_to :cached?
180
- end
181
-
182
- it "doesn't cache lazily loaded objects" do
183
- m = ModelThree.new :id => 'id_one'
184
-
185
- expect(m).not_to be_loaded
186
- expect(m).not_to be_cached
187
- end
188
-
189
- it 'caches loaded objects' do
190
- m = ModelThree.new :id => 'id_one'
191
- m.load!
192
-
193
- expect(m).to be_loaded
194
- expect(m).to be_cached
195
- end
196
- end
197
-
198
- context 'invalid model' do
199
- it 'has a :cached? method' do
200
- expect(ModelFive.new).to respond_to :cached?
201
- end
202
-
203
- it "doesn't cache lazily loaded objects" do
204
- m = ModelFive.new :id => 'id_one'
205
-
206
- expect(m).not_to be_loaded
207
- expect(m).not_to be_cached
208
- end
209
-
210
- it "doesn't cache loaded invalid objects" do
211
- m = ModelFive.new :id => 'id_one'
212
- expect(-> { m.load! }).to raise_error MetalArchives::Errors::APIError
213
-
214
- expect(m).not_to be_loaded
215
- expect(m).not_to be_cached
216
- end
217
- end
218
- end
219
- end