blockscore 4.1.2 → 4.2.0

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
  SHA1:
3
- metadata.gz: 82446b25c65c2a01e5e3c8c6a66b9b426500f2f0
4
- data.tar.gz: c0776cba02503baebf61956f08b0ce1b8f841352
3
+ metadata.gz: 31656e876ca18bd6ba1359ba1492353965581e9f
4
+ data.tar.gz: 0a9bdf94792ba330ec53704244cfa0ad422c3f60
5
5
  SHA512:
6
- metadata.gz: ab554cbb20db9964d566c42f2db836d8f42ef9b7cec15b2a9924f1208af561390b191d86f883afb2e1ea40cd0b7402c56f06b731acf48a71f65f35a6bca748e2
7
- data.tar.gz: 4e52cee7599adbfc38e050e3427e28d90f3e45e90ece57a221db131c17286606835a7d7f7265bb04c9a21ca713814781bb649ea908de9658271dab95d305bc69
6
+ metadata.gz: a224c33dceda3aef587dc99c2aab9b88013e90bbd49cee3736642d057609030c9dcd61d0e28d1b7f9dc5caf29994100eeddb17888d7ac84d9850e0b727038da9
7
+ data.tar.gz: f520cb0f7700a006c914670b9146bfe7ed4c1b4dcff70576eaa78962c5c3498637675b4383e8736a400798374cf21d5da5b621a4b283c3bd46188e1c8af87843
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+
1
2
  # rcov generated
2
3
  coverage
3
4
  coverage.data
@@ -15,7 +16,7 @@ doc
15
16
  # jeweler generated
16
17
  pkg
17
18
 
18
- # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
19
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
19
20
  #
20
21
  # * Create a file at ~/.gitignore
21
22
  # * Include files you want ignored
data/Gemfile CHANGED
@@ -7,40 +7,3 @@ group :test do
7
7
  gem 'devtools', github: 'mbj/devtools'
8
8
  end
9
9
  end
10
-
11
- group :guard do
12
- # Notifications for guard specs
13
- gem 'growl', '~> 1.0.3'
14
-
15
- # Filewatcher and runner
16
- gem 'guard', '~> 2.12.4'
17
-
18
- # Autorun documentation critic
19
- gem 'guard-inch', '~> 0.1'
20
-
21
- # Autogen docs
22
- gem 'guard-yard', '~> 2.1'
23
-
24
- # My fork of guard-yardstick which makes the keywords more prominent
25
- gem 'guard-yardstick', github: 'backus/guard-yardstick', branch: 'color'
26
-
27
- # Autorun style critic
28
- gem 'guard-rubocop', '~> 1.2'
29
-
30
- gem 'rubocop-rspec', '~> 1.3', github: 'nevir/rubocop-rspec'
31
-
32
- # Autorun codesmell critic
33
- gem 'guard-reek', '= 0.0.3', github: 'backus/guard-reek'
34
-
35
- # Autorun similar code critic
36
- gem 'guard-flay', '= 0.0.3', github: 'backus/guard-flay'
37
-
38
- # Autorun painful code critic
39
- gem 'guard-flog', '= 0.0.4', github: 'backus/guard-flog'
40
-
41
- # Autorun specs
42
- gem 'guard-rspec', '~> 4.6'
43
-
44
- # rebundle
45
- gem 'guard-bundler', '~> 2.1'
46
- end
data/README.md CHANGED
@@ -13,7 +13,7 @@ gem install blockscore
13
13
  If you are using Rails, add the following to your `Gemfile`:
14
14
 
15
15
  ```ruby
16
- gem 'blockscore', '~> 4.1.2'
16
+ gem 'blockscore', '~> 4.2.0'
17
17
  ```
18
18
 
19
19
  ## Getting Started
@@ -60,5 +60,5 @@ To see the list of calls you can make, please visit our [full Ruby API reference
60
60
  The test suite uses a public BlockScore API key that was created specifically to ease the testing and contribution processes. **Please do not enter personal details for tests.** In order to run the test suite:
61
61
 
62
62
  ```shell
63
- $ rake test
63
+ $ rspec spec
64
64
  ```
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.add_development_dependency 'bundler', '~> 1.0'
30
30
  spec.add_development_dependency 'simplecov', '~> 0'
31
31
  spec.add_development_dependency 'rspec', '~> 3'
32
+ spec.add_development_dependency 'rspec-its', '~> 1'
32
33
  spec.add_development_dependency 'webmock', '~> 1.21'
33
34
  spec.add_development_dependency 'faker', '~> 1.4'
34
35
  spec.add_development_dependency 'factory_girl', '~> 4.5'
data/circle.yml CHANGED
@@ -1,13 +1,7 @@
1
1
  dependencies:
2
2
  override:
3
- - "rvm-exec 1.9.3-p551 bundle install"
4
- - "rvm-exec 2.0.0-p598 bundle install"
5
- - "rvm-exec 2.1.5 bundle install"
6
- - "rvm-exec 2.2.0 bundle install"
7
-
3
+ - ./circleci.sh build
8
4
  test:
9
5
  override:
10
- - "rvm-exec 1.9.3-p551 bundle exec rspec"
11
- - "rvm-exec 2.0.0-p598 bundle exec rspec"
12
- - "rvm-exec 2.1.5 bundle exec rspec"
13
- - "rvm-exec 2.2.0 bundle exec rspec"
6
+ - ./circleci.sh spec:
7
+ parallel: true
@@ -0,0 +1,11 @@
1
+ #!/bin/bash
2
+ RUBY_VERSIONS=(1.9.3-p551 2.0.0-p598 2.1.5 2.2.3)
3
+ CIRCLE_NODE_RUBY_VERSION="${RUBY_VERSIONS[$CIRCLE_NODE_INDEX]}"
4
+
5
+ if [[ "$1" = "build" ]]
6
+ then
7
+ rvm-exec $CIRCLE_NODE_RUBY_VERSION bundle install;
8
+ elif [[ "$1" = "spec" ]]
9
+ then
10
+ rvm-exec $CIRCLE_NODE_RUBY_VERSION rspec;
11
+ fi
@@ -1,3 +1,4 @@
1
+ require 'delegate'
1
2
  require 'forwardable'
2
3
  require 'httparty'
3
4
  require 'json'
@@ -26,6 +27,7 @@ require 'blockscore/question_set'
26
27
  require 'blockscore/watchlist_hit'
27
28
 
28
29
  require 'blockscore/collection'
30
+ require 'blockscore/collection/member'
29
31
  require 'blockscore/connection'
30
32
  require 'blockscore/dispatch'
31
33
  require 'blockscore/fingerprint'
@@ -34,11 +36,7 @@ require 'blockscore/util'
34
36
  require 'blockscore/version'
35
37
 
36
38
  module BlockScore
37
- def self.api_key=(api_key)
38
- @api_key = api_key
39
- end
40
-
41
- def self.api_key
42
- @api_key
39
+ class << self
40
+ attr_accessor :api_key
43
41
  end
44
42
  end
@@ -11,8 +11,10 @@ module BlockScore
11
11
  # => #<BlockScore::Person:0x007fe39c424410>
12
12
  module Retrieve
13
13
  module ClassMethods
14
- def retrieve(id)
15
- get("#{endpoint}/#{id}", {})
14
+ def retrieve(id, options = {})
15
+ fail ArgumentError if id.empty?
16
+ req = ->() { get("#{endpoint}/#{id}", options) }
17
+ new(id: id, &req)
16
18
  end
17
19
  end
18
20
 
@@ -28,7 +28,7 @@ module BlockScore
28
28
  def_delegators 'self.class', :endpoint, :patch
29
29
 
30
30
  def save!
31
- if respond_to? :id
31
+ if persisted?
32
32
  patch("#{endpoint}/#{id}", filter_params)
33
33
  true
34
34
  else
@@ -4,19 +4,37 @@ module BlockScore
4
4
  class Base
5
5
  extend Connection
6
6
 
7
- attr_reader :attributes
8
-
9
- def initialize(options = {})
7
+ def initialize(options = {}, &block)
8
+ @loaded = !(block)
9
+ @proc = block
10
10
  @attributes = options
11
11
  end
12
12
 
13
+ def attributes
14
+ return @attributes if @loaded
15
+ force!
16
+ @attributes
17
+ end
18
+
19
+ def force!
20
+ res = @proc.call
21
+ @attributes = res.attributes.merge(@attributes)
22
+ @loaded = true
23
+ self
24
+ end
25
+
26
+ def id
27
+ @attributes.fetch(:id, nil)
28
+ end
29
+
13
30
  def inspect
14
- "#<#{self.class}:0x#{object_id.to_s(16)} JSON: " + JSON.pretty_generate(attributes)
31
+ str_attr = "JSON:#{JSON.pretty_generate(attributes)}"
32
+ "#<#{self.class}:0x#{object_id.to_s(16)} #{str_attr}>"
15
33
  end
16
34
 
17
35
  def refresh
18
- r = self.class.retrieve(id)
19
- @attributes = r.attributes
36
+ res = self.class.retrieve(id)
37
+ @attributes = res.attributes
20
38
 
21
39
  true
22
40
  rescue Error
@@ -45,16 +63,18 @@ module BlockScore
45
63
  end
46
64
 
47
65
  def self.endpoint
48
- if self == Base
49
- fail NotImplementedError, 'Base is an abstract class, not an API resource'
50
- end
66
+ fail NotImplementedError, 'Base is an abstract class, not an API resource' if equal?(Base)
51
67
 
52
68
  "#{api_url}#{Util.to_plural(resource)}"
53
69
  end
54
70
 
71
+ def persisted?
72
+ !id.nil?
73
+ end
74
+
55
75
  protected
56
76
 
57
- def add_accessor(symbol, *args)
77
+ def add_accessor(symbol, *_args)
58
78
  singleton_class.instance_eval do
59
79
  define_method(symbol) do
60
80
  wrap_attribute(attributes[symbol])
@@ -1,18 +1,239 @@
1
1
  module BlockScore
2
+ # Collection is a proxy between the parent and the asssociated members
3
+ # where parent is some instance of a resource
4
+ #
2
5
  class Collection < Array
3
- def initialize(target)
4
- super()
5
- @target = target
6
+ # @!attribute [r] parent
7
+ # resource which owns a collection of other resources
8
+ #
9
+ # @example
10
+ # person.question_sets.parent # => person
11
+ #
12
+ # @return [BlockScore::Base] a resource
13
+ #
14
+ # @api private
15
+ attr_reader :parent
16
+
17
+ # Sets parent and member_class then registers embedded ids
18
+ #
19
+ # @param [BlockScore::Base] parent
20
+ # @param [Class] class of collection members
21
+ #
22
+ # @return [undefined]
23
+ #
24
+ # @api private
25
+ def initialize(parent, member_class)
26
+ @parent = parent
27
+ @member_class = member_class
28
+ register_parent_data
29
+ end
30
+
31
+ # Syntactic sugar method for returning collection
32
+ #
33
+ # @example
34
+ # all # returns collection
35
+ #
36
+ # @return [self]
37
+ #
38
+ # @api public
39
+ def all
40
+ self
41
+ end
42
+
43
+ # Initializes new {member_class} with `params`
44
+ #
45
+ # - Ensures a parent id is meged into `params` (see #default_params).
46
+ # - Defines method `#save` on new collection member
47
+ # - Adds new item to collection
48
+ #
49
+ # @example usage
50
+ #
51
+ # >> person = person = BlockScore::Person.retrieve('55de4af7643735000300000f')
52
+ # >> person.question_sets.new
53
+ # => #<BlockScore::QuestionSet:0x3fc67902f1b4 JSON:{
54
+ # "person_id": "55de4af7643735000300000f"
55
+ # }>
56
+ #
57
+ # @param params [Hash] initial params for member
58
+ #
59
+ # @return instance of {member_class}
60
+ #
61
+ # @api public
62
+ def new(params = {})
63
+ attributes = params.merge(default_params)
64
+ instance = member_class.new(attributes)
65
+
66
+ new_member(instance) do |member|
67
+ self << member
68
+ end
69
+ end
70
+
71
+ # Relaod the contents of the collection
72
+ #
73
+ # @example usage
74
+ # person.question_sets.refresh # => [#<BlockScore::QuestionSet...]
75
+ #
76
+ # @return [self]
77
+ #
78
+ # @api public
79
+ def refresh
80
+ clear
81
+ register_parent_data
82
+ self
6
83
  end
7
84
 
8
- def respond_to?(method, include_all = false)
9
- @target.respond_to?(method, include_all)
85
+ # Name of parent resource
86
+ #
87
+ # @example
88
+ # self.parent_name # => 'person'
89
+ #
90
+ # @return [String]
91
+ #
92
+ # @api semipublic
93
+ def parent_name
94
+ parent.class.resource
95
+ end
96
+
97
+ # Initialize a collection member and save it
98
+ #
99
+ # @example
100
+ # >> person.question_sets.create
101
+ # => #<BlockScore::QuestionSet:0x3fc67a6007f4 JSON:{
102
+ # "object": "question_set",
103
+ # "id": "55ef5d5b62386200030001b3",
104
+ # "created_at": 1441750363,
105
+ # ...
106
+ # }
107
+ #
108
+ # @param params [Hash] params
109
+ #
110
+ # @return new saved instance of {member_class}
111
+ #
112
+ # @api public
113
+ def create(params = {})
114
+ fail Error, 'Create parent first' unless parent.id
115
+ assoc_params = default_params.merge(params)
116
+ instance = member_class.create(assoc_params)
117
+
118
+ new_member(instance) do |member|
119
+ register_to_parent(member)
120
+ end
121
+ end
122
+
123
+ # Retrieve a collection member by its id
124
+ #
125
+ # @example usage
126
+ # person.question_sets.retrieve('55ef5b4e3532630003000178') # => instance of QuestionSet
127
+ #
128
+ # @param id [String] resource id
129
+ #
130
+ # @return instance of {member_class} if found
131
+ # @raise [BlockScore::NotFoundError] otherwise
132
+ #
133
+ # @api public
134
+ def retrieve(id)
135
+ each do |item|
136
+ next unless item.id == id
137
+ return item
138
+ end
139
+
140
+ instance = member_class.retrieve(id)
141
+
142
+ new_member(instance) do |member|
143
+ register_to_parent(member)
144
+ end
145
+ end
146
+
147
+ protected
148
+
149
+ # @!attribute [r] member_class
150
+ # class which will be used for the embedded
151
+ # resources in the collection
152
+ #
153
+ # @return [Class]
154
+ #
155
+ # @api private
156
+ attr_reader :member_class
157
+
158
+ # Default params for making an instance of {member_class}
159
+ #
160
+ # @return [Hash]
161
+ #
162
+ # @api private
163
+ def default_params
164
+ {
165
+ foriegn_key => parent.id
166
+ }
10
167
  end
11
168
 
12
169
  private
13
170
 
14
- def method_missing(method, *args, &block)
15
- @target.public_send(method, *args, &block)
171
+ # Generate foriegn key name for parent resource
172
+ #
173
+ # @return [Symbol] resource name as id
174
+ #
175
+ # @api private
176
+ def foriegn_key
177
+ :"#{parent_name}_id"
178
+ end
179
+
180
+ # Initialize a new collection member
181
+ #
182
+ # @param instance [BlockScore::Base] collection member instance
183
+ # @yield [Member] initialized member
184
+ #
185
+ # @return [Member] new member
186
+ #
187
+ # @api private
188
+ def new_member(instance, &blk)
189
+ Member.new(parent, instance).tap(&blk)
190
+ end
191
+
192
+ # Check if `parent_id` is defined on `item`
193
+ #
194
+ # @param item [BlockScore::Base] any resource
195
+ #
196
+ # @return [Boolean]
197
+ #
198
+ # @api private
199
+ def parent_id?(item)
200
+ parent.id && item.send(foriegn_key) == parent.id
201
+ end
202
+
203
+ # Register a resource in collection
204
+ #
205
+ # @param item [BlockScore::Base] a resource
206
+ #
207
+ # @raise [BlockScore::Error] if no `parent_id`
208
+ # @return [BlockScore::Base] otherwise
209
+ #
210
+ # @api private
211
+ def register_to_parent(item)
212
+ fail Error, 'None belonging' unless parent_id?(item)
213
+ ids << item.id
214
+ self << item
215
+ item
216
+ end
217
+
218
+ # Fetches embedded ids from parent and adds to self
219
+ #
220
+ # @return [undefined]
221
+ #
222
+ # @api private
223
+ def register_parent_data
224
+ ids.each do |id|
225
+ item = member_class.retrieve(id)
226
+ self << item
227
+ end
228
+ end
229
+
230
+ # ids that belong to the collection
231
+ #
232
+ # @return [Array<String>]
233
+ #
234
+ # @api private
235
+ def ids
236
+ parent.attributes.fetch(:"#{Util.to_plural(member_class.resource)}", [])
16
237
  end
17
238
  end
18
239
  end
@@ -0,0 +1,100 @@
1
+ module BlockScore
2
+ class Collection
3
+ # Member of a {Collection} class
4
+ class Member < SimpleDelegator
5
+ # Initialize a new member
6
+ #
7
+ # @param parent [BlockScore::Base] parent resource
8
+ # @param instance [BlockScore::Base] member instance
9
+ #
10
+ # @return [undefined]
11
+ #
12
+ # @api private
13
+ def initialize(parent, instance)
14
+ @instance = instance
15
+ @parent = parent
16
+
17
+ super(instance)
18
+ end
19
+
20
+ # Save parent, set parent id, and save instance
21
+ #
22
+ # @example
23
+ # # saves both unsaved person and unsaved question_set
24
+ # person = Person.new(attributes)
25
+ # question_set = QuestionSet.new
26
+ # Member.new(person, question_set).save
27
+ #
28
+ # @return return value of instance `#save`
29
+ #
30
+ # @api public
31
+ def save
32
+ save_parent
33
+ send(:"#{parent_name}_id=", parent.id)
34
+ result = instance.save
35
+ ids.push(instance.id) unless ids.include?(instance.id)
36
+ result
37
+ end
38
+
39
+ private
40
+
41
+ # Name of parent resource
42
+ #
43
+ # @example
44
+ # self.parent_name # => 'person'
45
+ #
46
+ # @return [String]
47
+ #
48
+ # @api private
49
+ def parent_name
50
+ parent.class.resource
51
+ end
52
+
53
+ # Save parent if it hasn't already been saved
54
+ #
55
+ # @return return of parent.save if previously unsaved
56
+ # @return nil otherwise
57
+ #
58
+ # @api private
59
+ def save_parent
60
+ parent.save unless parent_saved?
61
+ end
62
+
63
+ # Check if parent is saved
64
+ #
65
+ # @return [Boolean]
66
+ #
67
+ # @api private
68
+ def parent_saved?
69
+ parent.id
70
+ end
71
+
72
+ # @!attribute [r] instance
73
+ # member instance methods are delegated to
74
+ #
75
+ # @return [BlockScore::Base]
76
+ #
77
+ # @api private
78
+ attr_reader :instance
79
+
80
+ # @!attribute [r] parent
81
+ # collection parent the collectino conditionally updates
82
+ #
83
+ # @return [BlockScore::Base]
84
+ #
85
+ # @api private
86
+ attr_reader :parent
87
+
88
+ private
89
+
90
+ # ids that belong to associated parent resource
91
+ #
92
+ # @return [Array<String>]
93
+ #
94
+ # @api private
95
+ def ids
96
+ parent.attributes.fetch(:"#{Util.to_plural(instance.class.resource)}", [])
97
+ end
98
+ end
99
+ end
100
+ end
@@ -32,7 +32,7 @@ module BlockScore
32
32
  begin
33
33
  response = execute_request(method, path, params)
34
34
  rescue SocketError, Errno::ECONNREFUSED => e
35
- fail APIConnectionError, e.message
35
+ raise APIConnectionError, e.message
36
36
  end
37
37
 
38
38
  Response.handle_response(resource, response)
@@ -55,7 +55,7 @@ module BlockScore
55
55
 
56
56
  def encode_path_params(path, params)
57
57
  encoded = URI.encode_www_form(params)
58
- [path, encoded].join("?")
58
+ [path, encoded].join('?')
59
59
  end
60
60
  end
61
61
  end
@@ -15,7 +15,7 @@ module BlockScore
15
15
  # APIError - Indicates an error on the server side (HTTP 5xx)
16
16
  # AuthenticationError - Indicates an authentication error (HTTP 401)
17
17
  def initialize(response)
18
- body = JSON.parse(response.body, :symbolize_names => true)
18
+ body = JSON.parse(response.body, symbolize_names: true)
19
19
 
20
20
  @message = body[:error][:message]
21
21
  @http_status = response.code
@@ -24,8 +24,8 @@ module BlockScore
24
24
  end
25
25
 
26
26
  def to_s
27
- status_string = @http_status ? "(Status: #{@http_status})" : ""
28
- type_string = @error_type ? "(Type: #{@error_type})" : ""
27
+ status_string = @http_status ? "(Status: #{@http_status})" : ''
28
+ type_string = @error_type ? "(Type: #{@error_type})" : ''
29
29
 
30
30
  "#{type_string} #{@message} #{status_string}"
31
31
  end
@@ -19,9 +19,9 @@ module BlockScore
19
19
  end
20
20
 
21
21
  def to_s
22
- status_string = @http_status ? "(Status: #{@http_status})" : ""
23
- type_string = @error_type ? "(Type: #{@error_type})" : ""
24
- param_string = @param ? "(#{@param})" : ""
22
+ status_string = @http_status ? "(Status: #{@http_status})" : ''
23
+ type_string = @error_type ? "(Type: #{@error_type})" : ''
24
+ param_string = @param ? "(#{@param})" : ''
25
25
 
26
26
  "#{type_string} #{@message} #{param_string} #{status_string}"
27
27
  end
@@ -11,7 +11,7 @@ module BlockScore
11
11
 
12
12
  def initialize(options = {})
13
13
  super
14
- @question_sets = Collection.new(QuestionSet.new(person: self))
14
+ @question_sets = Collection.new(self, QuestionSet)
15
15
  end
16
16
 
17
17
  def valid?
@@ -6,14 +6,7 @@ module BlockScore
6
6
  include BlockScore::Actions::Retrieve
7
7
  include BlockScore::Actions::All
8
8
 
9
- def_delegators 'self.class', :retrieve, :all, :post, :endpoint
10
-
11
- def create
12
- result = self.class.create(person_id: person.id)
13
- person.question_sets << result.id
14
-
15
- result
16
- end
9
+ def_delegators 'self.class', :post, :endpoint
17
10
 
18
11
  def score(answers = nil)
19
12
  if answers.nil? && attributes
@@ -11,13 +11,13 @@ module BlockScore
11
11
  }
12
12
 
13
13
  def parse_json!(json_obj)
14
- JSON.parse(json_obj, :symbolize_names => true)
14
+ JSON.parse(json_obj, symbolize_names: true)
15
15
  end
16
16
 
17
17
  def parse_json(json_obj)
18
18
  parse_json! json_obj
19
19
  rescue JSON::ParserError
20
- fail Error, "An error has occurred. If this problem persists, please message support@blockscore.com."
20
+ raise Error, 'An error has occurred. If this problem persists, please message support@blockscore.com.'
21
21
  end
22
22
 
23
23
  def create_object(resource, options = {})
@@ -65,16 +65,16 @@ module BlockScore
65
65
  end
66
66
 
67
67
  def to_camelcase(str)
68
- str.split('_').map { |i| i.capitalize }.join('')
68
+ str.split('_').map(&:capitalize).join('')
69
69
  end
70
70
 
71
71
  # Taken from Rulers: http://git.io/vkWqf
72
72
  def to_underscore(str)
73
- str.gsub(/::/, '/').
74
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
75
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
76
- tr("-", "_").
77
- downcase
73
+ str.gsub(/::/, '/')
74
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
75
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
76
+ .tr('-', '_')
77
+ .downcase
78
78
  end
79
79
  end
80
80
  end
@@ -1,3 +1,3 @@
1
1
  module BlockScore
2
- VERSION = '4.1.2'.freeze
3
- end
2
+ VERSION = '4.2.0'.freeze
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blockscore
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.2
4
+ version: 4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alain Meier
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2015-08-28 00:00:00.000000000 Z
13
+ date: 2015-09-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -96,6 +96,20 @@ dependencies:
96
96
  - - "~>"
97
97
  - !ruby/object:Gem::Version
98
98
  version: '3'
99
+ - !ruby/object:Gem::Dependency
100
+ name: rspec-its
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '1'
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '1'
99
113
  - !ruby/object:Gem::Dependency
100
114
  name: webmock
101
115
  requirement: !ruby/object:Gem::Requirement
@@ -157,6 +171,7 @@ files:
157
171
  - Rakefile
158
172
  - blockscore.gemspec
159
173
  - circle.yml
174
+ - circleci.sh
160
175
  - lib/blockscore.rb
161
176
  - lib/blockscore/actions/all.rb
162
177
  - lib/blockscore/actions/create.rb
@@ -166,6 +181,7 @@ files:
166
181
  - lib/blockscore/base.rb
167
182
  - lib/blockscore/candidate.rb
168
183
  - lib/blockscore/collection.rb
184
+ - lib/blockscore/collection/member.rb
169
185
  - lib/blockscore/company.rb
170
186
  - lib/blockscore/connection.rb
171
187
  - lib/blockscore/dispatch.rb