arstotzka 1.3.0 → 1.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dab766f1bb96f47815fccca69b12bfa5240538d03b9e1fe6f059529f01f4bac8
4
- data.tar.gz: 9ff7799976593647f92d0eb1e1422a6ddc3b5538cf1694e7bdcf16b7d016c3c2
3
+ metadata.gz: 9a4b941b1b173ae1f57c979ab7b58771a675dc297184cecb936c4e3e5854de5c
4
+ data.tar.gz: 4dcc0ad6c185c423aa7cb9376ebc47f392a9fb7eccb5753f0448817a1337dc10
5
5
  SHA512:
6
- metadata.gz: c8da448735a633c9958a0c7f604a3008e5157088424b900ac0d880a7151bb6f9df534a70da5b9a33df2f46a5aab49f743535dc1116342b3faf80f07dde12c148
7
- data.tar.gz: 305d9d2b4d048549f31cd4a23c182ad19976b4b47ada251ccd57d3a26e7820e640986f6e495a919590cb0c46bf1897ddbc3b70fa6ccc8c68c901d7a55931f487
6
+ metadata.gz: 55402898468c8a5f593abfba401cf36a76e08771b4b98c6d1240af8224f54d141e13f6c19033befee4a9244289bee3b2aebf0f682a874090162c7fb529aaf63b
7
+ data.tar.gz: 064e5a70a830ea70ff8d1dc544f36f81ebd88c8ce4df77efad625a1e4d9d67d8b5245b5dc8f851c9fc7ccd8dff5ef7eb9a83ad702556a494ed7084fdae08515f
data/.circleci/config.yml CHANGED
@@ -2,7 +2,7 @@ version: 2
2
2
  jobs:
3
3
  build:
4
4
  docker:
5
- - image: darthjee/circleci_ruby_gems:0.0.1
5
+ - image: darthjee/circleci_ruby_gems:0.0.2
6
6
  steps:
7
7
  - checkout
8
8
  - run:
@@ -26,3 +26,6 @@ jobs:
26
26
  - run:
27
27
  name: Check version documentation
28
28
  command: scripts/check_readme.sh
29
+ - run:
30
+ name: Rubycritcs check
31
+ command: scripts/rubycritic.sh
data/.gitignore CHANGED
@@ -5,3 +5,4 @@ doc
5
5
  pkg
6
6
  measurement
7
7
  **/*.swp
8
+ rubycritic/
data/Dockerfile CHANGED
@@ -1,4 +1,4 @@
1
- FROM darthjee/ruby_gems:0.0.1
1
+ FROM darthjee/ruby_gems:0.0.2
2
2
 
3
3
  USER app
4
4
  COPY --chown=app ./ /home/app/app/
data/README.md CHANGED
@@ -19,7 +19,7 @@ JSON keys)
19
19
 
20
20
  Yard Documentation
21
21
  -------------------
22
- https://www.rubydoc.info/gems/arstotzka/1.3.0
22
+ https://www.rubydoc.info/gems/arstotzka/1.3.1
23
23
 
24
24
  Instalation
25
25
  ---------------
data/Rakefile CHANGED
@@ -4,6 +4,7 @@ require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
5
  require 'yardstick/rake/measurement'
6
6
  require './config/yardstick'
7
+ require './config/rubycritc'
7
8
 
8
9
  RSpec::Core::RakeTask.new
9
10
 
data/arstotzka.gemspec CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |gem|
28
28
  gem.add_development_dependency 'rspec', '>= 3.8'
29
29
  gem.add_development_dependency 'rubocop', '0.58.1'
30
30
  gem.add_development_dependency 'rubocop-rspec', '1.30.0'
31
+ gem.add_development_dependency 'rubycritic', '>= 4.0.2'
31
32
  gem.add_development_dependency 'simplecov', '~> 0.16.x'
32
33
  gem.add_development_dependency 'yard', '>= 0.9.18'
33
34
  gem.add_development_dependency 'yardstick', '>= 0.9.9'
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rubycritic/rake_task'
4
+
5
+ RubyCritic::RakeTask.new do |task|
6
+ options = %w[
7
+ --path rubycritic/
8
+ --no-browser
9
+ ]
10
+ task.options = options.join(' ')
11
+ task.paths = %w[lib]
12
+ end
data/config/yardstick.yml CHANGED
@@ -19,28 +19,30 @@ rules:
19
19
  ReturnTag:
20
20
  enabled: true
21
21
  exclude:
22
- - Arstotzka::Crawler#post_process
22
+ - Arstotzka::Crawler#block
23
23
  - Arstotzka::Crawler#options
24
- - Arstotzka::Fetcher#instance
24
+ - Arstotzka::Exception::FetcherBuilderNotFound#attribute
25
+ - Arstotzka::Exception::FetcherBuilderNotFound#klass
25
26
  - Arstotzka::Fetcher#options
26
27
  - Arstotzka::FetcherBuilder#options
28
+ - Arstotzka::HashReader#options
27
29
  - Arstotzka::MethodBuilder#attr_names
28
30
  - Arstotzka::MethodBuilder#options
29
- - Arstotzka::Options#keys
30
31
  - Arstotzka::Reader#keys
31
32
  - Arstotzka::Reader#options
32
33
  - Arstotzka::Wrapper#options
33
34
  Summary::Presence:
34
35
  enabled: true
35
36
  exclude:
36
- - Arstotzka::Crawler#post_process
37
+ - Arstotzka::Crawler#block
37
38
  - Arstotzka::Crawler#options
38
- - Arstotzka::Fetcher#instance
39
+ - Arstotzka::Exception::FetcherBuilderNotFound#attribute
40
+ - Arstotzka::Exception::FetcherBuilderNotFound#klass
39
41
  - Arstotzka::Fetcher#options
40
42
  - Arstotzka::FetcherBuilder#options
43
+ - Arstotzka::HashReader#options
41
44
  - Arstotzka::MethodBuilder#attr_names
42
45
  - Arstotzka::MethodBuilder#options
43
- - Arstotzka::Options#keys
44
46
  - Arstotzka::Reader#keys
45
47
  - Arstotzka::Reader#options
46
48
  - Arstotzka::Wrapper#options
data/lib/arstotzka.rb CHANGED
@@ -172,6 +172,7 @@ module Arstotzka
172
172
  autoload :Exception, 'arstotzka/exception'
173
173
  autoload :Fetcher, 'arstotzka/fetcher'
174
174
  autoload :FetcherBuilder, 'arstotzka/fetcher_builder'
175
+ autoload :HashReader, 'arstotzka/hash_reader'
175
176
  autoload :MethodBuilder, 'arstotzka/method_builder'
176
177
  autoload :Options, 'arstotzka/options'
177
178
  autoload :Reader, 'arstotzka/reader'
@@ -12,8 +12,8 @@ module Arstotzka
12
12
  # @param options [Arstotzka::Options] fetcher options
13
13
  #
14
14
  # @return [Artotzka::FetcherBuilder]
15
- def add_fetcher(attribute, options)
16
- fetcher_builders[attribute.to_sym] = FetcherBuilder.new(options.merge(key: attribute))
15
+ def add_fetcher(attribute, options = {})
16
+ fetcher_builders[attribute] = FetcherBuilder.new(options.merge(key: attribute))
17
17
  end
18
18
 
19
19
  # @api private
@@ -27,7 +27,39 @@ module Arstotzka
27
27
  #
28
28
  # @return [Arstotzka::Fetcher]
29
29
  def fetcher_for(attribute, instance)
30
- fetcher_builders[attribute.to_sym].build(instance)
30
+ return builder_for(attribute).build(instance) if fetcher_for?(attribute)
31
+
32
+ raise Exception::FetcherBuilderNotFound.new(attribute, self)
33
+ end
34
+
35
+ protected
36
+
37
+ # @api private
38
+ #
39
+ # Checks if class can build a fetcher for attribute
40
+ #
41
+ # @param attribute [::Symbol]
42
+ #
43
+ # @return [TrueClass,FalseClass]
44
+ def fetcher_for?(attribute)
45
+ return true if fetcher_builders.key?(attribute)
46
+ return unless superclass.include?(Arstotzka)
47
+
48
+ superclass.fetcher_for?(attribute)
49
+ end
50
+
51
+ # @api private
52
+ #
53
+ # Returns fetcher builder for an attribute
54
+ #
55
+ # @param attribute [::Symbol]
56
+ #
57
+ # @return [Arstotzka::FetcherBuilder]
58
+ def builder_for(attribute)
59
+ builder = fetcher_builders[attribute]
60
+ return superclass.builder_for(attribute) unless builder
61
+
62
+ builder
31
63
  end
32
64
 
33
65
  private
@@ -69,7 +101,7 @@ module Arstotzka
69
101
  # ActiveSupport::Concern
70
102
  def expose(*attr_names, **options_hash)
71
103
  options = Options.new(options_hash.symbolize_keys)
72
- MethodBuilder.new(attr_names, self, options).build
104
+ MethodBuilder.new(attr_names.map(&:to_sym), self, options).build
73
105
  end
74
106
 
75
107
  # @private
@@ -36,8 +36,7 @@ module Arstotzka
36
36
  # @param options [Arstotzka::Options] options of initialization object
37
37
  def initialize(options = {}, &block)
38
38
  self.options = options
39
-
40
- @post_process = block || proc { |value| value }
39
+ @block = block
41
40
  end
42
41
 
43
42
  # Crawls into the hash looking for all keys in the given keys
@@ -94,7 +93,7 @@ module Arstotzka
94
93
  private
95
94
 
96
95
  # @private
97
- attr_reader :post_process, :options
96
+ attr_reader :block, :options
98
97
  delegate :compact, :default, to: :options
99
98
 
100
99
  # Fetch the value from hash by crawling the keys
@@ -150,6 +149,15 @@ module Arstotzka
150
149
  post_process.call(value)
151
150
  end
152
151
 
152
+ # @private
153
+ #
154
+ # Return post processor responsible for processing final result
155
+ #
156
+ # @return [Proc]
157
+ def post_process
158
+ @post_process ||= block || proc { |value| value }
159
+ end
160
+
153
161
  # @private
154
162
  #
155
163
  # Iterate over array applying #crawl over each element
@@ -160,8 +168,8 @@ module Arstotzka
160
168
  # @return [Array] the new array with the individual values returned
161
169
  # @see #crawl
162
170
  def crawl_array(array, index)
163
- array.map { |j| value(j, index) }.tap do |a|
164
- a.compact! if compact
171
+ array.map { |element| value(element, index) }.tap do |new_array|
172
+ new_array.compact! if compact
165
173
  end
166
174
  end
167
175
  end
@@ -1,8 +1,36 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Arstotzka
4
+ # @api private
5
+ #
6
+ # Arstotzka exceptions
4
7
  module Exception
5
8
  # Exception raised when a key in the hash is not found
6
9
  class KeyNotFound < StandardError; end
10
+
11
+ # Exception raised when configuration for FetcherBuilder is not found
12
+ class FetcherBuilderNotFound < StandardError
13
+ # Returns a new instance of FetcherBuilderNotFound
14
+ #
15
+ # @param attribute [Symbol] attribute's name
16
+ # @param klass [Class] Class where the fetcher was being accessed
17
+ #
18
+ # @return [FetcherBuilderNotFound]
19
+ def initialize(attribute, klass)
20
+ @attribute = attribute
21
+ @klass = klass
22
+ end
23
+
24
+ # Returns message specifying which attemp created the failure
25
+ #
26
+ # @return [String]
27
+ def message
28
+ "FetcherBuild not found for #{attribute} on #{klass}"
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :attribute, :klass
34
+ end
7
35
  end
8
36
  end
@@ -11,10 +11,12 @@ module Arstotzka
11
11
  # Creates an instance of Artotzka::Fetcher
12
12
  #
13
13
  # @overload iniitalize(options_hash = {})
14
- # @param options_hash [Hash] options for {Crawler}, {Wrapper} and {Reader}
14
+ # @param options_hash [Hash] options for {Crawler}, {Wrapper},
15
+ # {Reader} and {HashReader}
15
16
  #
16
17
  # @overload iniitalize(options)
17
- # @param options [Arstotzka::Options] options for {Crawler}, {Wrapper} and {Reader}
18
+ # @param options [Arstotzka::Options] options for {Crawler}, {Wrapper},
19
+ # {Reader} and {HashReader}
18
20
  def initialize(options_hash = {})
19
21
  self.options = options_hash
20
22
  end
@@ -81,35 +83,32 @@ module Arstotzka
81
83
  # # ]
82
84
  def fetch
83
85
  value = crawler.value(hash)
84
- value.flatten! if flatten && value.respond_to?(:flatten!)
86
+ value.flatten! if flatten && value.is_a?(Array)
85
87
  value = instance.send(after, value) if after
86
88
  value
87
89
  end
88
90
 
91
+ # Checks if other equals self
92
+ #
93
+ # @param other [Object]
94
+ #
95
+ # @return [TrueClass,FalseClass]
96
+ def ==(other)
97
+ return false unless other.class == self.class
98
+ options == other.options &&
99
+ instance == other.instance
100
+ end
101
+
102
+ protected
103
+
104
+ attr_reader :options
105
+
89
106
  private
90
107
 
91
108
  # @private
92
- attr_reader :instance, :options
93
109
  delegate :instance, :after, :flatten, to: :options
94
110
  delegate :wrap, to: :wrapper
95
-
96
- # @private
97
- #
98
- # Retrieves the hash to be crawled from the instance
99
- #
100
- # @return [Hash]
101
- # rubocop:disable Metrics/AbcSize
102
- def hash
103
- @hash ||= case options.json.to_s
104
- when /^@@.*/
105
- instance.class.class_variable_get(options.json)
106
- when /^@.*/
107
- then instance.instance_variable_get(options.json)
108
- else
109
- instance.send(options.json.to_s)
110
- end
111
- end
112
- # rubocop:enable Metrics/AbcSize
111
+ delegate :hash, to: :hash_reader
113
112
 
114
113
  # @private
115
114
  #
@@ -134,5 +133,14 @@ module Arstotzka
134
133
  def wrapper
135
134
  @wrapper ||= Wrapper.new(options.merge(instance: instance))
136
135
  end
136
+
137
+ # @api private
138
+ #
139
+ # Reader responsible for fetching hash from instance
140
+ #
141
+ # @return [Arstotzka::HashReader]
142
+ def hash_reader
143
+ @hash_reader ||= HashReader.new(options)
144
+ end
137
145
  end
138
146
  end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arstotzka
4
+ # @api private
5
+ #
6
+ # Class responsible for reading json / hash from instance
7
+ class HashReader
8
+ include Base
9
+
10
+ # Returns a new instance of HashReader
11
+ #
12
+ # @overload iniitalize(options_hash = {})
13
+ # @param options_hash [Hash]
14
+ #
15
+ # @overload iniitalize(options)
16
+ # @param options [Arstotzka::Options]
17
+ def initialize(options_hash = {})
18
+ self.options = options_hash
19
+ end
20
+
21
+ # Retrieves the hash to be crawled from the instance
22
+ #
23
+ # @return [Hash]
24
+ #
25
+ # @example Simple Usage
26
+ # class Dummy
27
+ # def initialize(json = {})
28
+ # @json = json
29
+ # end
30
+ #
31
+ # private
32
+ #
33
+ # attr_reader :json
34
+ # end
35
+ #
36
+ # hash = { key: 'value' }
37
+ # instance = Dummy.new(hash)
38
+ #
39
+ # reader = Arstotzka::HashReader.new(
40
+ # instance: instance
41
+ # )
42
+ #
43
+ # reader.hash # returns { key: 'value' }
44
+ #
45
+ # @example When fetching from class variable
46
+ # class ClassVariable
47
+ # def self.json=(json)
48
+ # @@json = json
49
+ # end
50
+ # end
51
+ #
52
+ # hash = { key: 'value' }
53
+ # ClassVariable.json = hash
54
+ #
55
+ # instance = ClassVariable.new
56
+ #
57
+ # reader = Arstotzka::HashReader.new(
58
+ # instance: instance, json: :@@json
59
+ # )
60
+ #
61
+ # reader.hash # returns { key: 'value' }
62
+ def hash
63
+ @hash ||= case json.to_s
64
+ when /^@@.*/
65
+ instance.class.class_variable_get(json)
66
+ when /^@.*/
67
+ then instance.instance_variable_get(json)
68
+ else
69
+ instance.send(json)
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ attr_reader :options
76
+
77
+ delegate :instance, to: :options
78
+ delegate :json, to: :options
79
+ end
80
+ end
@@ -41,7 +41,7 @@ module Arstotzka
41
41
  include Base
42
42
  # Returns new instance of Arstotzka::MethodBuilder
43
43
  #
44
- # @param attr_names [Array] list of attributes to be fetched from the hash/json
44
+ # @param attr_names [Array<Symbol>] list of attributes to be fetched from the hash/json
45
45
  # @param klass [Class] class to receive the methods
46
46
  # (using {https://www.rubydoc.info/gems/sinclair Sinclair})
47
47
  #
@@ -316,11 +316,24 @@ module Arstotzka
316
316
  self.class.new(to_h.merge(options))
317
317
  end
318
318
 
319
+ # Retuns all keys used when fetching
320
+ #
321
+ # @return [Array<String>]
319
322
  def keys
320
323
  return full_path.split('.') if full_path
321
324
  return [key.to_s] unless path&.present?
322
325
 
323
326
  [path, key].compact.join('.').split('.')
324
327
  end
328
+
329
+ # Checks if another instance equals self
330
+ #
331
+ # @param other [Object]
332
+ #
333
+ # @return [TrueClass,FalseClass]
334
+ def ==(other)
335
+ return false unless other.class == self.class
336
+ to_h == other.to_h
337
+ end
325
338
  end
326
339
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Arstotzka
4
- VERSION = '1.3.0'
4
+ VERSION = '1.3.1'
5
5
  end
@@ -66,7 +66,7 @@ module Arstotzka
66
66
 
67
67
  # @private
68
68
  attr_reader :options
69
- delegate :klass, :type, to: :options
69
+ delegate :klass, :type, :after_each, to: :options
70
70
 
71
71
  # @private
72
72
  #
@@ -90,7 +90,7 @@ module Arstotzka
90
90
  #
91
91
  # @return [Arra]
92
92
  def wrap_array(array)
93
- array.map { |v| wrap v }
93
+ array.map { |element| wrap element }
94
94
  end
95
95
 
96
96
  # @private
@@ -132,9 +132,9 @@ module Arstotzka
132
132
  #
133
133
  # @return [Object] result of method call
134
134
  def after(value)
135
- return value unless options.after_each
135
+ return value unless after_each
136
136
 
137
- options.instance.send(options.after_each, value)
137
+ options.instance.send(after_each, value)
138
138
  end
139
139
  end
140
140
  end
@@ -0,0 +1,10 @@
1
+ #!/bin/bash
2
+
3
+ DIFF_LIST=$(git diff --name-only $CIRCLE_SHA1 $(git merge-base $CIRCLE_SHA1 origin/master) | grep "^lib/")
4
+
5
+ if [ ! -z "$DIFF_LIST" ]; then
6
+ mkdir -p tmp/rubycritic/compare
7
+ bundle exec rubycritic --format console --branch origin/master -t 0 $DIFF_LIST
8
+ else
9
+ echo "No changes detected. Skipping rubycritic..."
10
+ fi
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Arstotzka::HashReader do
6
+ subject(:reader) { described_class.new(options) }
7
+
8
+ describe '#hash' do
9
+ let(:klass) { Arstotzka::Fetcher::Dummy }
10
+ let(:json) { { key: 'value' } }
11
+ let(:instance) { klass.new(json) }
12
+ let(:options) { { instance: instance } }
13
+
14
+ context 'when no extra options are given' do
15
+ it 'reads hash from instance json method' do
16
+ expect(reader.hash).to eq(json)
17
+ end
18
+ end
19
+
20
+ context 'when fetching from instance variable' do
21
+ let(:klass) { Arstotzka::Fetcher::NoAccessor }
22
+ let(:options) { { instance: instance, json: :@hash } }
23
+
24
+ it 'reads hash from instance variable' do
25
+ expect(reader.hash).to eq(json)
26
+ end
27
+ end
28
+
29
+ context 'when fetching from class variable' do
30
+ let(:klass) { Arstotzka::Fetcher::ClassVariable }
31
+ let(:options) { { instance: instance, json: :@@json } }
32
+ let(:instance) { klass.new }
33
+
34
+ before { klass.json = json }
35
+
36
+ it 'reads hash from class variable' do
37
+ expect(reader.hash).to eq(json)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -31,8 +31,8 @@ describe Arstotzka::MethodBuilder do
31
31
  end
32
32
 
33
33
  describe '#age' do
34
- let(:klass) { Class.new(MyModel) }
35
- let(:attributes) { [:age, 'cars'] }
34
+ let(:klass) { Class.new(MyModel) }
35
+ let(:attributes) { %i[age cars] }
36
36
  let(:options_hash) { { type: :integer } }
37
37
 
38
38
  before do
@@ -49,8 +49,8 @@ describe Arstotzka::MethodBuilder do
49
49
  end
50
50
 
51
51
  describe '#cars' do
52
- let(:klass) { Class.new(MyModel) }
53
- let(:attributes) { [:age, 'cars'] }
52
+ let(:klass) { Class.new(MyModel) }
53
+ let(:attributes) { %i[age cars] }
54
54
  let(:options_hash) { { type: :integer } }
55
55
 
56
56
  before do
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Arstotzka::HashReader do
6
+ subject(:reader) { described_class.new(options) }
7
+
8
+ describe '#hash' do
9
+ let(:klass) { Arstotzka::Fetcher::Dummy }
10
+ let(:json) { { key: SecureRandom.hex } }
11
+ let(:instance) { klass.new(json) }
12
+ let(:options) { { instance: instance } }
13
+
14
+ context 'when no extra options are given' do
15
+ it 'reads hash from instance json method' do
16
+ expect(reader.hash).to eq(json)
17
+ end
18
+ end
19
+
20
+ context 'when fetching from instance variable' do
21
+ let(:klass) { Arstotzka::Fetcher::NoAccessor }
22
+ let(:options) { { instance: instance, json: :@hash } }
23
+
24
+ it 'reads hash from instance variable' do
25
+ expect(reader.hash).to eq(json)
26
+ end
27
+ end
28
+
29
+ context 'when fetching from class variable' do
30
+ let(:klass) { Arstotzka::Fetcher::ClassVariable }
31
+ let(:options) { { instance: instance, json: :@@json } }
32
+ let(:instance) { klass.new }
33
+
34
+ before do
35
+ klass.json = json
36
+ end
37
+
38
+ it 'reads hash from class variable' do
39
+ expect(reader.hash).to eq(json)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -8,6 +8,67 @@ describe Arstotzka do
8
8
  let(:json) { load_json_fixture_file('arstotzka.json') }
9
9
  let(:value) { dummy.public_send(attribute) }
10
10
 
11
+ describe '.add_fether' do
12
+ let(:klass) { Class.new(Arstotzka::Dummy) }
13
+
14
+ it do
15
+ expect { klass.add_fetcher(:new_attribute) }
16
+ .to change { klass.send(:fetcher_builders).keys }
17
+ .to([:new_attribute])
18
+ end
19
+ end
20
+
21
+ describe '.fetcher_for' do
22
+ let(:klass) { Arstotzka::Dummy }
23
+ let(:instance) { klass.new({}) }
24
+ let(:expected) do
25
+ Arstotzka::Fetcher.new(
26
+ key: :name,
27
+ path: 'user',
28
+ instance: instance
29
+ )
30
+ end
31
+
32
+ it do
33
+ expect(klass.fetcher_for(:name, instance))
34
+ .to be_a(Arstotzka::Fetcher)
35
+ end
36
+
37
+ it 'returns correct fetcher' do
38
+ expect(klass.fetcher_for(:name, instance))
39
+ .to eq(expected)
40
+ end
41
+
42
+ context 'when fetcher was never added' do
43
+ it do
44
+ expect { klass.fetcher_for(:new_attribute, instance) }
45
+ .to raise_error(
46
+ Arstotzka::Exception::FetcherBuilderNotFound,
47
+ "FetcherBuild not found for new_attribute on #{klass}"
48
+ )
49
+ end
50
+ end
51
+
52
+ context 'when dealing with subclass' do
53
+ let(:klass) { Class.new(Arstotzka::Dummy) }
54
+
55
+ it do
56
+ expect { klass.fetcher_for(:name, instance) }
57
+ .not_to raise_error
58
+ end
59
+
60
+ context 'when fetcher was never added' do
61
+ it do
62
+ expect { klass.fetcher_for(:new_attribute, instance) }
63
+ .to raise_error(
64
+ Arstotzka::Exception::FetcherBuilderNotFound,
65
+ "FetcherBuild not found for new_attribute on #{klass}"
66
+ )
67
+ end
68
+ end
69
+ end
70
+ end
71
+
11
72
  context 'when parser is configured with no options' do
12
73
  let(:attribute) { :id }
13
74
 
@@ -130,4 +191,13 @@ describe Arstotzka do
130
191
  expect(value).to be_a(Float)
131
192
  end
132
193
  end
194
+
195
+ context 'when class is a child' do
196
+ let(:klass) { Class.new(Arstotzka::Dummy) }
197
+ let(:attribute) { :name }
198
+
199
+ it 'retrieves attribute from base json' do
200
+ expect(value).to eq(json['user']['name'])
201
+ end
202
+ end
133
203
  end
@@ -5,7 +5,7 @@ module Arstotzka
5
5
  include Arstotzka
6
6
  attr_reader :json
7
7
 
8
- expose :id
8
+ expose 'id'
9
9
  expose :name, path: 'user'
10
10
  expose :father_name, full_path: 'father.name'
11
11
  expose :age, cached: true
@@ -23,5 +23,10 @@ module Arstotzka
23
23
  g.publisher == 'sega'
24
24
  end
25
25
  end
26
+
27
+ def ==(other)
28
+ return false unless other.class == self.class
29
+ json == other.json
30
+ end
26
31
  end
27
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arstotzka
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darthjee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-30 00:00:00.000000000 Z
11
+ date: 2019-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - '='
123
123
  - !ruby/object:Gem::Version
124
124
  version: 1.30.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubycritic
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 4.0.2
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 4.0.2
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: simplecov
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +213,7 @@ files:
199
213
  - Rakefile
200
214
  - arstotzka.gemspec
201
215
  - arstotzka.jpg
216
+ - config/rubycritc.rb
202
217
  - config/yardstick.rb
203
218
  - config/yardstick.yml
204
219
  - docker-compose.yml
@@ -209,6 +224,7 @@ files:
209
224
  - lib/arstotzka/exception.rb
210
225
  - lib/arstotzka/fetcher.rb
211
226
  - lib/arstotzka/fetcher_builder.rb
227
+ - lib/arstotzka/hash_reader.rb
212
228
  - lib/arstotzka/method_builder.rb
213
229
  - lib/arstotzka/options.rb
214
230
  - lib/arstotzka/reader.rb
@@ -216,6 +232,7 @@ files:
216
232
  - lib/arstotzka/version.rb
217
233
  - lib/arstotzka/wrapper.rb
218
234
  - scripts/check_readme.sh
235
+ - scripts/rubycritic.sh
219
236
  - spec/fixtures/accounts.json
220
237
  - spec/fixtures/accounts_missing.json
221
238
  - spec/fixtures/arstotzka.json
@@ -227,6 +244,7 @@ files:
227
244
  - spec/integration/yard/arstotzka/crawler_spec.rb
228
245
  - spec/integration/yard/arstotzka/fetcher_builder_spec.rb
229
246
  - spec/integration/yard/arstotzka/fetcher_spec.rb
247
+ - spec/integration/yard/arstotzka/hash_reader_spec.rb
230
248
  - spec/integration/yard/arstotzka/method_builder_spec.rb
231
249
  - spec/integration/yard/arstotzka/options_spec.rb
232
250
  - spec/integration/yard/arstotzka/reader_spec.rb
@@ -236,6 +254,7 @@ files:
236
254
  - spec/lib/arstotzka/crawler_spec.rb
237
255
  - spec/lib/arstotzka/fetcher_builder_spec.rb
238
256
  - spec/lib/arstotzka/fetcher_spec.rb
257
+ - spec/lib/arstotzka/hash_reader_spec.rb
239
258
  - spec/lib/arstotzka/method_builder_spec.rb
240
259
  - spec/lib/arstotzka/options_spec.rb
241
260
  - spec/lib/arstotzka/reader_spec.rb
@@ -310,6 +329,7 @@ test_files:
310
329
  - spec/integration/yard/arstotzka/crawler_spec.rb
311
330
  - spec/integration/yard/arstotzka/fetcher_builder_spec.rb
312
331
  - spec/integration/yard/arstotzka/fetcher_spec.rb
332
+ - spec/integration/yard/arstotzka/hash_reader_spec.rb
313
333
  - spec/integration/yard/arstotzka/method_builder_spec.rb
314
334
  - spec/integration/yard/arstotzka/options_spec.rb
315
335
  - spec/integration/yard/arstotzka/reader_spec.rb
@@ -319,6 +339,7 @@ test_files:
319
339
  - spec/lib/arstotzka/crawler_spec.rb
320
340
  - spec/lib/arstotzka/fetcher_builder_spec.rb
321
341
  - spec/lib/arstotzka/fetcher_spec.rb
342
+ - spec/lib/arstotzka/hash_reader_spec.rb
322
343
  - spec/lib/arstotzka/method_builder_spec.rb
323
344
  - spec/lib/arstotzka/options_spec.rb
324
345
  - spec/lib/arstotzka/reader_spec.rb