munson 0.3.0 → 0.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,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: