munson 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 123416f906ed71b0bdc64d573de72e080c3e96ca
4
- data.tar.gz: 2b29a00a7dc9417caa47588af57f05fe448d99a7
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YjIwMDg5ODY5ZjM1N2JkN2UzOTE4ZGFkOWVkNTJmNzBkNDA2M2RmZg==
5
+ data.tar.gz: !binary |-
6
+ YjA2YzRlNjYxZjJmOWZiNTJjZjdiMzFiNGE2NmM5NjYzYjIxOWJjYw==
5
7
  SHA512:
6
- metadata.gz: 53729cc19c386163266f1ee7a13bf4a508f76c757d465410739076525b9cc0b9030710b057e0d198bcb358a74a7e939803fa6e1541acaf6df10a58fb46f2a0d8
7
- data.tar.gz: 3cf86622c38ee8673daf552033f0aac2cff89a1e40ddd3f6c122bcae58e60f7c947592c6348848e24d3634fcda3f0a848978cc45b3d2d9e334e71eda6dc07226
8
+ metadata.gz: !binary |-
9
+ Yzc3YWJiNjA4OTVhM2M4YmEwYWY2OTJjN2Y5ZmQ5NWI0ZDgzMzUyMjk1M2Zk
10
+ ZTI5N2U0MTZlNTdhMTIxYWRjNDk3ZDNhOWVmZDdmYWE4YThmYzU1MjQ0MmIw
11
+ NTJjOTVlYzE2MDJmYjRlYzQ0OTgxYzhiMDQ3NGI2NzMyNmZjZGY=
12
+ data.tar.gz: !binary |-
13
+ NzU3MDljYTIyNDVjMGI4NDA4NWZkYTFkNThkOWQ2MTI0MDg3MTUxMDQxYjMz
14
+ OGI0ZmQ0MWI2ZTk1N2RjZTZkZGQzMTFkZjcyOGM3NzVhMTczYzEzZDU5ZmM3
15
+ NjBhNmEzNjkwMjE0ZDk3ZmQ1NmQ2ZGYyMWUyODMwNzU5NDYxNzk=
data/.gitignore CHANGED
@@ -7,3 +7,5 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+
11
+ .ruby-version
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Cory O'Daniel
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md CHANGED
@@ -306,10 +306,10 @@ Additinally any Faraday Connection options can be passed. [Faraday::Connection o
306
306
  ### Custom Query Builder
307
307
 
308
308
  Since the filter param's format isn't specified in the [spec](http://jsonapi.org/format/#fetching-filtering)
309
- this implementation uses (JSONAPI::Resource's implementation](https://github.com/cerebris/jsonapi-resources#filters)
309
+ this implementation uses [JSONAPI::Resource's implementation](https://github.com/cerebris/jsonapi-resources#filters)
310
310
 
311
- To override, implement your own custom query builder inheriting from {Munson::Query}
312
- {Munson::Client} takes a Query class to use. This method could be overwritten in your Resource
311
+ To override, implement your own custom query builder inheriting from ```Munson::Query```.
312
+ ```Munson::Client``` takes a Query class to use. This method could be overwritten in your Resource:
313
313
 
314
314
  ```ruby
315
315
  class MyBuilder < Munson::Query
@@ -319,6 +319,7 @@ class MyBuilder < Munson::Query
319
319
  end
320
320
 
321
321
  Article.munson.query_builder = MyBuilder
322
+ Article.munson.filter(:name => "Chauncy") #=> MyBuilder instance
322
323
  ```
323
324
 
324
325
  ### Without inheriting from Munson::Resource
@@ -400,15 +401,12 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/stacks
400
401
 
401
402
  ## TODOS
402
403
  * [ ] Update Yard docs :D
404
+ * [ ] Posting/Putting relationships
403
405
  * [ ] A few pending tests :/
404
406
  * [ ] Collection#next (queries for next page, if pagination present)
405
407
  * [ ] Related Documents/Resources taking advantage of underlying resource[links]
406
- * [ ] Resource should provide relationship information to the underlying document ?
407
408
  * [ ] Error object to wrap an individual error
408
409
  * [ ] consider enumerable protocol on a query
409
410
  * [ ] Handle null/empty responses...
410
- * [ ] munson/rails - magic up all the things
411
- * [ ] auto set type based on pluralization (self.type = :foos)
412
- * [ ] http://api.rubyonrails.org/classes/ActiveModel/Dirty.html ?
413
- * [ ] Pluggable pagination (could it be a subclassed QueryBuilder? vs. a set of methods mixed into a query instance)
411
+ * [ ] Pluggable pagination?
414
412
  * [ ] Query#find([...]) find multiple records
@@ -0,0 +1,55 @@
1
+ require 'core_ext/object/duplicable'
2
+
3
+ # Taken from ActiveSupport
4
+
5
+ class Object
6
+ # Returns a deep copy of object if it's duplicable. If it's
7
+ # not duplicable, returns +self+.
8
+ #
9
+ # object = Object.new
10
+ # dup = object.deep_dup
11
+ # dup.instance_variable_set(:@a, 1)
12
+ #
13
+ # object.instance_variable_defined?(:@a) # => false
14
+ # dup.instance_variable_defined?(:@a) # => true
15
+ def deep_dup
16
+ duplicable? ? dup : self
17
+ end
18
+ end
19
+
20
+ class Array
21
+ # Returns a deep copy of array.
22
+ #
23
+ # array = [1, [2, 3]]
24
+ # dup = array.deep_dup
25
+ # dup[1][2] = 4
26
+ #
27
+ # array[1][2] # => nil
28
+ # dup[1][2] # => 4
29
+ def deep_dup
30
+ map(&:deep_dup)
31
+ end
32
+ end
33
+
34
+ class Hash
35
+ # Returns a deep copy of hash.
36
+ #
37
+ # hash = { a: { b: 'b' } }
38
+ # dup = hash.deep_dup
39
+ # dup[:a][:c] = 'c'
40
+ #
41
+ # hash[:a][:c] # => nil
42
+ # dup[:a][:c] # => "c"
43
+ def deep_dup
44
+ hash = dup
45
+ each_pair do |key, value|
46
+ if key.frozen? && ::String === key
47
+ hash[key] = value.deep_dup
48
+ else
49
+ hash.delete(key)
50
+ hash[key.deep_dup] = value.deep_dup
51
+ end
52
+ end
53
+ hash
54
+ end
55
+ end
@@ -0,0 +1,100 @@
1
+ # Taken from ActiveSupport
2
+
3
+ #--
4
+ # Most objects are cloneable, but not all. For example you can't dup +nil+:
5
+ #
6
+ # nil.dup # => TypeError: can't dup NilClass
7
+ #
8
+ # Classes may signal their instances are not duplicable removing +dup+/+clone+
9
+ # or raising exceptions from them. So, to dup an arbitrary object you normally
10
+ # use an optimistic approach and are ready to catch an exception, say:
11
+ #
12
+ # arbitrary_object.dup rescue object
13
+ #
14
+ # Rails dups objects in a few critical spots where they are not that arbitrary.
15
+ # That rescue is very expensive (like 40 times slower than a predicate), and it
16
+ # is often triggered.
17
+ #
18
+ # That's why we hardcode the following cases and check duplicable? instead of
19
+ # using that rescue idiom.
20
+ #++
21
+ class Object
22
+ # Can you safely dup this object?
23
+ #
24
+ # False for +nil+, +false+, +true+, symbol, number, method objects;
25
+ # true otherwise.
26
+ def duplicable?
27
+ true
28
+ end
29
+ end
30
+
31
+ class NilClass
32
+ # +nil+ is not duplicable:
33
+ #
34
+ # nil.duplicable? # => false
35
+ # nil.dup # => TypeError: can't dup NilClass
36
+ def duplicable?
37
+ false
38
+ end
39
+ end
40
+
41
+ class FalseClass
42
+ # +false+ is not duplicable:
43
+ #
44
+ # false.duplicable? # => false
45
+ # false.dup # => TypeError: can't dup FalseClass
46
+ def duplicable?
47
+ false
48
+ end
49
+ end
50
+
51
+ class TrueClass
52
+ # +true+ is not duplicable:
53
+ #
54
+ # true.duplicable? # => false
55
+ # true.dup # => TypeError: can't dup TrueClass
56
+ def duplicable?
57
+ false
58
+ end
59
+ end
60
+
61
+ class Symbol
62
+ # Symbols are not duplicable:
63
+ #
64
+ # :my_symbol.duplicable? # => false
65
+ # :my_symbol.dup # => TypeError: can't dup Symbol
66
+ def duplicable?
67
+ false
68
+ end
69
+ end
70
+
71
+ class Numeric
72
+ # Numbers are not duplicable:
73
+ #
74
+ # 3.duplicable? # => false
75
+ # 3.dup # => TypeError: can't dup Integer
76
+ def duplicable?
77
+ false
78
+ end
79
+ end
80
+
81
+ require "bigdecimal"
82
+ class BigDecimal
83
+ # BigDecimals are duplicable:
84
+ #
85
+ # BigDecimal.new("1.2").duplicable? # => true
86
+ # BigDecimal.new("1.2").dup # => #<BigDecimal:...,'0.12E1',18(18)>
87
+ def duplicable?
88
+ true
89
+ end
90
+ end
91
+
92
+ class Method
93
+ # Methods are not duplicable:
94
+ #
95
+ # method(:puts).duplicable? # => false
96
+ # method(:puts).dup # => TypeError: allocator undefined for Method
97
+ def duplicable?
98
+ false
99
+ end
100
+ end
@@ -24,7 +24,7 @@ module Munson
24
24
  end
25
25
 
26
26
  def path
27
- @path || "/#{type}"
27
+ @path || type.to_s
28
28
  end
29
29
 
30
30
  def configure(&block)
@@ -1,3 +1,5 @@
1
+ require 'core_ext/object/deep_dup'
2
+
1
3
  module Munson
2
4
  class Document
3
5
  attr_accessor :id
@@ -9,8 +11,8 @@ module Munson
9
11
  @jsonapi_document = jsonapi_document
10
12
 
11
13
  if jsonapi_document[:data] && jsonapi_document[:data][:attributes]
12
- @original_attributes = jsonapi_document[:data][:attributes].clone
13
- @attributes = jsonapi_document[:data][:attributes].clone
14
+ @original_attributes = jsonapi_document[:data][:attributes]
15
+ @attributes = jsonapi_document[:data][:attributes].deep_dup
14
16
  else
15
17
  @original_attributes = {}
16
18
  @attributes = {}
@@ -73,7 +73,13 @@ class Munson::Resource
73
73
  end
74
74
 
75
75
  def ==(other)
76
- self.class.type == other.class.type && self.id == other.id
76
+ return false if !other
77
+
78
+ if other.class.respond_to?(:type)
79
+ self.class.type == other.class.type && self.id == other.id
80
+ else
81
+ false
82
+ end
77
83
  end
78
84
 
79
85
  class << self
@@ -1,3 +1,3 @@
1
1
  module Munson
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
@@ -24,7 +24,6 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
25
  spec.add_development_dependency "rspec"
26
26
  spec.add_development_dependency 'rspec-mocks'
27
- spec.add_development_dependency "guard-rspec"
28
27
  spec.add_development_dependency "pry"
29
28
  spec.add_development_dependency "pry-byebug"
30
29
  spec.add_development_dependency 'yard'
metadata CHANGED
@@ -1,167 +1,153 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: munson
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cory O'Daniel
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-07-29 00:00:00.000000000 Z
11
+ date: 2016-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - ! '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - ! '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: faraday_middleware
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - ! '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.10'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.10'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: '10.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: '10.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - ! '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - ! '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rspec-mocks
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - ! '>='
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: guard-rspec
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
94
+ - - ! '>='
109
95
  - !ruby/object:Gem::Version
110
96
  version: '0'
111
97
  - !ruby/object:Gem::Dependency
112
98
  name: pry
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
- - - ">="
101
+ - - ! '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
- - - ">="
108
+ - - ! '>='
123
109
  - !ruby/object:Gem::Version
124
110
  version: '0'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: pry-byebug
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
- - - ">="
115
+ - - ! '>='
130
116
  - !ruby/object:Gem::Version
131
117
  version: '0'
132
118
  type: :development
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
- - - ">="
122
+ - - ! '>='
137
123
  - !ruby/object:Gem::Version
138
124
  version: '0'
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: yard
141
127
  requirement: !ruby/object:Gem::Requirement
142
128
  requirements:
143
- - - ">="
129
+ - - ! '>='
144
130
  - !ruby/object:Gem::Version
145
131
  version: '0'
146
132
  type: :development
147
133
  prerelease: false
148
134
  version_requirements: !ruby/object:Gem::Requirement
149
135
  requirements:
150
- - - ">="
136
+ - - ! '>='
151
137
  - !ruby/object:Gem::Version
152
138
  version: '0'
153
139
  - !ruby/object:Gem::Dependency
154
140
  name: webmock
155
141
  requirement: !ruby/object:Gem::Requirement
156
142
  requirements:
157
- - - ">="
143
+ - - ! '>='
158
144
  - !ruby/object:Gem::Version
159
145
  version: '0'
160
146
  type: :development
161
147
  prerelease: false
162
148
  version_requirements: !ruby/object:Gem::Requirement
163
149
  requirements:
164
- - - ">="
150
+ - - ! '>='
165
151
  - !ruby/object:Gem::Version
166
152
  version: '0'
167
153
  description:
@@ -171,15 +157,18 @@ executables: []
171
157
  extensions: []
172
158
  extra_rdoc_files: []
173
159
  files:
174
- - ".gitignore"
175
- - ".rspec"
176
- - ".travis.yml"
160
+ - .gitignore
161
+ - .rspec
162
+ - .travis.yml
177
163
  - Gemfile
178
164
  - Guardfile
165
+ - LICENSE.txt
179
166
  - README.md
180
167
  - Rakefile
181
168
  - bin/console
182
169
  - bin/setup
170
+ - lib/core_ext/object/deep_dup.rb
171
+ - lib/core_ext/object/duplicable.rb
183
172
  - lib/munson.rb
184
173
  - lib/munson/agent.rb
185
174
  - lib/munson/attribute.rb
@@ -204,19 +193,18 @@ require_paths:
204
193
  - lib
205
194
  required_ruby_version: !ruby/object:Gem::Requirement
206
195
  requirements:
207
- - - ">="
196
+ - - ! '>='
208
197
  - !ruby/object:Gem::Version
209
198
  version: '0'
210
199
  required_rubygems_version: !ruby/object:Gem::Requirement
211
200
  requirements:
212
- - - ">="
201
+ - - ! '>='
213
202
  - !ruby/object:Gem::Version
214
203
  version: '0'
215
204
  requirements: []
216
205
  rubyforge_project:
217
- rubygems_version: 2.4.8
206
+ rubygems_version: 2.6.6
218
207
  signing_key:
219
208
  specification_version: 4
220
209
  summary: A JSON API Spec client for Ruby
221
210
  test_files: []
222
- has_rdoc: