metal_archives 2.2.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ci.yml +93 -0
  3. data/.gitignore +6 -6
  4. data/.overcommit.yml +35 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +66 -6
  7. data/CHANGELOG.md +33 -0
  8. data/Gemfile +1 -1
  9. data/LICENSE.md +17 -4
  10. data/README.md +65 -86
  11. data/Rakefile +8 -7
  12. data/bin/console +38 -0
  13. data/bin/setup +8 -0
  14. data/config/inflections.rb +7 -0
  15. data/config/initializers/.keep +0 -0
  16. data/docker-compose.yml +23 -0
  17. data/lib/metal_archives.rb +82 -27
  18. data/lib/metal_archives/cache/base.rb +40 -0
  19. data/lib/metal_archives/cache/memory.rb +68 -0
  20. data/lib/metal_archives/cache/null.rb +22 -0
  21. data/lib/metal_archives/cache/redis.rb +49 -0
  22. data/lib/metal_archives/{utils/collection.rb → collection.rb} +3 -5
  23. data/lib/metal_archives/configuration.rb +33 -50
  24. data/lib/metal_archives/{error.rb → errors.rb} +9 -1
  25. data/lib/metal_archives/http_client.rb +45 -44
  26. data/lib/metal_archives/models/artist.rb +90 -45
  27. data/lib/metal_archives/models/band.rb +77 -52
  28. data/lib/metal_archives/models/base.rb +225 -0
  29. data/lib/metal_archives/models/label.rb +14 -15
  30. data/lib/metal_archives/models/release.rb +25 -29
  31. data/lib/metal_archives/parsers/artist.rb +86 -50
  32. data/lib/metal_archives/parsers/band.rb +155 -88
  33. data/lib/metal_archives/parsers/base.rb +14 -0
  34. data/lib/metal_archives/parsers/country.rb +21 -0
  35. data/lib/metal_archives/parsers/date.rb +31 -0
  36. data/lib/metal_archives/parsers/genre.rb +67 -0
  37. data/lib/metal_archives/parsers/label.rb +39 -31
  38. data/lib/metal_archives/parsers/parser.rb +18 -63
  39. data/lib/metal_archives/parsers/release.rb +98 -89
  40. data/lib/metal_archives/parsers/year.rb +31 -0
  41. data/lib/metal_archives/version.rb +12 -1
  42. data/metal_archives.env.example +10 -0
  43. data/metal_archives.gemspec +43 -28
  44. data/nginx/default.conf +60 -0
  45. metadata +179 -74
  46. data/.travis.yml +0 -12
  47. data/lib/metal_archives/middleware/cache_check.rb +0 -20
  48. data/lib/metal_archives/middleware/encoding.rb +0 -16
  49. data/lib/metal_archives/middleware/headers.rb +0 -38
  50. data/lib/metal_archives/middleware/rewrite_endpoint.rb +0 -38
  51. data/lib/metal_archives/models/base_model.rb +0 -215
  52. data/lib/metal_archives/utils/lru_cache.rb +0 -61
  53. data/lib/metal_archives/utils/nil_date.rb +0 -99
  54. data/lib/metal_archives/utils/range.rb +0 -66
  55. data/spec/configuration_spec.rb +0 -96
  56. data/spec/factories/artist_factory.rb +0 -37
  57. data/spec/factories/band_factory.rb +0 -60
  58. data/spec/factories/nil_date_factory.rb +0 -9
  59. data/spec/factories/range_factory.rb +0 -8
  60. data/spec/models/artist_spec.rb +0 -138
  61. data/spec/models/band_spec.rb +0 -164
  62. data/spec/models/base_model_spec.rb +0 -219
  63. data/spec/models/release_spec.rb +0 -133
  64. data/spec/parser_spec.rb +0 -19
  65. data/spec/spec_helper.rb +0 -111
  66. data/spec/support/factory_girl.rb +0 -5
  67. data/spec/support/metal_archives.rb +0 -33
  68. data/spec/utils/collection_spec.rb +0 -72
  69. data/spec/utils/lru_cache_spec.rb +0 -53
  70. data/spec/utils/nil_date_spec.rb +0 -156
  71. data/spec/utils/range_spec.rb +0 -62
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.configure do |config|
4
- config.include FactoryGirl::Syntax::Methods
5
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'metal_archives'
4
-
5
- MetalArchives.configure do |c|
6
- ## Application identity (required)
7
- c.app_name = 'MetalArchivesGemTestSuite'
8
- c.app_version = MetalArchives::VERSION
9
- c.app_contact = 'user@example.com'
10
-
11
- if ENV.has_key? 'TRAVIS'
12
- ## Request throttling (optional, overrides defaults)
13
- c.request_rate = 1
14
- c.request_timeout = 3
15
- end
16
-
17
- ## Connect additional Faraday middleware
18
- # c.middleware = [MyMiddleware, MyOtherMiddleware]
19
-
20
- ## Custom cache size per object class (optional, overrides defaults)
21
- # c.cache_size = 100
22
-
23
- ## Metal Archives endpoint (optional, overrides default)
24
- c.endpoint = ENV['MA_ENDPOINT'] if ENV['MA_ENDPOINT']
25
-
26
- if ENV['MA_ENDPOINT']
27
- puts "Using '#{ENV['MA_ENDPOINT']}' as MA endpoint"
28
- end
29
-
30
- ## Custom logger (optional)
31
- c.logger = Logger.new STDOUT
32
- c.logger.level = Logger::INFO
33
- end
@@ -1,72 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe MetalArchives::Collection do
4
- it 'iterates' do
5
- l = lambda do
6
- @i ||= 0
7
-
8
- next [] if @i >= 100
9
- items = (@i .. (@i + 9)).to_a
10
- @i += 10
11
-
12
- items
13
- end
14
-
15
- c = MetalArchives::Collection.new l
16
-
17
- i = 0
18
- c.each do |item|
19
- expect(item).to eq i
20
- i += 1
21
- end
22
- end
23
-
24
- it 'returns' do
25
- l = lambda do
26
- @i ||= 0
27
-
28
- raise StandardError if @i >= 100
29
- items = (@i .. (@i + 9)).to_a
30
- @i += 10
31
-
32
- items
33
- end
34
-
35
- c = MetalArchives::Collection.new l
36
-
37
- i = 0
38
- c.each do |item|
39
- break if i == 99
40
- expect(item).to eq i
41
- i += 1
42
- end
43
-
44
- expect(i).to eq 99
45
- end
46
-
47
- describe 'empty?' do
48
- it 'is not empty' do
49
- l = lambda do
50
- @i ||= 0
51
-
52
- next [] if @i >= 100
53
- items = (@i .. (@i + 9)).to_a
54
- @i += 10
55
-
56
- items
57
- end
58
-
59
- c = MetalArchives::Collection.new l
60
-
61
- i = 0
62
-
63
- expect(c).not_to be_empty
64
- end
65
-
66
- it 'is empty' do
67
- c = MetalArchives::Collection.new -> { [] }
68
-
69
- expect(c).to be_empty
70
- end
71
- end
72
- end
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe MetalArchives::LRUCache do
4
- let(:cache) { MetalArchives::LRUCache.new 3 }
5
-
6
- it 'stores and retrieves objects' do
7
- cache[:key] = 'MyString'
8
-
9
- expect(cache[:key]).to eq 'MyString'
10
- end
11
-
12
- it 'clears cache' do
13
- cache[:key] = 'MyString'
14
- cache.clear
15
-
16
- expect(cache[:key]).to be_nil
17
- end
18
-
19
- it 'peeks' do
20
- expect(cache).not_to include :key
21
-
22
- cache[:key] = 'MyString'
23
-
24
- expect(cache).to include :key
25
- end
26
-
27
- it 'deletes' do
28
- cache[:key] = 'MyString'
29
-
30
- expect(cache).to include :key
31
-
32
- cache.delete :key
33
-
34
- expect(cache).not_to include :key
35
- end
36
-
37
- it 'implements LRU caching' do
38
- cache[:a] = 'one'
39
- cache[:b] = 'two'
40
- cache[:c] = 'three'
41
-
42
- expect(cache.instance_variable_get '@size').to eq 3
43
-
44
- cache[:d] = 'four'
45
-
46
- expect(cache.instance_variable_get '@size').to eq 3
47
-
48
- expect(cache[:b]).to eq 'two'
49
- expect(cache[:c]).to eq 'three'
50
- expect(cache[:d]).to eq 'four'
51
- expect(cache[:a]).to be_nil
52
- end
53
- end
@@ -1,156 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe MetalArchives::NilDate do
4
- let(:date) { build :nil_date }
5
- let(:date_without_day) { build :nil_date, :day => nil }
6
- let(:date_without_month) { build :nil_date, :month => nil }
7
-
8
- it 'has the correct properties' do
9
- expect(date).to respond_to :year
10
- expect(date).to respond_to :year=
11
- expect(date).to respond_to :year?
12
-
13
- expect(date).to respond_to :month
14
- expect(date).to respond_to :month=
15
- expect(date).to respond_to :month?
16
-
17
- expect(date).to respond_to :day
18
- expect(date).to respond_to :day=
19
- expect(date).to respond_to :day?
20
- end
21
-
22
- it 'returns the correct values' do
23
- expect(date.year).not_to be_nil
24
- expect(date.year).to be_an Integer
25
- expect(date.year?).to be true
26
-
27
- expect(date.month).not_to be_nil
28
- expect(date.month).to be_an Integer
29
- expect(date.month?).to be true
30
-
31
- expect(date.day).not_to be_nil
32
- expect(date.day).to be_an Integer
33
- expect(date.day?).to be true
34
- end
35
-
36
- it 'does not require a day' do
37
- expect(date_without_day.day).to be_nil
38
- expect(date_without_day.day?).to be false
39
- end
40
-
41
- it 'does not require a month' do
42
- expect(date_without_month.month).to be_nil
43
- expect(date_without_month.month?).to be false
44
- end
45
-
46
- it 'returns a date' do
47
- expect(date.date).to be_a Date
48
- expect(date.date.year).to eq date.year
49
- expect(date.date.month).to eq date.month
50
- expect(date.date.day).to eq date.day
51
- end
52
-
53
- describe 'parsing' do
54
- it 'parses empty dates' do
55
- date = described_class.parse ''
56
-
57
- expect(date.year?).to be false
58
- expect(date.month?).to be false
59
- expect(date.day?).to be false
60
- end
61
-
62
- it 'parses dates with year only' do
63
- date = described_class.parse '2012'
64
-
65
- expect(date.year?).to be true
66
- expect(date.year).to eq 2012
67
- expect(date.month?).to be false
68
- expect(date.day?).to be false
69
- end
70
-
71
- it 'parses parses dates with year and month' do
72
- date = described_class.parse '2012-10'
73
-
74
- expect(date.year?).to be true
75
- expect(date.year).to eq 2012
76
- expect(date.month?).to be true
77
- expect(date.month).to eq 10
78
- expect(date.day?).to be false
79
- end
80
-
81
- it 'parses dates with leading zeroes' do
82
- date = described_class.parse '2017-01-00'
83
-
84
- expect(date.year).to eq 2017
85
- expect(date.month).to eq 1
86
- expect(date.day).to eq nil
87
- end
88
-
89
- it 'parses full dates' do
90
- date = described_class.parse '2012-10-02'
91
-
92
- expect(date.year?).to be true
93
- expect(date.year).to eq 2012
94
- expect(date.month?).to be true
95
- expect(date.month).to eq 10
96
- expect(date.day?).to be true
97
- expect(date.day).to eq 2
98
- end
99
-
100
- it 'does not parse on invalid dates' do
101
- expect(-> { described_class.parse 'October 2nd, 2012' }).to raise_error MetalArchives::Errors::ArgumentError
102
- expect(-> { described_class.parse 'a-b-c' }).to raise_error MetalArchives::Errors::ArgumentError
103
- expect(-> { described_class.parse "This isn't a date" }).to raise_error MetalArchives::Errors::ArgumentError
104
- end
105
- end
106
-
107
- it 'includes comparable' do
108
- date1 = described_class.new 2015, 01, 01
109
- date2 = described_class.new 2015, 01, 02
110
- date3 = described_class.new 2015, 02, 01
111
- date4 = described_class.new 2016, 01, 02
112
- date5 = described_class.new 2015, 01, 01
113
- date6 = described_class.new 2014, 12, 31
114
- date7 = described_class.new 2015, 01, nil
115
- date8 = described_class.new 2015, 01, nil
116
- date9 = described_class.new 2015, 02, nil
117
- date10 = described_class.new 2015, nil, nil
118
- date11 = described_class.new 2016, nil, nil
119
-
120
- expect(date1 <=> date2).to eq -1
121
- expect(date2 <=> date1).to eq 1
122
- expect(date1 <=> date3).to eq -1
123
- expect(date3 <=> date1).to eq 1
124
- expect(date1 <=> date4).to eq -1
125
- expect(date4 <=> date1).to eq 1
126
- expect(date1 <=> date5).to eq 0
127
- expect(date5 <=> date1).to eq 0
128
- expect(date6 <=> date1).to eq -1
129
- expect(date1 <=> date6).to eq 1
130
-
131
- expect(date1 <=> date7).to eq nil
132
- expect(date7 <=> date1).to eq nil
133
- expect(date1 <=> date9).to eq nil
134
- expect(date9 <=> date1).to eq nil
135
- expect(date7 <=> date8).to eq 0
136
- expect(date8 <=> date7).to eq 0
137
- expect(date7 <=> date9).to eq -1
138
- expect(date9 <=> date7).to eq 1
139
- expect(date7 <=> date10).to eq nil
140
- expect(date10 <=> date7).to eq nil
141
- expect(date10 <=> date11).to eq -1
142
- expect(date11 <=> date10).to eq 1
143
- end
144
-
145
- it 'prints to string' do
146
- date1 = described_class.new 2015, nil, nil
147
- date2 = described_class.new 2015, 01, nil
148
- date3 = described_class.new 2015, 01, 01
149
- date4 = described_class.new 2015, nil, 01
150
-
151
- expect(date1.to_s).to eq '2015-00-00'
152
- expect(date2.to_s).to eq '2015-01-00'
153
- expect(date3.to_s).to eq '2015-01-01'
154
- expect(date4.to_s).to eq '2015-00-01'
155
- end
156
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe MetalArchives::Range do
4
- let(:range) { build :range }
5
- let(:begin_range) { build :range, :end => nil }
6
- let(:end_range) { build :range, :begin => nil }
7
-
8
- it 'has the correct properties' do
9
- expect(range).to respond_to :begin
10
- expect(range).to respond_to :begin=
11
- expect(range).to respond_to :begin?
12
-
13
- expect(range).to respond_to :end
14
- expect(range).to respond_to :end=
15
- expect(range).to respond_to :end?
16
- end
17
-
18
- it 'returns the correct values' do
19
- expect(range.begin).not_to be_nil
20
- expect(range.begin).to be_a Date
21
- expect(range.begin?).to be true
22
-
23
- expect(range.end).not_to be_nil
24
- expect(range.end).to be_a Date
25
- expect(range.end?).to be true
26
- end
27
-
28
- it 'does not require an end date' do
29
- expect(begin_range.end).to be_nil
30
- expect(begin_range.end?).to be false
31
- end
32
-
33
- it 'does not require a begin date' do
34
- expect(end_range.begin).to be_nil
35
- expect(end_range.begin?).to be false
36
- end
37
-
38
- it 'implements comparable' do
39
- range1 = described_class.new 1, 3
40
- range1a = described_class.new 1, 3
41
- range2 = described_class.new nil, 3
42
- range2a = described_class.new nil, 3
43
- range3 = described_class.new 1, nil
44
- range3a = described_class.new 1, nil
45
-
46
- range4 = described_class.new 1, 4
47
- range5 = described_class.new 0, 3
48
-
49
- expect(range1 <=> range1a).to eq 0
50
- expect(range2 <=> range2a).to eq 0
51
- expect(range3 <=> range3a).to eq 0
52
-
53
- expect(range1 <=> range2).to be_nil
54
- expect(range2 <=> range3).to be_nil
55
- expect(range3 <=> range1).to be_nil
56
-
57
- expect(range1 <=> range4).to eq -1
58
- expect(range1 <=> range5).to eq -1
59
- expect(range4 <=> range1).to eq 1
60
- expect(range5 <=> range1).to eq 1
61
- end
62
- end