metal_archives 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c1527cbe8ea9df768ea3112b958fbba43f29dd0
4
- data.tar.gz: 82971bd30252efb8e77badb9dfe10c71fb86a585
3
+ metadata.gz: '00870c0edc861f8ff624c887f5a83346e1d2cba6'
4
+ data.tar.gz: 19f0e38a29a17f35604ae692c5773c8bcee0cede
5
5
  SHA512:
6
- metadata.gz: 64fb61f7acd105d6aa93f005cccdc1d246de4ac7b9a2fc4f944c7a3ff729698eaedd42faee4228f25549f33beedef1f5d34d3834953abe59054f16161b4dcea0
7
- data.tar.gz: e57bc2994341940aa33f283ae028ca3cb7a51f1e634eee3041c66d3d75ff0d765ee93e87cf30d394a6cc9ade61d8458bdab08fb5e4bc5dd5d45ec146fe43d38b
6
+ metadata.gz: 2499d481e8719a3913504a826214824b7871004ffabed9661e1bb623510bdc3d4cbd9a80499d8b7a2888d24b0314334d6fb29dad12f033057a23fe2e7bcb7949
7
+ data.tar.gz: d6825c4a2172caa7b37d3080154e653961c3e456e3018f20b283b286a493064a5401a00348752d3f207fb5af7a1b272df9d9145b136e922e3662b515fe499012
data/CHANGELOG.md CHANGED
@@ -1,5 +1,51 @@
1
1
  # Changelog
2
2
 
3
- ## 0.0.1
3
+ ## 1.0.0
4
+
5
+ - Add `Artist#photo`
6
+ - Return URI instead of String for `Artist#photo`, `Band#logo` and `Band#photo`
7
+ - Allow specifying endpoint
8
+ - Allow specifying additional Faraday middleware
9
+ - Implement `NilDate` class allowing year, month or date to be `nil`
10
+ - Add `#cached?` and `#loaded?`
11
+ - Add verbose output option
12
+ - Return `MetalArchives::Errors::TypeError` in certain cases
13
+ - Migrate tests to RSpec
14
+
15
+ ## 0.8.0
16
+
17
+ - Add configurable endpoint
18
+
19
+ ## 0.7.0
20
+
21
+ - Add `Band#all` and `Artist#all`
22
+
23
+ ## 0.6.0
24
+
25
+ - Add LRU object cache
26
+ - Remove HTTP cache due to uncacheable response headers
27
+ - Add `Band#find_by!` and `Artist#find_by!`
28
+
29
+ ## 0.5.0
30
+
31
+ - Fix dependency versions
32
+
33
+ ## 0.4.0
34
+
35
+ - Bubble errors up
36
+ - Add `find!`
37
+
38
+ ## 0.3.0
39
+
40
+ - Add `Collection` iterator
41
+
42
+ ## 0.2.1
43
+
44
+ - Add correct license
45
+ - Lock dependency versions
46
+
47
+ ## 0.2.0
48
+
49
+ ## 0.1.0
4
50
 
5
51
  Initial release
data/README.md CHANGED
@@ -40,9 +40,7 @@ MetalArchives.configure do |c|
40
40
 
41
41
  ## Custom logger (optional)
42
42
  c.logger = Logger.new File.new('metal_archives.log')
43
-
44
- ## Verbose output
45
- # c.debug = false
43
+ c.logger.level = Logger::INFO
46
44
  end
47
45
  ```
48
46
 
@@ -27,8 +27,6 @@ module MetalArchives
27
27
  @config = MetalArchives::Configuration.new
28
28
  yield @config
29
29
 
30
- @config.logger.level = @config.debug ? Logger::DEBUG : Logger::WARN
31
-
32
30
  raise MetalArchives::Errors::InvalidConfigurationError, 'app_name has not been configured' unless MetalArchives.config.app_name && !MetalArchives.config.app_name.empty?
33
31
  raise MetalArchives::Errors::InvalidConfigurationError, 'app_version has not been configured' unless MetalArchives.config.app_version && !MetalArchives.config.app_version.empty?
34
32
  raise MetalArchives::Errors::InvalidConfigurationError, 'app_contact has not been configured' unless MetalArchives.config.app_contact && !MetalArchives.config.app_contact.empty?
@@ -80,11 +78,6 @@ module MetalArchives
80
78
  #
81
79
  attr_accessor :logger
82
80
 
83
- ##
84
- # Verbose output
85
- #
86
- attr_accessor :debug
87
-
88
81
  ##
89
82
  # Cache size (per object class)
90
83
  #
@@ -98,7 +91,6 @@ module MetalArchives
98
91
  @throttle_rate = 1
99
92
  @throttle_wait = 3
100
93
  @logger = Logger.new STDOUT
101
- @debug = false
102
94
  @cache_size = 100
103
95
  end
104
96
  end
@@ -41,6 +41,7 @@ module MetalArchives
41
41
  f.response :logger, MetalArchives.config.logger
42
42
 
43
43
  f.use MetalArchives::Middleware::Headers
44
+ f.use MetalArchives::Middleware::CacheCheck
44
45
  f.use MetalArchives::Middleware::RewriteEndpoint
45
46
 
46
47
  MetalArchives.config.middleware.each { |m| f.use m } if MetalArchives.config.middleware
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+
5
+ module MetalArchives
6
+ module Middleware
7
+ ##
8
+ # Log cache status
9
+ #
10
+ class CacheCheck < Faraday::Response::Middleware # :nodoc:
11
+ def on_complete(env)
12
+ return unless MetalArchives.config.endpoint
13
+
14
+ if env[:response_headers].has_key? 'x-cache-status'
15
+ MetalArchives.config.logger.info "Cache #{env[:response_headers]['x-cache-status'].downcase} for #{env.url.to_s}"
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -9,7 +9,7 @@ module MetalArchives
9
9
  #
10
10
  class RewriteEndpoint < Faraday::Middleware
11
11
  def call(env)
12
- RewriteEndpoint.rewrite(env[:url])
12
+ env[:url] = RewriteEndpoint.rewrite(env[:url])
13
13
 
14
14
  @app.call env
15
15
  end
@@ -68,18 +68,18 @@ module MetalArchives
68
68
  # - rdoc-ref:MetalArchives::Errors::InvalidIDError when no or invalid id
69
69
  # - rdoc-ref:MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)
70
70
  #
71
- property :date_of_birth, :type => Date
71
+ property :date_of_birth, :type => NilDate
72
72
 
73
73
  ##
74
74
  # :attr_reader: date_of_death
75
75
  #
76
- # Returns +Date+
76
+ # Returns rdoc-ref:NilDate
77
77
  #
78
78
  # [Raises]
79
79
  # - rdoc-ref:MetalArchives::Errors::InvalidIDError when no or invalid id
80
80
  # - rdoc-ref:MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)
81
81
  #
82
- property :date_of_death, :type => Date
82
+ property :date_of_death, :type => NilDate
83
83
 
84
84
  ##
85
85
  # :attr_reader: cause_of_death
@@ -62,7 +62,7 @@ module MetalArchives
62
62
  ##
63
63
  # :attr_reader: date_formed
64
64
  #
65
- # Returns +Date+
65
+ # Returns rdoc-ref:NilDate
66
66
  #
67
67
  # [Raises]
68
68
  # - rdoc-ref:MetalArchives::Errors::InvalidIDError when no or invalid id
@@ -7,19 +7,23 @@ module MetalArchives
7
7
  ##
8
8
  # Represents a record label
9
9
  #
10
- class Label < BaseModel
10
+ class Label < MetalArchives::BaseModel
11
11
  ##
12
12
  # :attr_reader: id
13
13
  #
14
14
  # Returns +Integer+
15
15
  #
16
- property :id
16
+ property :id, :type => Integer
17
17
 
18
18
  ##
19
19
  # :attr_reader: name
20
20
  #
21
21
  # Returns +String+
22
22
  #
23
+ # [Raises]
24
+ # - rdoc-ref:MetalArchives::Errors::InvalidIDError when no or invalid id
25
+ # - rdoc-ref:MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)
26
+ #
23
27
  property :name
24
28
 
25
29
  ##
@@ -27,6 +31,10 @@ module MetalArchives
27
31
  #
28
32
  # Returns multiline +String+
29
33
  #
34
+ # [Raises]
35
+ # - rdoc-ref:MetalArchives::Errors::InvalidIDError when no or invalid id
36
+ # - rdoc-ref:MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)
37
+ #
30
38
  property :address
31
39
 
32
40
  ##
@@ -34,6 +42,10 @@ module MetalArchives
34
42
  #
35
43
  # Returns +ISO316::Country+
36
44
  #
45
+ # [Raises]
46
+ # - rdoc-ref:MetalArchives::Errors::InvalidIDError when no or invalid id
47
+ # - rdoc-ref:MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)
48
+ #
37
49
  property :country, :type => ISO3166::Country
38
50
 
39
51
  ##
@@ -41,6 +53,10 @@ module MetalArchives
41
53
  #
42
54
  # Returns +String+
43
55
  #
56
+ # [Raises]
57
+ # - rdoc-ref:MetalArchives::Errors::InvalidIDError when no or invalid id
58
+ # - rdoc-ref:MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)
59
+ #
44
60
  property :phone
45
61
 
46
62
  ##
@@ -48,14 +64,22 @@ module MetalArchives
48
64
  #
49
65
  # Returns +Array+ of +String+
50
66
  #
67
+ # [Raises]
68
+ # - rdoc-ref:MetalArchives::Errors::InvalidIDError when no or invalid id
69
+ # - rdoc-ref:MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)
70
+ #
51
71
  property :specializations, :multiple => true
52
72
 
53
73
  ##
54
74
  # :attr_reader: date_founded
55
75
  #
56
- # Returns +Date+
76
+ # Returns +NilDate+
77
+ #
78
+ # [Raises]
79
+ # - rdoc-ref:MetalArchives::Errors::InvalidIDError when no or invalid id
80
+ # - rdoc-ref:MetalArchives::Errors::APIError when receiving a status code >= 400 (except 404)
57
81
  #
58
- property :date_founded, :type => Date
82
+ property :date_founded, :type => NilDate
59
83
 
60
84
  ##
61
85
  # :attr_reader: sub_labels
@@ -58,9 +58,19 @@ module MetalArchives
58
58
  props[:name] = content
59
59
  when 'Age:'
60
60
  date = content.strip.gsub(/[0-9]* *\(born ([^\)]*)\)/, '\1')
61
- props[:date_of_birth] = Date.parse date
61
+ begin
62
+ props[:date_of_birth] = NilDate.parse date
63
+ rescue MetalArchives::Errors::ArgumentError => e
64
+ dob = Date.parse date
65
+ props[:date_of_birth] = NilDate.new dob.year, dob.month, dob.day
66
+ end
62
67
  when 'R.I.P.:'
63
- props[:date_of_death] = Date.parse content
68
+ begin
69
+ dod = Date.parse content
70
+ props[:date_of_death] = NilDate.new dod.year, dod.month, dod.day
71
+ rescue ArgumentError => e
72
+ props[:date_of_death] = NilDate.parse content
73
+ end
64
74
  when 'Died of:'
65
75
  props[:cause_of_death] = content
66
76
  when 'Place of origin:'
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'date'
4
+
3
5
  module MetalArchives
4
6
  ##
5
7
  # Date with nullable year, month and day
@@ -7,6 +9,8 @@ module MetalArchives
7
9
  # WARNING: No validation on actual date is performed
8
10
  #
9
11
  class NilDate
12
+ include Comparable
13
+
10
14
  attr_accessor :year, :month, :day
11
15
 
12
16
  def initialize(year = nil, month = nil, day = nil)
@@ -50,5 +54,41 @@ module MetalArchives
50
54
  rescue
51
55
  raise MetalArchives::Errors::ArgumentError, 'invalid date'
52
56
  end
57
+
58
+ def to_s
59
+ year = (@year || 0).to_s.rjust 2, '0'
60
+ month = (@month || 0).to_s.rjust 2, '0'
61
+ day = (@day || 0).to_s.rjust 2, '0'
62
+
63
+ "#{year}-#{month}-#{day}"
64
+ end
65
+
66
+ ##
67
+ # Comparison operator
68
+ #
69
+ def <=>(other)
70
+ return nil if other.nil?
71
+
72
+ # Return nil if one of the two years is nil
73
+ return nil if (@year.nil? && !other.year.nil?) || !@year.nil? && other.year.nil?
74
+
75
+ # Return nil if one of the two months is nil
76
+ return nil if (@month.nil? && !other.month.nil?) || !@month.nil? && other.month.nil?
77
+
78
+ # Return nil if one of the two months is nil
79
+ return nil if (@day.nil? && !other.day.nil?) || !@day.nil? && other.day.nil?
80
+
81
+ comp_year = @year <=> other.year
82
+ if comp_year == 0
83
+ comp_month = @month <=> other.month
84
+ if comp_month == 0
85
+ return @day <=> other.day
86
+ else
87
+ return comp_month
88
+ end
89
+ else
90
+ comp_year
91
+ end
92
+ end
53
93
  end
54
94
  end
@@ -4,5 +4,5 @@ module MetalArchives
4
4
  ##
5
5
  # MetalArchives API version
6
6
  #
7
- VERSION = '1.0.0'
7
+ VERSION = '2.0.0'
8
8
  end
@@ -3,6 +3,7 @@
3
3
  require 'openssl'
4
4
 
5
5
  require 'metal_archives/middleware/headers'
6
+ require 'metal_archives/middleware/cache_check'
6
7
  require 'metal_archives/middleware/rewrite_endpoint'
7
8
 
8
9
  require 'metal_archives/version'
@@ -20,8 +20,6 @@ RSpec.describe MetalArchives::Configuration do
20
20
  expect(subject).to respond_to :request_timeout=
21
21
  expect(subject).to respond_to :logger
22
22
  expect(subject).to respond_to :logger=
23
- expect(subject).to respond_to :debug
24
- expect(subject).to respond_to :debug=
25
23
  expect(subject).to respond_to :cache_size
26
24
  expect(subject).to respond_to :cache_size=
27
25
  end
@@ -29,7 +27,6 @@ RSpec.describe MetalArchives::Configuration do
29
27
  it 'has default properties' do
30
28
  expect(subject.default_endpoint).to eq 'https://www.metal-archives.com/'
31
29
  expect(subject.logger).not_to be_nil
32
- expect(subject.debug).to be false
33
30
  expect(subject.cache_size).to be_an Integer
34
31
  end
35
32
 
@@ -37,12 +34,10 @@ RSpec.describe MetalArchives::Configuration do
37
34
  subject.endpoint = 'http://my-proxy.com/'
38
35
  logger = Logger.new STDERR
39
36
  subject.logger = logger
40
- subject.debug = true
41
37
  subject.cache_size = 0
42
38
 
43
39
  expect(subject.endpoint).to eq 'http://my-proxy.com/'
44
40
  expect(subject.logger).to be logger
45
- expect(subject.debug).to be true
46
41
  expect(subject.cache_size).to eq 0
47
42
  end
48
43
  end
@@ -11,7 +11,7 @@ RSpec.describe MetalArchives::Artist do
11
11
  expect(artist.aliases).to be_empty
12
12
  expect(artist.country).to eq ISO3166::Country['ES']
13
13
  expect(artist.location).to eq 'Oviedo, Asturias'
14
- expect(artist.date_of_birth).to eq Date.new(1972, 9, 2)
14
+ expect(artist.date_of_birth).to eq MetalArchives::NilDate.new(1972, 9, 2)
15
15
  expect(artist.gender).to eq :male
16
16
  expect(artist.biography).to match 'Avalanch'
17
17
  expect(artist.trivia).to match 'Sanctuarium Estudios'
@@ -25,7 +25,7 @@ RSpec.describe MetalArchives::Artist do
25
25
  expect(artist).to be_instance_of MetalArchives::Artist
26
26
  expect(artist.name).to eq 'Ian Fraser Kilmister'
27
27
  expect(artist.aliases).to include 'Lemmy Kilmister'
28
- expect(artist.date_of_death).to eq Date.new(2015, 12, 28)
28
+ expect(artist.date_of_death).to eq MetalArchives::NilDate.new(2015, 12, 28)
29
29
  expect(artist.links.length).to eq 5
30
30
  expect(artist.links.count { |l| l[:type] == :official }).to eq 1
31
31
  expect(artist.links.count { |l| l[:type] == :unofficial }).to eq 2
@@ -38,16 +38,12 @@ RSpec.describe MetalArchives::Artist do
38
38
  expect(MetalArchives::Parsers::Artist.map_params(:name => 'name')[:query]).to eq 'name'
39
39
  end
40
40
 
41
- it 'rewrites URIs' do
42
- old_endpoint = MetalArchives.config.endpoint
43
- MetalArchives.config.endpoint = 'https://foo.bar/'
41
+ it 'uses NilDate' do
42
+ artist = MetalArchives::Artist.find 35049
44
43
 
45
- artist = MetalArchives::Artist.find! 60908
46
-
47
- expect(artist.photo.scheme).to eq 'https'
48
- expect(artist.photo.host).to eq 'foo.bar'
49
-
50
- MetalArchives.config.endpoint = old_endpoint
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)
51
47
  end
52
48
  end
53
49
 
@@ -19,8 +19,6 @@ MetalArchives.configure do |c|
19
19
  end
20
20
 
21
21
  ## Custom logger (optional)
22
- # c.logger = Logger.new 'metal_archives.log'
23
-
24
- ## Verbose output
25
- # c.debug = false
22
+ c.logger = Logger.new STDOUT
23
+ c.logger.level = Logger::INFO
26
24
  end
@@ -95,4 +95,54 @@ RSpec.describe MetalArchives::NilDate do
95
95
  expect(-> { described_class.parse "This isn't a date" }).to raise_error MetalArchives::Errors::ArgumentError
96
96
  end
97
97
  end
98
+
99
+ it 'includes comparable' do
100
+ date1 = described_class.new 2015, 01, 01
101
+ date2 = described_class.new 2015, 01, 02
102
+ date3 = described_class.new 2015, 02, 01
103
+ date4 = described_class.new 2016, 01, 02
104
+ date5 = described_class.new 2015, 01, 01
105
+ date6 = described_class.new 2014, 12, 31
106
+ date7 = described_class.new 2015, 01, nil
107
+ date8 = described_class.new 2015, 01, nil
108
+ date9 = described_class.new 2015, 02, nil
109
+ date10 = described_class.new 2015, nil, nil
110
+ date11 = described_class.new 2016, nil, nil
111
+
112
+ expect(date1 <=> date2).to eq -1
113
+ expect(date2 <=> date1).to eq 1
114
+ expect(date1 <=> date3).to eq -1
115
+ expect(date3 <=> date1).to eq 1
116
+ expect(date1 <=> date4).to eq -1
117
+ expect(date4 <=> date1).to eq 1
118
+ expect(date1 <=> date5).to eq 0
119
+ expect(date5 <=> date1).to eq 0
120
+ expect(date6 <=> date1).to eq -1
121
+ expect(date1 <=> date6).to eq 1
122
+
123
+ expect(date1 <=> date7).to eq nil
124
+ expect(date7 <=> date1).to eq nil
125
+ expect(date1 <=> date9).to eq nil
126
+ expect(date9 <=> date1).to eq nil
127
+ expect(date7 <=> date8).to eq 0
128
+ expect(date8 <=> date7).to eq 0
129
+ expect(date7 <=> date9).to eq -1
130
+ expect(date9 <=> date7).to eq 1
131
+ expect(date7 <=> date10).to eq nil
132
+ expect(date10 <=> date7).to eq nil
133
+ expect(date10 <=> date11).to eq -1
134
+ expect(date11 <=> date10).to eq 1
135
+ end
136
+
137
+ it 'prints to string' do
138
+ date1 = described_class.new 2015, nil, nil
139
+ date2 = described_class.new 2015, 01, nil
140
+ date3 = described_class.new 2015, 01, 01
141
+ date4 = described_class.new 2015, nil, 01
142
+
143
+ expect(date1.to_s).to eq '2015-00-00'
144
+ expect(date2.to_s).to eq '2015-01-00'
145
+ expect(date3.to_s).to eq '2015-01-01'
146
+ expect(date4.to_s).to eq '2015-00-01'
147
+ end
98
148
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metal_archives
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Dejonckheere
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-04 00:00:00.000000000 Z
11
+ date: 2017-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -212,6 +212,7 @@ files:
212
212
  - lib/metal_archives/configuration.rb
213
213
  - lib/metal_archives/error.rb
214
214
  - lib/metal_archives/http_client.rb
215
+ - lib/metal_archives/middleware/cache_check.rb
215
216
  - lib/metal_archives/middleware/headers.rb
216
217
  - lib/metal_archives/middleware/rewrite_endpoint.rb
217
218
  - lib/metal_archives/models/artist.rb