jsonapi_compliable 0.6.4 → 0.6.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +11 -3
  4. data/.yardopts +1 -0
  5. data/README.md +10 -1
  6. data/Rakefile +1 -0
  7. data/docs/JsonapiCompliable.html +202 -0
  8. data/docs/JsonapiCompliable/Adapters.html +119 -0
  9. data/docs/JsonapiCompliable/Adapters/Abstract.html +2285 -0
  10. data/docs/JsonapiCompliable/Adapters/ActiveRecord.html +2151 -0
  11. data/docs/JsonapiCompliable/Adapters/ActiveRecordSideloading.html +582 -0
  12. data/docs/JsonapiCompliable/Adapters/Null.html +1682 -0
  13. data/docs/JsonapiCompliable/Base.html +1395 -0
  14. data/docs/JsonapiCompliable/Deserializer.html +835 -0
  15. data/docs/JsonapiCompliable/Errors.html +115 -0
  16. data/docs/JsonapiCompliable/Errors/BadFilter.html +124 -0
  17. data/docs/JsonapiCompliable/Errors/StatNotFound.html +266 -0
  18. data/docs/JsonapiCompliable/Errors/UnsupportedPageSize.html +264 -0
  19. data/docs/JsonapiCompliable/Errors/ValidationError.html +124 -0
  20. data/docs/JsonapiCompliable/Extensions.html +117 -0
  21. data/docs/JsonapiCompliable/Extensions/BooleanAttribute.html +212 -0
  22. data/docs/JsonapiCompliable/Extensions/BooleanAttribute/ClassMethods.html +229 -0
  23. data/docs/JsonapiCompliable/Extensions/ExtraAttribute.html +242 -0
  24. data/docs/JsonapiCompliable/Extensions/ExtraAttribute/ClassMethods.html +237 -0
  25. data/docs/JsonapiCompliable/Query.html +1099 -0
  26. data/docs/JsonapiCompliable/Rails.html +211 -0
  27. data/docs/JsonapiCompliable/Resource.html +5241 -0
  28. data/docs/JsonapiCompliable/Scope.html +703 -0
  29. data/docs/JsonapiCompliable/Scoping.html +117 -0
  30. data/docs/JsonapiCompliable/Scoping/Base.html +843 -0
  31. data/docs/JsonapiCompliable/Scoping/DefaultFilter.html +318 -0
  32. data/docs/JsonapiCompliable/Scoping/ExtraFields.html +301 -0
  33. data/docs/JsonapiCompliable/Scoping/Filter.html +313 -0
  34. data/docs/JsonapiCompliable/Scoping/Filterable.html +364 -0
  35. data/docs/JsonapiCompliable/Scoping/Paginate.html +613 -0
  36. data/docs/JsonapiCompliable/Scoping/Sort.html +454 -0
  37. data/docs/JsonapiCompliable/SerializableTempId.html +216 -0
  38. data/docs/JsonapiCompliable/Sideload.html +2484 -0
  39. data/docs/JsonapiCompliable/Stats.html +117 -0
  40. data/docs/JsonapiCompliable/Stats/DSL.html +999 -0
  41. data/docs/JsonapiCompliable/Stats/Payload.html +391 -0
  42. data/docs/JsonapiCompliable/Util.html +117 -0
  43. data/docs/JsonapiCompliable/Util/FieldParams.html +228 -0
  44. data/docs/JsonapiCompliable/Util/Hash.html +471 -0
  45. data/docs/JsonapiCompliable/Util/IncludeParams.html +299 -0
  46. data/docs/JsonapiCompliable/Util/Persistence.html +435 -0
  47. data/docs/JsonapiCompliable/Util/RelationshipPayload.html +563 -0
  48. data/docs/JsonapiCompliable/Util/RenderOptions.html +250 -0
  49. data/docs/JsonapiCompliable/Util/ValidationResponse.html +532 -0
  50. data/docs/_index.html +527 -0
  51. data/docs/class_list.html +51 -0
  52. data/docs/css/common.css +1 -0
  53. data/docs/css/full_list.css +58 -0
  54. data/docs/css/style.css +492 -0
  55. data/docs/file.README.html +99 -0
  56. data/docs/file_list.html +56 -0
  57. data/docs/frames.html +17 -0
  58. data/docs/index.html +99 -0
  59. data/docs/js/app.js +248 -0
  60. data/docs/js/full_list.js +216 -0
  61. data/docs/js/jquery.js +4 -0
  62. data/docs/method_list.html +1731 -0
  63. data/docs/top-level-namespace.html +110 -0
  64. data/gemfiles/rails_5.gemfile +1 -1
  65. data/lib/jsonapi_compliable/adapters/abstract.rb +267 -4
  66. data/lib/jsonapi_compliable/adapters/active_record.rb +23 -1
  67. data/lib/jsonapi_compliable/adapters/null.rb +43 -3
  68. data/lib/jsonapi_compliable/base.rb +182 -33
  69. data/lib/jsonapi_compliable/deserializer.rb +90 -21
  70. data/lib/jsonapi_compliable/extensions/boolean_attribute.rb +12 -0
  71. data/lib/jsonapi_compliable/extensions/extra_attribute.rb +32 -0
  72. data/lib/jsonapi_compliable/extensions/temp_id.rb +11 -0
  73. data/lib/jsonapi_compliable/query.rb +94 -2
  74. data/lib/jsonapi_compliable/rails.rb +8 -0
  75. data/lib/jsonapi_compliable/resource.rb +548 -11
  76. data/lib/jsonapi_compliable/scope.rb +43 -1
  77. data/lib/jsonapi_compliable/scoping/base.rb +59 -8
  78. data/lib/jsonapi_compliable/scoping/default_filter.rb +33 -0
  79. data/lib/jsonapi_compliable/scoping/extra_fields.rb +33 -0
  80. data/lib/jsonapi_compliable/scoping/filter.rb +29 -2
  81. data/lib/jsonapi_compliable/scoping/filterable.rb +4 -0
  82. data/lib/jsonapi_compliable/scoping/paginate.rb +33 -0
  83. data/lib/jsonapi_compliable/scoping/sort.rb +18 -0
  84. data/lib/jsonapi_compliable/sideload.rb +229 -1
  85. data/lib/jsonapi_compliable/stats/dsl.rb +44 -0
  86. data/lib/jsonapi_compliable/stats/payload.rb +20 -0
  87. data/lib/jsonapi_compliable/util/field_params.rb +1 -0
  88. data/lib/jsonapi_compliable/util/hash.rb +18 -0
  89. data/lib/jsonapi_compliable/util/include_params.rb +22 -0
  90. data/lib/jsonapi_compliable/util/persistence.rb +13 -3
  91. data/lib/jsonapi_compliable/util/relationship_payload.rb +2 -0
  92. data/lib/jsonapi_compliable/util/render_options.rb +2 -0
  93. data/lib/jsonapi_compliable/util/validation_response.rb +16 -0
  94. data/lib/jsonapi_compliable/version.rb +1 -1
  95. metadata +60 -5
  96. data/gemfiles/rails_4.gemfile.lock +0 -208
  97. data/gemfiles/rails_5.gemfile.lock +0 -212
  98. data/lib/jsonapi_compliable/write.rb +0 -93
@@ -1,8 +1,34 @@
1
1
  module JsonapiCompliable
2
2
  module Stats
3
+ # Provides an easier interface to stats scoping.
4
+ #
5
+ # Used within Resource DSL:
6
+ #
7
+ # allow_stat total: [:count] do
8
+ # # ... eval'd in Stats::DSL context! ...
9
+ # end
10
+ #
11
+ # This allows us to define arbitrary stats:
12
+ #
13
+ # allow_stat total: [:count] do
14
+ # standard_deviation { |scope, attr| ... }
15
+ # end
16
+ #
17
+ # And use convenience methods:
18
+ #
19
+ # allow_stat :rating do
20
+ # count!
21
+ # average!
22
+ # end
23
+ #
24
+ # @see Resource.allow_stat
25
+ # @attr_reader [Symbol] name the stat, e.g. :total
26
+ # @attr_reader [Hash] calculations procs for various metrics
3
27
  class DSL
4
28
  attr_reader :name, :calculations
5
29
 
30
+ # @param [Adapters::Abstract] adapter the Resource adapter
31
+ # @param [Symbol, Hash] config example: +:total+ or +{ total: [:count] }+
6
32
  def initialize(adapter, config)
7
33
  config = { config => [] } if config.is_a?(Symbol)
8
34
 
@@ -12,31 +38,49 @@ module JsonapiCompliable
12
38
  Array(config.values.first).each { |c| send(:"#{c}!") }
13
39
  end
14
40
 
41
+ # Used for defining arbitrary stats within the DSL:
42
+ #
43
+ # allow_stat :total do
44
+ # standard_deviation { |scope, attr| ... }
45
+ # end
46
+ #
47
+ # ...will hit +method_missing+ and store the proc for future reference.
48
+ # @api private
15
49
  def method_missing(meth, *args, &blk)
16
50
  @calculations[meth] = blk
17
51
  end
18
52
 
53
+ # Grab a calculation proc. Raises error if no corresponding stat
54
+ # has been configured.
55
+ #
56
+ # @param [String, Symbol] name the name of the calculation, e.g. +:total+
57
+ # @return [Proc] the proc to run the calculation
19
58
  def calculation(name)
20
59
  callable = @calculations[name] || @calculations[name.to_sym]
21
60
  callable || raise(Errors::StatNotFound.new(@name, name))
22
61
  end
23
62
 
63
+ # Convenience method for default :count proc
24
64
  def count!
25
65
  @calculations[:count] = @adapter.method(:count)
26
66
  end
27
67
 
68
+ # Convenience method for default :sum proc
28
69
  def sum!
29
70
  @calculations[:sum] = @adapter.method(:sum)
30
71
  end
31
72
 
73
+ # Convenience method for default :average proc
32
74
  def average!
33
75
  @calculations[:average] = @adapter.method(:average)
34
76
  end
35
77
 
78
+ # Convenience method for default :maximum proc
36
79
  def maximum!
37
80
  @calculations[:maximum] = @adapter.method(:maximum)
38
81
  end
39
82
 
83
+ # Convenience method for default :minimum proc
40
84
  def minimum!
41
85
  @calculations[:minimum] = @adapter.method(:minimum)
42
86
  end
@@ -1,12 +1,32 @@
1
1
  module JsonapiCompliable
2
2
  module Stats
3
+ # Generate the stats payload so we can return it in the response.
4
+ #
5
+ # {
6
+ # data: [...],
7
+ # meta: { stats: the_generated_payload }
8
+ # }
9
+ #
10
+ # For example:
11
+ #
12
+ # {
13
+ # data: [...],
14
+ # meta: { stats: { total: { count: 100 } } }
15
+ # }
3
16
  class Payload
17
+ # @param [Resource] resource the resource instance
18
+ # @param [Hash] query_hash the Query#to_hash for the current resource
19
+ # @param scope the scope we are chaining/modifying
4
20
  def initialize(resource, query_hash, scope)
5
21
  @resource = resource
6
22
  @query_hash = query_hash[:stats]
7
23
  @scope = scope
8
24
  end
9
25
 
26
+ # Generate the payload for +{ meta: { stats: { ... } } }+
27
+ # Loops over all calculations, computes then, and gives back
28
+ # a hash of stats and their results.
29
+ # @return [Hash] the generated payload
10
30
  def generate
11
31
  {}.tap do |stats|
12
32
  @query_hash.each_pair do |name, calculation|
@@ -1,5 +1,6 @@
1
1
  module JsonapiCompliable
2
2
  module Util
3
+ # @api private
3
4
  class FieldParams
4
5
  def self.parse(params)
5
6
  return {} if params.nil?
@@ -1,6 +1,19 @@
1
1
  module JsonapiCompliable
2
2
  module Util
3
+ # @api private
3
4
  class Hash
5
+ # Grab all keys at any level of the hash.
6
+ #
7
+ # { foo: { bar: { baz: {} } } }
8
+ #
9
+ # Becomes
10
+ #
11
+ # [:foo, :bar, :bar]
12
+ #
13
+ # @param hash the hash we want to process
14
+ # @param [Array<Symbol, String>] collection the memoized collection of keys
15
+ # @return [Array<Symbol, String>] the keys
16
+ # @api private
4
17
  def self.keys(hash, collection = [])
5
18
  hash.each_pair do |key, value|
6
19
  collection << key
@@ -10,11 +23,16 @@ module JsonapiCompliable
10
23
  collection
11
24
  end
12
25
 
26
+ # Like ActiveSupport's #deep_merge
27
+ # @return [Hash] the merged hash
28
+ # @api private
13
29
  def self.deep_merge!(hash, other)
14
30
  merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
15
31
  hash.merge!(other, &merger)
16
32
  end
17
33
 
34
+ # Like ActiveSupport's #deep_dup
35
+ # @api private
18
36
  def self.deep_dup(hash)
19
37
  if hash.respond_to?(:deep_dup)
20
38
  hash.deep_dup
@@ -1,7 +1,29 @@
1
1
  module JsonapiCompliable
2
2
  module Util
3
+ # Utility class for dealing with Include Directives
3
4
  class IncludeParams
4
5
  class << self
6
+ # Let's say the user requested these sideloads:
7
+ #
8
+ # GET /posts?include=comments.author
9
+ #
10
+ # But our resource had this code:
11
+ #
12
+ # sideload_whitelist({ index: [:comments] })
13
+ #
14
+ # We should drop the 'author' sideload from the request.
15
+ #
16
+ # Hashes become 'include directive hashes' within the library. ie
17
+ #
18
+ # [:tags, { comments: :author }]
19
+ #
20
+ # Becomes
21
+ #
22
+ # { tags: {}, comments: { author: {} } }
23
+ #
24
+ # @param [Hash] requested_includes the nested hash the user requested
25
+ # @param [Hash] allowed_includes the nested hash configured via DSL
26
+ # @return [Hash] the scrubbed hash
5
27
  def scrub(requested_includes, allowed_includes)
6
28
  {}.tap do |valid|
7
29
  requested_includes.each_pair do |key, sub_hash|
@@ -1,4 +1,10 @@
1
+ # Save the given Resource#model, and all of its nested relationships.
2
+ # @api private
1
3
  class JsonapiCompliable::Util::Persistence
4
+ # @param [Resource] resource the resource instance
5
+ # @param [Hash] meta see (Deserializer#meta)
6
+ # @param [Hash] attributes see (Deserializer#attributes)
7
+ # @param [Hash] relationships see (Deserializer#relationships)
2
8
  def initialize(resource, meta, attributes, relationships)
3
9
  @resource = resource
4
10
  @meta = meta
@@ -6,9 +12,11 @@ class JsonapiCompliable::Util::Persistence
6
12
  @relationships = relationships
7
13
  end
8
14
 
15
+ # Perform the actual save logic.
16
+ #
9
17
  # belongs_to must be processed before/separately from has_many -
10
18
  # we need to know the primary key value of the parent before
11
- # persisting the child
19
+ # persisting the child.
12
20
  #
13
21
  # Flow:
14
22
  # * process parents
@@ -19,6 +27,8 @@ class JsonapiCompliable::Util::Persistence
19
27
  # * process children
20
28
  # * associate children
21
29
  # * return current object
30
+ #
31
+ # @return the persisted model instance
22
32
  def run
23
33
  parents = process_belongs_to(@relationships)
24
34
  update_foreign_key_for_parents(parents)
@@ -35,6 +45,8 @@ class JsonapiCompliable::Util::Persistence
35
45
  persisted unless @meta[:method] == :destroy
36
46
  end
37
47
 
48
+ private
49
+
38
50
  # The child's attributes should be modified to nil-out the
39
51
  # foreign_key when the parent is being destroyed or disassociated
40
52
  def update_foreign_key(parent_object, attrs, x)
@@ -99,8 +111,6 @@ class JsonapiCompliable::Util::Persistence
99
111
  object.instance_variable_set(:@_jsonapi_temp_id, temp_id)
100
112
  end
101
113
 
102
- private
103
-
104
114
  def iterate(only: [], except: [])
105
115
  opts = {
106
116
  resource: @resource,
@@ -1,5 +1,7 @@
1
1
  module JsonapiCompliable
2
2
  module Util
3
+ # Helper methods for traversing the 'relationships' JSONAPI payloads
4
+ # @api private
3
5
  class RelationshipPayload
4
6
  attr_reader :resource, :payload
5
7
 
@@ -1,5 +1,7 @@
1
1
  module JsonapiCompliable
2
2
  module Util
3
+ # Generate the options we end up passing to {{http://jsonapi-rb.org jsonapi-rb}}
4
+ # @api private
3
5
  class RenderOptions
4
6
  def self.generate(object, query_hash, overrides = {})
5
7
  resolved = object.respond_to?(:resolve) ? object.resolve : object
@@ -1,15 +1,31 @@
1
+ # We need to know two things in the response of a persistence call:
2
+ #
3
+ # * The model we just tried to persist
4
+ # * Was the persistence successful?
5
+ #
6
+ # This object wraps those bits of data. The call is considered
7
+ # unsuccessful when it adheres to the ActiveModel#errors interface,
8
+ # and #errors is not blank. In other words, it is not successful if
9
+ # there were validation errors.
10
+ #
11
+ # @attr_reader object the object we are saving
1
12
  class JsonapiCompliable::Util::ValidationResponse
2
13
  attr_reader :object
3
14
 
15
+ # @param object the model instance we tried to save
16
+ # @param deserialized_params see Base#deserialized_params
4
17
  def initialize(object, deserialized_params)
5
18
  @object = object
6
19
  @deserialized_params = deserialized_params
7
20
  end
8
21
 
22
+ # Check to ensure no validation errors.
23
+ # @return [Boolean] did the persistence call succeed?
9
24
  def success?
10
25
  all_valid?(object, @deserialized_params.relationships)
11
26
  end
12
27
 
28
+ # @return [Array] the object and success state
13
29
  def to_a
14
30
  [object, success?]
15
31
  end
@@ -1,3 +1,3 @@
1
1
  module JsonapiCompliable
2
- VERSION = "0.6.4"
2
+ VERSION = "0.6.5"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonapi_compliable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 0.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lee Richmond
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-04-26 00:00:00.000000000 Z
12
+ date: 2017-05-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: jsonapi-serializable
@@ -127,6 +127,7 @@ files:
127
127
  - ".rspec"
128
128
  - ".ruby-version"
129
129
  - ".travis.yml"
130
+ - ".yardopts"
130
131
  - Appraisals
131
132
  - CODE_OF_CONDUCT.md
132
133
  - Gemfile
@@ -138,10 +139,65 @@ files:
138
139
  - bin/console
139
140
  - bin/rspec
140
141
  - bin/setup
142
+ - docs/JsonapiCompliable.html
143
+ - docs/JsonapiCompliable/Adapters.html
144
+ - docs/JsonapiCompliable/Adapters/Abstract.html
145
+ - docs/JsonapiCompliable/Adapters/ActiveRecord.html
146
+ - docs/JsonapiCompliable/Adapters/ActiveRecordSideloading.html
147
+ - docs/JsonapiCompliable/Adapters/Null.html
148
+ - docs/JsonapiCompliable/Base.html
149
+ - docs/JsonapiCompliable/Deserializer.html
150
+ - docs/JsonapiCompliable/Errors.html
151
+ - docs/JsonapiCompliable/Errors/BadFilter.html
152
+ - docs/JsonapiCompliable/Errors/StatNotFound.html
153
+ - docs/JsonapiCompliable/Errors/UnsupportedPageSize.html
154
+ - docs/JsonapiCompliable/Errors/ValidationError.html
155
+ - docs/JsonapiCompliable/Extensions.html
156
+ - docs/JsonapiCompliable/Extensions/BooleanAttribute.html
157
+ - docs/JsonapiCompliable/Extensions/BooleanAttribute/ClassMethods.html
158
+ - docs/JsonapiCompliable/Extensions/ExtraAttribute.html
159
+ - docs/JsonapiCompliable/Extensions/ExtraAttribute/ClassMethods.html
160
+ - docs/JsonapiCompliable/Query.html
161
+ - docs/JsonapiCompliable/Rails.html
162
+ - docs/JsonapiCompliable/Resource.html
163
+ - docs/JsonapiCompliable/Scope.html
164
+ - docs/JsonapiCompliable/Scoping.html
165
+ - docs/JsonapiCompliable/Scoping/Base.html
166
+ - docs/JsonapiCompliable/Scoping/DefaultFilter.html
167
+ - docs/JsonapiCompliable/Scoping/ExtraFields.html
168
+ - docs/JsonapiCompliable/Scoping/Filter.html
169
+ - docs/JsonapiCompliable/Scoping/Filterable.html
170
+ - docs/JsonapiCompliable/Scoping/Paginate.html
171
+ - docs/JsonapiCompliable/Scoping/Sort.html
172
+ - docs/JsonapiCompliable/SerializableTempId.html
173
+ - docs/JsonapiCompliable/Sideload.html
174
+ - docs/JsonapiCompliable/Stats.html
175
+ - docs/JsonapiCompliable/Stats/DSL.html
176
+ - docs/JsonapiCompliable/Stats/Payload.html
177
+ - docs/JsonapiCompliable/Util.html
178
+ - docs/JsonapiCompliable/Util/FieldParams.html
179
+ - docs/JsonapiCompliable/Util/Hash.html
180
+ - docs/JsonapiCompliable/Util/IncludeParams.html
181
+ - docs/JsonapiCompliable/Util/Persistence.html
182
+ - docs/JsonapiCompliable/Util/RelationshipPayload.html
183
+ - docs/JsonapiCompliable/Util/RenderOptions.html
184
+ - docs/JsonapiCompliable/Util/ValidationResponse.html
185
+ - docs/_index.html
186
+ - docs/class_list.html
187
+ - docs/css/common.css
188
+ - docs/css/full_list.css
189
+ - docs/css/style.css
190
+ - docs/file.README.html
191
+ - docs/file_list.html
192
+ - docs/frames.html
193
+ - docs/index.html
194
+ - docs/js/app.js
195
+ - docs/js/full_list.js
196
+ - docs/js/jquery.js
197
+ - docs/method_list.html
198
+ - docs/top-level-namespace.html
141
199
  - gemfiles/rails_4.gemfile
142
- - gemfiles/rails_4.gemfile.lock
143
200
  - gemfiles/rails_5.gemfile
144
- - gemfiles/rails_5.gemfile.lock
145
201
  - jsonapi_compliable.gemspec
146
202
  - lib/jsonapi_compliable.rb
147
203
  - lib/jsonapi_compliable/adapters/abstract.rb
@@ -176,7 +232,6 @@ files:
176
232
  - lib/jsonapi_compliable/util/render_options.rb
177
233
  - lib/jsonapi_compliable/util/validation_response.rb
178
234
  - lib/jsonapi_compliable/version.rb
179
- - lib/jsonapi_compliable/write.rb
180
235
  homepage:
181
236
  licenses:
182
237
  - MIT
@@ -1,208 +0,0 @@
1
- PATH
2
- remote: ..
3
- specs:
4
- jsonapi_compliable (0.6.3)
5
- jsonapi-serializable (~> 0.1)
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- actionmailer (4.2.7.1)
11
- actionpack (= 4.2.7.1)
12
- actionview (= 4.2.7.1)
13
- activejob (= 4.2.7.1)
14
- mail (~> 2.5, >= 2.5.4)
15
- rails-dom-testing (~> 1.0, >= 1.0.5)
16
- actionpack (4.2.7.1)
17
- actionview (= 4.2.7.1)
18
- activesupport (= 4.2.7.1)
19
- rack (~> 1.6)
20
- rack-test (~> 0.6.2)
21
- rails-dom-testing (~> 1.0, >= 1.0.5)
22
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
23
- actionview (4.2.7.1)
24
- activesupport (= 4.2.7.1)
25
- builder (~> 3.1)
26
- erubis (~> 2.7.0)
27
- rails-dom-testing (~> 1.0, >= 1.0.5)
28
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
29
- activejob (4.2.7.1)
30
- activesupport (= 4.2.7.1)
31
- globalid (>= 0.3.0)
32
- activemodel (4.2.7.1)
33
- activesupport (= 4.2.7.1)
34
- builder (~> 3.1)
35
- activerecord (4.2.7.1)
36
- activemodel (= 4.2.7.1)
37
- activesupport (= 4.2.7.1)
38
- arel (~> 6.0)
39
- activesupport (4.2.7.1)
40
- i18n (~> 0.7)
41
- json (~> 1.7, >= 1.7.7)
42
- minitest (~> 5.1)
43
- thread_safe (~> 0.3, >= 0.3.4)
44
- tzinfo (~> 1.1)
45
- appraisal (2.1.0)
46
- bundler
47
- rake
48
- thor (>= 0.14.0)
49
- arel (6.0.3)
50
- builder (3.2.2)
51
- byebug (9.0.6)
52
- coderay (1.1.1)
53
- concurrent-ruby (1.0.4)
54
- database_cleaner (1.5.3)
55
- diff-lcs (1.2.5)
56
- erubis (2.7.0)
57
- ffi (1.9.14)
58
- formatador (0.2.5)
59
- globalid (0.3.7)
60
- activesupport (>= 4.1.0)
61
- guard (2.14.0)
62
- formatador (>= 0.2.4)
63
- listen (>= 2.7, < 4.0)
64
- lumberjack (~> 1.0)
65
- nenv (~> 0.1)
66
- notiffany (~> 0.0)
67
- pry (>= 0.9.12)
68
- shellany (~> 0.0)
69
- thor (>= 0.18.1)
70
- guard-compat (1.2.1)
71
- guard-rspec (4.7.3)
72
- guard (~> 2.1)
73
- guard-compat (~> 1.1)
74
- rspec (>= 2.99.0, < 4.0)
75
- i18n (0.7.0)
76
- json (1.8.3)
77
- jsonapi-deserializable (0.1.1)
78
- jsonapi-parser (= 0.1.1)
79
- jsonapi-parser (0.1.1)
80
- jsonapi-rails (0.1.1)
81
- jsonapi-rb (= 0.1.1)
82
- jsonapi-rb (0.1.1)
83
- jsonapi-deserializable (= 0.1.1)
84
- jsonapi-serializable (= 0.1.1)
85
- jsonapi-renderer (0.1.1)
86
- jsonapi-serializable (0.1.1)
87
- jsonapi-renderer (= 0.1.1)
88
- kaminari (0.17.0)
89
- actionpack (>= 3.0.0)
90
- activesupport (>= 3.0.0)
91
- listen (3.1.5)
92
- rb-fsevent (~> 0.9, >= 0.9.4)
93
- rb-inotify (~> 0.9, >= 0.9.7)
94
- ruby_dep (~> 1.2)
95
- loofah (2.0.3)
96
- nokogiri (>= 1.5.9)
97
- lumberjack (1.0.10)
98
- mail (2.6.4)
99
- mime-types (>= 1.16, < 4)
100
- method_source (0.8.2)
101
- mime-types (3.1)
102
- mime-types-data (~> 3.2015)
103
- mime-types-data (3.2016.0521)
104
- mini_portile2 (2.1.0)
105
- minitest (5.10.1)
106
- nenv (0.3.0)
107
- nokogiri (1.6.8.1)
108
- mini_portile2 (~> 2.1.0)
109
- notiffany (0.1.1)
110
- nenv (~> 0.1)
111
- shellany (~> 0.0)
112
- pry (0.10.4)
113
- coderay (~> 1.1.0)
114
- method_source (~> 0.8.1)
115
- slop (~> 3.4)
116
- pry-byebug (3.4.2)
117
- byebug (~> 9.0)
118
- pry (~> 0.10)
119
- rack (1.6.5)
120
- rack-test (0.6.3)
121
- rack (>= 1.0)
122
- rails (4.2.7.1)
123
- actionmailer (= 4.2.7.1)
124
- actionpack (= 4.2.7.1)
125
- actionview (= 4.2.7.1)
126
- activejob (= 4.2.7.1)
127
- activemodel (= 4.2.7.1)
128
- activerecord (= 4.2.7.1)
129
- activesupport (= 4.2.7.1)
130
- bundler (>= 1.3.0, < 2.0)
131
- railties (= 4.2.7.1)
132
- sprockets-rails
133
- rails-deprecated_sanitizer (1.0.3)
134
- activesupport (>= 4.2.0.alpha)
135
- rails-dom-testing (1.0.7)
136
- activesupport (>= 4.2.0.beta, < 5.0)
137
- nokogiri (~> 1.6.0)
138
- rails-deprecated_sanitizer (>= 1.0.1)
139
- rails-html-sanitizer (1.0.3)
140
- loofah (~> 2.0)
141
- railties (4.2.7.1)
142
- actionpack (= 4.2.7.1)
143
- activesupport (= 4.2.7.1)
144
- rake (>= 0.8.7)
145
- thor (>= 0.18.1, < 2.0)
146
- rake (10.5.0)
147
- rb-fsevent (0.9.8)
148
- rb-inotify (0.9.7)
149
- ffi (>= 0.5.0)
150
- rspec (3.5.0)
151
- rspec-core (~> 3.5.0)
152
- rspec-expectations (~> 3.5.0)
153
- rspec-mocks (~> 3.5.0)
154
- rspec-core (3.5.4)
155
- rspec-support (~> 3.5.0)
156
- rspec-expectations (3.5.0)
157
- diff-lcs (>= 1.2.0, < 2.0)
158
- rspec-support (~> 3.5.0)
159
- rspec-mocks (3.5.0)
160
- diff-lcs (>= 1.2.0, < 2.0)
161
- rspec-support (~> 3.5.0)
162
- rspec-rails (3.5.2)
163
- actionpack (>= 3.0)
164
- activesupport (>= 3.0)
165
- railties (>= 3.0)
166
- rspec-core (~> 3.5.0)
167
- rspec-expectations (~> 3.5.0)
168
- rspec-mocks (~> 3.5.0)
169
- rspec-support (~> 3.5.0)
170
- rspec-support (3.5.0)
171
- ruby_dep (1.5.0)
172
- shellany (0.0.1)
173
- slop (3.6.0)
174
- sprockets (3.7.0)
175
- concurrent-ruby (~> 1.0)
176
- rack (> 1, < 3)
177
- sprockets-rails (3.2.0)
178
- actionpack (>= 4.0)
179
- activesupport (>= 4.0)
180
- sprockets (>= 3.0.0)
181
- sqlite3 (1.3.12)
182
- thor (0.19.4)
183
- thread_safe (0.3.5)
184
- tzinfo (1.2.2)
185
- thread_safe (~> 0.1)
186
-
187
- PLATFORMS
188
- ruby
189
-
190
- DEPENDENCIES
191
- activerecord (>= 4.1, < 6)
192
- appraisal
193
- bundler (~> 1.12)
194
- database_cleaner
195
- guard
196
- guard-rspec
197
- jsonapi-rails (~> 0.1)
198
- jsonapi_compliable!
199
- kaminari (~> 0.17)
200
- pry
201
- pry-byebug
202
- rails (~> 4.1)
203
- rake (~> 10.0)
204
- rspec-rails
205
- sqlite3
206
-
207
- BUNDLED WITH
208
- 1.14.6