arstotzka 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.circleci/config.yml +1 -1
- data/Dockerfile +2 -4
- data/README.md +1 -1
- data/arstotzka.gemspec +1 -1
- data/config/yardstick.yml +10 -10
- data/lib/arstotzka.rb +12 -11
- data/lib/arstotzka/class_methods.rb +38 -2
- data/lib/arstotzka/crawler.rb +14 -21
- data/lib/arstotzka/fetcher.rb +24 -21
- data/lib/arstotzka/fetcher_builder.rb +167 -0
- data/lib/arstotzka/{builder.rb → method_builder.rb} +22 -49
- data/lib/arstotzka/options.rb +13 -6
- data/lib/arstotzka/reader.rb +4 -4
- data/lib/arstotzka/type_cast.rb +3 -2
- data/lib/arstotzka/version.rb +1 -1
- data/lib/arstotzka/wrapper.rb +1 -1
- data/spec/integration/yard/arstotzka/crawler_spec.rb +5 -4
- data/spec/integration/yard/arstotzka/fetcher_builder_spec.rb +91 -0
- data/spec/integration/yard/arstotzka/fetcher_spec.rb +2 -2
- data/spec/integration/yard/arstotzka/{builder_spec.rb → method_builder_spec.rb} +3 -2
- data/spec/integration/yard/arstotzka/reader_spec.rb +2 -1
- data/spec/lib/arstotzka/crawler_spec.rb +3 -2
- data/spec/lib/arstotzka/fetcher_builder_spec.rb +30 -0
- data/spec/lib/arstotzka/fetcher_spec.rb +13 -13
- data/spec/lib/arstotzka/{builder_spec.rb → method_builder_spec.rb} +2 -1
- data/spec/lib/arstotzka/options_spec.rb +83 -0
- data/spec/lib/arstotzka/reader_spec.rb +2 -1
- data/spec/support/models/account.rb +6 -0
- data/spec/support/models/arstotzka/fetcher/dummy.rb +7 -0
- data/spec/support/models/my_model.rb +2 -0
- data/spec/support/models/star.rb +13 -2
- data/spec/support/models/star_gazer.rb +6 -0
- metadata +15 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3d37d619db8888a43c76400066d7657b53bbf94297e2be0f900fd7f1c391d080
|
4
|
+
data.tar.gz: 98d542ee52adac431bfe9acfcbc4a1bdd6cfdc002647b594b0f4fedfe371a208
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94dcbbed1f5665dab68a52f82222016aad12c68aca3f6676bbf95727f2131bd94c48217e584a245342519ac7c3da887852f85ca3300bf9b5c2a12b2e9d6847e1
|
7
|
+
data.tar.gz: cc368f423651b046af8965f8ca5fc34efbfc8e026c5f894d615621d597360009f713a81554b57e5d8361559f4cf013909be0411ee47bce5a2259f25eef3a8851
|
data/.circleci/config.yml
CHANGED
data/Dockerfile
CHANGED
data/README.md
CHANGED
data/arstotzka.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_runtime_dependency 'activesupport', '~> 5.x'
|
22
22
|
spec.add_runtime_dependency 'sinclair', '>= 1.1.1'
|
23
23
|
|
24
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.16.1'
|
25
25
|
spec.add_development_dependency 'pry-nav', '~> 0.2.4'
|
26
26
|
spec.add_development_dependency 'rake', '>= 12.3.1'
|
27
27
|
spec.add_development_dependency 'rspec', '>= 3.8'
|
data/config/yardstick.yml
CHANGED
@@ -19,30 +19,30 @@ rules:
|
|
19
19
|
ReturnTag:
|
20
20
|
enabled: true
|
21
21
|
exclude:
|
22
|
-
- Arstotzka::Builder#attr_names
|
23
|
-
- Arstotzka::Builder#options
|
24
|
-
- Arstotzka::Builder#json_name
|
25
22
|
- Arstotzka::Crawler#post_process
|
26
23
|
- Arstotzka::Crawler#options
|
27
|
-
- Arstotzka::Fetcher#keys
|
28
|
-
- Arstotzka::Fetcher#hash
|
29
24
|
- Arstotzka::Fetcher#instance
|
30
25
|
- Arstotzka::Fetcher#options
|
26
|
+
- Arstotzka::Fetcher#hash
|
27
|
+
- Arstotzka::FetcherBuilder#options
|
28
|
+
- Arstotzka::MethodBuilder#attr_names
|
29
|
+
- Arstotzka::MethodBuilder#options
|
30
|
+
- Arstotzka::Options#keys
|
31
31
|
- Arstotzka::Reader#keys
|
32
32
|
- Arstotzka::Reader#options
|
33
33
|
- Arstotzka::Wrapper#options
|
34
34
|
Summary::Presence:
|
35
35
|
enabled: true
|
36
36
|
exclude:
|
37
|
-
- Arstotzka::Builder#attr_names
|
38
|
-
- Arstotzka::Builder#options
|
39
|
-
- Arstotzka::Builder#json_name
|
40
37
|
- Arstotzka::Crawler#post_process
|
41
38
|
- Arstotzka::Crawler#options
|
42
|
-
- Arstotzka::Fetcher#keys
|
43
|
-
- Arstotzka::Fetcher#hash
|
44
39
|
- Arstotzka::Fetcher#instance
|
45
40
|
- Arstotzka::Fetcher#options
|
41
|
+
- Arstotzka::Fetcher#hash
|
42
|
+
- Arstotzka::FetcherBuilder#options
|
43
|
+
- Arstotzka::MethodBuilder#attr_names
|
44
|
+
- Arstotzka::MethodBuilder#options
|
45
|
+
- Arstotzka::Options#keys
|
46
46
|
- Arstotzka::Reader#keys
|
47
47
|
- Arstotzka::Reader#options
|
48
48
|
- Arstotzka::Wrapper#options
|
data/lib/arstotzka.rb
CHANGED
@@ -159,19 +159,20 @@ require 'sinclair'
|
|
159
159
|
# # Collector::Game.new(name: "Zelda", played: 90.0)
|
160
160
|
# # ]
|
161
161
|
#
|
162
|
-
# @see Arstotzka::
|
162
|
+
# @see Arstotzka::MethodBuilder
|
163
163
|
# @see Arstotzka::ClassMethods
|
164
164
|
module Arstotzka
|
165
165
|
extend ActiveSupport::Concern
|
166
166
|
|
167
|
-
autoload :Base,
|
168
|
-
autoload :
|
169
|
-
autoload :
|
170
|
-
autoload :
|
171
|
-
autoload :
|
172
|
-
autoload :
|
173
|
-
autoload :
|
174
|
-
autoload :
|
175
|
-
autoload :
|
176
|
-
autoload :TypeCast,
|
167
|
+
autoload :Base, 'arstotzka/base'
|
168
|
+
autoload :ClassMethods, 'arstotzka/class_methods'
|
169
|
+
autoload :Crawler, 'arstotzka/crawler'
|
170
|
+
autoload :Exception, 'arstotzka/exception'
|
171
|
+
autoload :Fetcher, 'arstotzka/fetcher'
|
172
|
+
autoload :FetcherBuilder, 'arstotzka/fetcher_builder'
|
173
|
+
autoload :MethodBuilder, 'arstotzka/method_builder'
|
174
|
+
autoload :Options, 'arstotzka/options'
|
175
|
+
autoload :Reader, 'arstotzka/reader'
|
176
|
+
autoload :TypeCast, 'arstotzka/type_cast'
|
177
|
+
autoload :Wrapper, 'arstotzka/wrapper'
|
177
178
|
end
|
@@ -4,6 +4,32 @@ module Arstotzka
|
|
4
4
|
# As Arstotzka extends ActiveSupport::Concern, Arstotzka::ClassMethods define
|
5
5
|
# methods that will be available when defining a class that includes Arstotka
|
6
6
|
module ClassMethods
|
7
|
+
# @api private
|
8
|
+
#
|
9
|
+
# Create builder that will be used to create Fetchers
|
10
|
+
#
|
11
|
+
# @param attribute [Symbol,String] attribute key
|
12
|
+
# @param options [Arstotzka::Options] fetcher options
|
13
|
+
#
|
14
|
+
# @return [Artotzka::FetcherBuilder]
|
15
|
+
def add_fetcher(attribute, options)
|
16
|
+
fetcher_builders[attribute.to_sym] = FetcherBuilder.new(options.merge(key: attribute))
|
17
|
+
end
|
18
|
+
|
19
|
+
# @api private
|
20
|
+
#
|
21
|
+
# Return the fetcher for an attribute and instance
|
22
|
+
#
|
23
|
+
# a new fetcher is built everytime this method is called
|
24
|
+
#
|
25
|
+
# @param attribute [Symbol,String] Name of method that will use this Fetcher
|
26
|
+
# @param instance [Object] instance that will contain the Hash needed by fetcher
|
27
|
+
#
|
28
|
+
# @return [Arstotzka::Fetcher]
|
29
|
+
def fetcher_for(attribute, instance)
|
30
|
+
fetcher_builders[attribute.to_sym].build(instance)
|
31
|
+
end
|
32
|
+
|
7
33
|
private
|
8
34
|
|
9
35
|
# @api public
|
@@ -37,13 +63,23 @@ module Arstotzka
|
|
37
63
|
#
|
38
64
|
# @return [Array<Sinclair::MethodDefinition>]
|
39
65
|
#
|
40
|
-
# @see
|
66
|
+
# @see MethodBuilder Arstotzka::MethodBuilder
|
41
67
|
# @see
|
42
68
|
# https://www.rubydoc.info/gems/activesupport/5.2.2/ActiveSupport/Concern
|
43
69
|
# ActiveSupport::Concern
|
44
70
|
def expose(*attr_names, **options_hash)
|
45
71
|
options = Options.new(options_hash.symbolize_keys)
|
46
|
-
|
72
|
+
MethodBuilder.new(attr_names, self, options).build
|
73
|
+
end
|
74
|
+
|
75
|
+
# @private
|
76
|
+
# @api private
|
77
|
+
#
|
78
|
+
# Map of FetcherBuilders
|
79
|
+
#
|
80
|
+
# @return [Hash<FetcherBuilder>]
|
81
|
+
def fetcher_builders
|
82
|
+
@fetcher_builders ||= {}
|
47
83
|
end
|
48
84
|
end
|
49
85
|
end
|
data/lib/arstotzka/crawler.rb
CHANGED
@@ -5,8 +5,8 @@ module Arstotzka
|
|
5
5
|
#
|
6
6
|
# @api private
|
7
7
|
#
|
8
|
-
# @example
|
9
|
-
# crawler = Arstotzka::Crawler.new(
|
8
|
+
# @example Simple usage
|
9
|
+
# crawler = Arstotzka::Crawler.new(full_path: 'person.information.first_name')
|
10
10
|
# hash = {
|
11
11
|
# person: {
|
12
12
|
# 'information' => {
|
@@ -45,21 +45,13 @@ module Arstotzka
|
|
45
45
|
# @return [Object] value fetched from the last Hash#fetch call using the last part
|
46
46
|
# of keys
|
47
47
|
#
|
48
|
-
# @example
|
49
|
-
# crawler = Arstotzka::Crawler.new(keys: %w(person information first_name))
|
50
|
-
# hash = {
|
51
|
-
# person: {
|
52
|
-
# 'information' => {
|
53
|
-
# 'firstName' => 'John'
|
54
|
-
# }
|
55
|
-
# }
|
56
|
-
# }
|
57
|
-
# crawler.value(hash) # returns 'John'
|
48
|
+
# @example (see Arstotzka::Crawler)
|
58
49
|
#
|
59
|
-
# @example
|
50
|
+
# @example Passing compact and case options
|
60
51
|
# crawler = Arstotzka::Crawler.new(
|
61
|
-
#
|
62
|
-
# compact:
|
52
|
+
# full_path: 'companies.games.hero',
|
53
|
+
# compact: true,
|
54
|
+
# case: :snake
|
63
55
|
# )
|
64
56
|
# games_hash = {
|
65
57
|
# 'companies' => [{
|
@@ -77,18 +69,19 @@ module Arstotzka
|
|
77
69
|
#
|
78
70
|
# crawler.value(games_hash) # returns [['Rakhar']]
|
79
71
|
#
|
80
|
-
# @example
|
72
|
+
# @example Passing default option
|
81
73
|
# crawler = Arstotzka::Crawler.new(
|
82
|
-
#
|
74
|
+
# full_path: 'companies.games.hero',
|
83
75
|
# compact: true, case: :snake, default: 'NO HERO'
|
84
76
|
# )
|
85
77
|
#
|
86
78
|
# crawler.value(games_hash) # returns [['NO HERO', 'Rakhar'], 'NO HERO']
|
87
79
|
#
|
88
|
-
# @example
|
80
|
+
# @example Passing a post processor block
|
89
81
|
# crawler = Arstotzka::Crawler.new(
|
90
|
-
#
|
91
|
-
# compact:
|
82
|
+
# full_path: 'companies.games.hero',
|
83
|
+
# compact: true,
|
84
|
+
# case: : snake
|
92
85
|
# ) { |value| value.&to_sym }
|
93
86
|
#
|
94
87
|
# crawler.value(games_hash) # returns [[:Rakhar]]
|
@@ -102,7 +95,7 @@ module Arstotzka
|
|
102
95
|
|
103
96
|
# @private
|
104
97
|
attr_reader :post_process, :options
|
105
|
-
delegate :
|
98
|
+
delegate :compact, :default, to: :options
|
106
99
|
|
107
100
|
# Fetch the value from hash by crawling the keys
|
108
101
|
#
|
data/lib/arstotzka/fetcher.rb
CHANGED
@@ -10,14 +10,16 @@ module Arstotzka
|
|
10
10
|
|
11
11
|
# Creates an instance of Artotzka::Fetcher
|
12
12
|
#
|
13
|
-
# @param hash [Hash] Hash to be crawled for value
|
14
13
|
# @param instance [Object] object whose methods will be called after for processing
|
15
|
-
#
|
16
|
-
|
14
|
+
#
|
15
|
+
# @overload iniitalize(instance, options_hash = {})
|
16
|
+
# @param options_hash [Hash] options for {Crawler}, {Wrapper} and {Reader}
|
17
|
+
#
|
18
|
+
# @overload iniitalize(instance, options)
|
19
|
+
# @param options [Arstotzka::Options] options for {Crawler}, {Wrapper} and {Reader}
|
20
|
+
def initialize(instance, options_hash = {})
|
17
21
|
self.options = options_hash
|
18
22
|
|
19
|
-
@keys = options.path.to_s.split('.')
|
20
|
-
@hash = hash
|
21
23
|
@instance = instance
|
22
24
|
end
|
23
25
|
|
@@ -28,7 +30,7 @@ module Arstotzka
|
|
28
30
|
#
|
29
31
|
# @return [Object] The final value found and transformed
|
30
32
|
#
|
31
|
-
# @example
|
33
|
+
# @example Fetching with wrapping and processing
|
32
34
|
# class Transaction
|
33
35
|
# attr_reader :value, :type
|
34
36
|
#
|
@@ -43,8 +45,14 @@ module Arstotzka
|
|
43
45
|
# end
|
44
46
|
#
|
45
47
|
# class Account
|
48
|
+
# def initialize(json = {})
|
49
|
+
# @json = json
|
50
|
+
# end
|
51
|
+
#
|
46
52
|
# private
|
47
53
|
#
|
54
|
+
# attr_reader :json
|
55
|
+
#
|
48
56
|
# def filter_income(transactions)
|
49
57
|
# transactions.select(&:positive?)
|
50
58
|
# end
|
@@ -61,8 +69,10 @@ module Arstotzka
|
|
61
69
|
# { value: 101.00, type: 'outcome' }
|
62
70
|
# ]
|
63
71
|
# }
|
72
|
+
#
|
64
73
|
# instance = Account.new
|
65
|
-
#
|
74
|
+
#
|
75
|
+
# fetcher = Arstotzka::Fetcher.new(instance,
|
66
76
|
# path: 'transactions',
|
67
77
|
# klass: Transaction,
|
68
78
|
# after: :filter_income
|
@@ -82,10 +92,14 @@ module Arstotzka
|
|
82
92
|
private
|
83
93
|
|
84
94
|
# @private
|
85
|
-
attr_reader :
|
95
|
+
attr_reader :instance, :options
|
86
96
|
delegate :after, :flatten, to: :options
|
87
97
|
delegate :wrap, to: :wrapper
|
88
98
|
|
99
|
+
def hash
|
100
|
+
@hash ||= instance.send(:eval, options.json.to_s)
|
101
|
+
end
|
102
|
+
|
89
103
|
# @private
|
90
104
|
#
|
91
105
|
# Returns an instance of Aristotzka::Craler
|
@@ -96,29 +110,18 @@ module Arstotzka
|
|
96
110
|
# @return [Arstotzka::Crawler] the crawler object
|
97
111
|
def crawler
|
98
112
|
@crawler ||=
|
99
|
-
|
113
|
+
Crawler.new(options) do |value|
|
100
114
|
wrap(value)
|
101
115
|
end
|
102
116
|
end
|
103
117
|
|
104
|
-
# @private
|
105
|
-
#
|
106
|
-
# Hash for crawler initialization
|
107
|
-
#
|
108
|
-
# @return [Hash]
|
109
|
-
#
|
110
|
-
# @see #crawler
|
111
|
-
def crawler_options
|
112
|
-
options.merge(keys: keys)
|
113
|
-
end
|
114
|
-
|
115
118
|
# @private
|
116
119
|
#
|
117
120
|
# Wrapper responsible for wrapping the value found
|
118
121
|
#
|
119
122
|
# @return [Arstotzka::Wrapper] the wrapper
|
120
123
|
def wrapper
|
121
|
-
@wrapper ||=
|
124
|
+
@wrapper ||= Wrapper.new(options)
|
122
125
|
end
|
123
126
|
end
|
124
127
|
end
|
@@ -0,0 +1,167 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Arstotzka
|
4
|
+
# @api private
|
5
|
+
#
|
6
|
+
# Class responsible for building fetcher that will be used
|
7
|
+
# to create instance fetchers
|
8
|
+
#
|
9
|
+
# @example Building a simple fetcher
|
10
|
+
# class MyModel
|
11
|
+
# include Arstotzka
|
12
|
+
#
|
13
|
+
# attr_reader :json
|
14
|
+
#
|
15
|
+
# def initialize(json)
|
16
|
+
# @json = json
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# options = Arstotzka::Options.new(key: :id, path: :person)
|
21
|
+
# builder = Arstotzka::FetcherBuilder.new(options)
|
22
|
+
# instance = MyModel.new(
|
23
|
+
# person: {
|
24
|
+
# id: 101
|
25
|
+
# }
|
26
|
+
# )
|
27
|
+
#
|
28
|
+
# fetcher = builder.build(instance)
|
29
|
+
#
|
30
|
+
# fetcher.fetch # returns 101
|
31
|
+
class FetcherBuilder
|
32
|
+
include Base
|
33
|
+
|
34
|
+
# Creates an instance of Artotzka::FetcherBuilder
|
35
|
+
#
|
36
|
+
# @overload initialize(options_hash = {})
|
37
|
+
# @param options_hash [Hash] options (see {Options})
|
38
|
+
#
|
39
|
+
# @overload initialize(options)
|
40
|
+
# @param options [Arstotzka::Options] options
|
41
|
+
def initialize(options_hash = {})
|
42
|
+
self.options = options_hash
|
43
|
+
end
|
44
|
+
|
45
|
+
# Builds a fetcher responsible for fetchin a value
|
46
|
+
#
|
47
|
+
# @param instance [Object] object that includes Arstotzka
|
48
|
+
#
|
49
|
+
# instance should be able to provide the hash where values
|
50
|
+
# will be fetched from
|
51
|
+
#
|
52
|
+
# @example (see Arstotzka::FetcherBuilder)
|
53
|
+
#
|
54
|
+
# @example Building a fetcher using full path
|
55
|
+
# class MyModel
|
56
|
+
# include Arstotzka
|
57
|
+
#
|
58
|
+
# attr_reader :json
|
59
|
+
#
|
60
|
+
# def initialize(json)
|
61
|
+
# @json = json
|
62
|
+
# end
|
63
|
+
# end
|
64
|
+
#
|
65
|
+
# options = Arstotzka::Options.new(
|
66
|
+
# key: :player_ids,
|
67
|
+
# full_path: 'teams.players.person_id',
|
68
|
+
# flatten: true,
|
69
|
+
# case: :snake
|
70
|
+
# )
|
71
|
+
# builder = Arstotzka::FetcherBuilder.new(options)
|
72
|
+
# hash = {
|
73
|
+
# teams: [
|
74
|
+
# {
|
75
|
+
# name: 'Team War',
|
76
|
+
# players: [
|
77
|
+
# { person_id: 101 },
|
78
|
+
# { person_id: 102 }
|
79
|
+
# ]
|
80
|
+
# }, {
|
81
|
+
# name: 'Team not War',
|
82
|
+
# players: [
|
83
|
+
# { person_id: 201 },
|
84
|
+
# { person_id: 202 }
|
85
|
+
# ]
|
86
|
+
# }
|
87
|
+
# ]
|
88
|
+
# }
|
89
|
+
# instance = MyModel.new(hash)
|
90
|
+
#
|
91
|
+
# fetcher = builder.build(instance)
|
92
|
+
#
|
93
|
+
# fetcher.fetch # returns [101, 102, 201, 202]
|
94
|
+
#
|
95
|
+
# @example Post processing results
|
96
|
+
# class StarGazer
|
97
|
+
# include Arstotzka
|
98
|
+
#
|
99
|
+
# attr_reader :json
|
100
|
+
#
|
101
|
+
# def initialize(json = {})
|
102
|
+
# @json = json
|
103
|
+
# end
|
104
|
+
#
|
105
|
+
# private
|
106
|
+
#
|
107
|
+
# def only_yellow(stars)
|
108
|
+
# stars.select(&:yellow?)
|
109
|
+
# end
|
110
|
+
# end
|
111
|
+
#
|
112
|
+
# class Star
|
113
|
+
# attr_reader :name, :color
|
114
|
+
#
|
115
|
+
# def initialize(name:, color: 'yellow')
|
116
|
+
# @name = name
|
117
|
+
# @color = color
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
# def yellow?
|
121
|
+
# color == 'yellow'
|
122
|
+
# end
|
123
|
+
# end
|
124
|
+
#
|
125
|
+
# hash = {
|
126
|
+
# teams: [
|
127
|
+
# {
|
128
|
+
# name: 'Team War',
|
129
|
+
# players: [
|
130
|
+
# { person_id: 101 },
|
131
|
+
# { person_id: 102 }
|
132
|
+
# ]
|
133
|
+
# }, {
|
134
|
+
# name: 'Team not War',
|
135
|
+
# players: [
|
136
|
+
# { person_id: 201 },
|
137
|
+
# { person_id: 202 }
|
138
|
+
# ]
|
139
|
+
# }
|
140
|
+
# ]
|
141
|
+
# }
|
142
|
+
#
|
143
|
+
# instance = StarGazer.new(hash)
|
144
|
+
#
|
145
|
+
# options = Arstotzka::Options.new(
|
146
|
+
# key: :stars, klass: Star, after: :only_yellow
|
147
|
+
# )
|
148
|
+
#
|
149
|
+
# builder = Arstotzka::FetcherBuilder.new(options)
|
150
|
+
# fetcher = builder.build(instance)
|
151
|
+
#
|
152
|
+
# fetcher.fetch # returns [
|
153
|
+
# # Star.new(name: 'Sun', color: 'yellow'),
|
154
|
+
# # Star.new(name: 'HB0124-C', color: 'yellow'),
|
155
|
+
# # ]
|
156
|
+
#
|
157
|
+
# @return Arstotzka::Fetcher
|
158
|
+
def build(instance)
|
159
|
+
Fetcher.new(instance, options)
|
160
|
+
end
|
161
|
+
|
162
|
+
private
|
163
|
+
|
164
|
+
# @private
|
165
|
+
attr_reader :options
|
166
|
+
end
|
167
|
+
end
|