jsonapi-resources 0.5.5 → 0.5.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dcb37444c599cb514483e80217f64409d7745411
4
- data.tar.gz: eaeff3c3ee4183273ccb9cc59a1933781426c21f
3
+ metadata.gz: e9dfa52ac05f532050b9740a884e624b27f40dcc
4
+ data.tar.gz: 515bc38bde0559a474dcfbc7ec9891a9cc79d1eb
5
5
  SHA512:
6
- metadata.gz: 829b54dedc77b56e63757c0ea593a98b562d573fc2f1ba221baa036f429e365b21c28f99c846c681d681677f7bca9c240ca617d133f39a1ea1c9292ecaf5b1d4
7
- data.tar.gz: dc68f574e96aa495ee6f6da7402869262864d169bdaa476b06948888935701f7601b2cdc9b0092c6a67bd9a89c1df96ae4c55c07a70a3f4223628d36a494588b
6
+ metadata.gz: c47e723f53c1b0d30ef1ab99f19841b5c1bb6ed808a441739d3d065e3e7ef57513881f7644a579766eb652df57d280a98eaa6c44f3d57c53f7158a5a045e50e5
7
+ data.tar.gz: 2644748a35a9e4de7554be0627068a044611600f43195ddf41fd28be1f33cd5df4d047605d74f950efccd9df3b48a968f2e42dd3c6846195fb5916cf126a182a
data/README.md CHANGED
@@ -1282,6 +1282,12 @@ JSONAPI.configure do |config|
1282
1282
  config.allow_sort = true
1283
1283
  config.allow_filter = true
1284
1284
 
1285
+ # How to handle unsupported attributes and relationships which are provided in the request
1286
+ # true => raises an error
1287
+ # false => allows the request to continue. A warning is included in the response meta data indicating
1288
+ # the fields which were ignored. This is useful for client libraries which send extra parameters.
1289
+ config.raise_if_parameters_not_allowed = true
1290
+
1285
1291
  # :none, :offset, :paged, or a custom paginator name
1286
1292
  config.default_paginator = :none
1287
1293
 
@@ -87,6 +87,7 @@ module JSONAPI
87
87
 
88
88
  def setup_request
89
89
  @request = JSONAPI::Request.new(params, context: context, key_formatter: key_formatter)
90
+
90
91
  render_errors(@request.errors) unless @request.errors.empty?
91
92
  rescue => e
92
93
  handle_exceptions(e)
@@ -121,6 +122,14 @@ module JSONAPI
121
122
  {}
122
123
  end
123
124
 
125
+ def base_meta
126
+ if @request.nil? || @request.warnings.empty?
127
+ base_response_meta
128
+ else
129
+ base_response_meta.merge(warnings: @request.warnings)
130
+ end
131
+ end
132
+
124
133
  def base_response_links
125
134
  {}
126
135
  end
@@ -147,7 +156,7 @@ module JSONAPI
147
156
  base_url: base_url,
148
157
  key_formatter: key_formatter,
149
158
  route_formatter: route_formatter,
150
- base_meta: base_response_meta,
159
+ base_meta: base_meta,
151
160
  base_links: base_response_links,
152
161
  resource_serializer_klass: resource_serializer_klass,
153
162
  request: @request
@@ -8,6 +8,7 @@ module JSONAPI
8
8
  :key_formatter,
9
9
  :route_format,
10
10
  :route_formatter,
11
+ :raise_if_parameters_not_allowed,
11
12
  :operations_processor,
12
13
  :allow_include,
13
14
  :allow_sort,
@@ -38,6 +39,8 @@ module JSONAPI
38
39
  self.allow_sort = true
39
40
  self.allow_filter = true
40
41
 
42
+ self.raise_if_parameters_not_allowed = true
43
+
41
44
  # :none, :offset, :paged, or a custom paginator name
42
45
  self.default_paginator = :none
43
46
 
@@ -105,6 +108,8 @@ module JSONAPI
105
108
  attr_writer :always_include_to_one_linkage_data
106
109
 
107
110
  attr_writer :always_include_to_many_linkage_data
111
+
112
+ attr_writer :raise_if_parameters_not_allowed
108
113
  end
109
114
 
110
115
  class << self
data/lib/jsonapi/error.rb CHANGED
@@ -17,4 +17,17 @@ module JSONAPI
17
17
  @status = options[:status]
18
18
  end
19
19
  end
20
+
21
+ class Warning
22
+ attr_accessor :title, :detail, :code
23
+ def initialize(options = {})
24
+ @title = options[:title]
25
+ @detail = options[:detail]
26
+ @code = if JSONAPI.configuration.use_text_errors
27
+ TEXT_ERRORS[options[:code]]
28
+ else
29
+ options[:code]
30
+ end
31
+ end
32
+ end
20
33
  end
@@ -175,7 +175,7 @@ module JSONAPI
175
175
  def options
176
176
  opts = {}
177
177
  opts.merge!(pagination_params: pagination_params) if JSONAPI.configuration.top_level_links_include_pagination
178
- opts.merge!(record_count: pagination_params) if JSONAPI.configuration.top_level_meta_include_record_count
178
+ opts.merge!(record_count: record_count) if JSONAPI.configuration.top_level_meta_include_record_count
179
179
  opts
180
180
  end
181
181
 
@@ -5,13 +5,14 @@ module JSONAPI
5
5
  class Request
6
6
  attr_accessor :fields, :include, :filters, :sort_criteria, :errors, :operations,
7
7
  :resource_klass, :context, :paginator, :source_klass, :source_id,
8
- :include_directives, :params
8
+ :include_directives, :params, :warnings
9
9
 
10
10
  def initialize(params = nil, options = {})
11
11
  @params = params
12
12
  @context = options[:context]
13
13
  @key_formatter = options.fetch(:key_formatter, JSONAPI.configuration.key_formatter)
14
14
  @errors = []
15
+ @warnings = []
15
16
  @operations = []
16
17
  @fields = {}
17
18
  @filters = {}
@@ -487,11 +488,21 @@ module JSONAPI
487
488
  case key.to_s
488
489
  when 'relationships'
489
490
  value.each_key do |links_key|
490
- params_not_allowed.push(links_key) unless formatted_allowed_fields.include?(links_key.to_sym)
491
+ unless formatted_allowed_fields.include?(links_key.to_sym)
492
+ params_not_allowed.push(links_key)
493
+ unless JSONAPI.configuration.raise_if_parameters_not_allowed
494
+ value.delete links_key
495
+ end
496
+ end
491
497
  end
492
498
  when 'attributes'
493
- value.each do |attr_key, _attr_value|
494
- params_not_allowed.push(attr_key) unless formatted_allowed_fields.include?(attr_key.to_sym)
499
+ value.each do |attr_key, attr_value|
500
+ unless formatted_allowed_fields.include?(attr_key.to_sym)
501
+ params_not_allowed.push(attr_key)
502
+ unless JSONAPI.configuration.raise_if_parameters_not_allowed
503
+ value.delete attr_key
504
+ end
505
+ end
495
506
  end
496
507
  when 'type', 'id'
497
508
  else
@@ -499,7 +510,18 @@ module JSONAPI
499
510
  end
500
511
  end
501
512
 
502
- fail JSONAPI::Exceptions::ParametersNotAllowed.new(params_not_allowed) if params_not_allowed.length > 0
513
+ if params_not_allowed.length > 0
514
+ if JSONAPI.configuration.raise_if_parameters_not_allowed
515
+ fail JSONAPI::Exceptions::ParametersNotAllowed.new(params_not_allowed)
516
+ else
517
+ params_not_allowed_warnings = params_not_allowed.map do |key|
518
+ JSONAPI::Warning.new(code: JSONAPI::PARAM_NOT_ALLOWED,
519
+ title: 'Param not allowed',
520
+ detail: "#{key} is not allowed.")
521
+ end
522
+ self.warnings.concat(params_not_allowed_warnings)
523
+ end
524
+ end
503
525
  end
504
526
 
505
527
  # TODO: Please remove after `updateable_fields` is removed
@@ -1,5 +1,5 @@
1
1
  module JSONAPI
2
2
  module Resources
3
- VERSION = '0.5.5'
3
+ VERSION = '0.5.6'
4
4
  end
5
5
  end
@@ -5,6 +5,10 @@ def set_content_type_header!
5
5
  end
6
6
 
7
7
  class PostsControllerTest < ActionController::TestCase
8
+ def setup
9
+ JSONAPI.configuration.raise_if_parameters_not_allowed = true
10
+ end
11
+
8
12
  def test_index
9
13
  get :index
10
14
  assert_response :success
@@ -401,6 +405,40 @@ class PostsControllerTest < ActionController::TestCase
401
405
  assert_match /asdfg is not allowed/, response.body
402
406
  end
403
407
 
408
+ def test_create_extra_param_allow_extra_params
409
+ JSONAPI.configuration.raise_if_parameters_not_allowed = false
410
+
411
+ set_content_type_header!
412
+ post :create,
413
+ {
414
+ data: {
415
+ type: 'posts',
416
+ attributes: {
417
+ asdfg: 'aaaa',
418
+ title: 'JR is Great',
419
+ body: 'JSONAPIResources is the greatest thing since unsliced bread.'
420
+ },
421
+ relationships: {
422
+ author: {data: {type: 'people', id: '3'}}
423
+ }
424
+ },
425
+ include: 'author'
426
+ }
427
+
428
+ assert_response :created
429
+ assert json_response['data'].is_a?(Hash)
430
+ assert_equal '3', json_response['data']['relationships']['author']['data']['id']
431
+ assert_equal 'JR is Great', json_response['data']['attributes']['title']
432
+ assert_equal 'JSONAPIResources is the greatest thing since unsliced bread.', json_response['data']['attributes']['body']
433
+
434
+ assert_equal 1, json_response['meta']["warnings"].count
435
+ assert_equal "Param not allowed", json_response['meta']["warnings"][0]["title"]
436
+ assert_equal "asdfg is not allowed.", json_response['meta']["warnings"][0]["detail"]
437
+ assert_equal 105, json_response['meta']["warnings"][0]["code"]
438
+ ensure
439
+ JSONAPI.configuration.raise_if_parameters_not_allowed = true
440
+ end
441
+
404
442
  def test_create_with_invalid_data
405
443
  set_content_type_header!
406
444
  post :create,
@@ -575,6 +613,42 @@ class PostsControllerTest < ActionController::TestCase
575
613
  assert_match /subject/, json_response['errors'][0]['detail']
576
614
  end
577
615
 
616
+ def test_create_simple_unpermitted_attributes_allow_extra_params
617
+ JSONAPI.configuration.raise_if_parameters_not_allowed = false
618
+
619
+ set_content_type_header!
620
+ post :create,
621
+ {
622
+ data: {
623
+ type: 'posts',
624
+ attributes: {
625
+ title: 'JR is Great',
626
+ subject: 'JR is SUPER Great',
627
+ body: 'JSONAPIResources is the greatest thing since unsliced bread.'
628
+ },
629
+ relationships: {
630
+ author: {data: {type: 'people', id: '3'}}
631
+ }
632
+ },
633
+ include: 'author'
634
+ }
635
+
636
+ assert_response :created
637
+ assert json_response['data'].is_a?(Hash)
638
+ assert_equal '3', json_response['data']['relationships']['author']['data']['id']
639
+ assert_equal 'JR is Great', json_response['data']['attributes']['title']
640
+ assert_equal 'JR is Great', json_response['data']['attributes']['subject']
641
+ assert_equal 'JSONAPIResources is the greatest thing since unsliced bread.', json_response['data']['attributes']['body']
642
+
643
+
644
+ assert_equal 1, json_response['meta']["warnings"].count
645
+ assert_equal "Param not allowed", json_response['meta']["warnings"][0]["title"]
646
+ assert_equal "subject is not allowed.", json_response['meta']["warnings"][0]["detail"]
647
+ assert_equal 105, json_response['meta']["warnings"][0]["code"]
648
+ ensure
649
+ JSONAPI.configuration.raise_if_parameters_not_allowed = true
650
+ end
651
+
578
652
  def test_create_with_links_to_many_type_ids
579
653
  set_content_type_header!
580
654
  post :create,
@@ -704,6 +778,48 @@ class PostsControllerTest < ActionController::TestCase
704
778
  assert_equal title, post_object.title
705
779
  end
706
780
 
781
+ def test_update_with_links_allow_extra_params
782
+ JSONAPI.configuration.raise_if_parameters_not_allowed = false
783
+
784
+ set_content_type_header!
785
+ javascript = Section.find_by(name: 'javascript')
786
+
787
+ put :update,
788
+ {
789
+ id: 3,
790
+ data: {
791
+ id: '3',
792
+ type: 'posts',
793
+ attributes: {
794
+ title: 'A great new Post',
795
+ subject: 'A great new Post',
796
+ },
797
+ relationships: {
798
+ section: {data: {type: 'sections', id: "#{javascript.id}"}},
799
+ tags: {data: [{type: 'tags', id: 3}, {type: 'tags', id: 4}]}
800
+ }
801
+ },
802
+ include: 'tags,author,section'
803
+ }
804
+
805
+ assert_response :success
806
+ assert json_response['data'].is_a?(Hash)
807
+ assert_equal '3', json_response['data']['relationships']['author']['data']['id']
808
+ assert_equal javascript.id.to_s, json_response['data']['relationships']['section']['data']['id']
809
+ assert_equal 'A great new Post', json_response['data']['attributes']['title']
810
+ assert_equal 'AAAA', json_response['data']['attributes']['body']
811
+ assert matches_array?([{'type' => 'tags', 'id' => '3'}, {'type' => 'tags', 'id' => '4'}],
812
+ json_response['data']['relationships']['tags']['data'])
813
+
814
+
815
+ assert_equal 1, json_response['meta']["warnings"].count
816
+ assert_equal "Param not allowed", json_response['meta']["warnings"][0]["title"]
817
+ assert_equal "subject is not allowed.", json_response['meta']["warnings"][0]["detail"]
818
+ assert_equal 105, json_response['meta']["warnings"][0]["code"]
819
+ ensure
820
+ JSONAPI.configuration.raise_if_parameters_not_allowed = true
821
+ end
822
+
707
823
  def test_update_remove_links
708
824
  set_content_type_header!
709
825
  put :update,
@@ -1150,6 +1266,38 @@ class PostsControllerTest < ActionController::TestCase
1150
1266
  assert_match /asdfg is not allowed/, response.body
1151
1267
  end
1152
1268
 
1269
+ def test_update_extra_param_in_links_allow_extra_params
1270
+ JSONAPI.configuration.raise_if_parameters_not_allowed = false
1271
+ JSONAPI.configuration.use_text_errors = true
1272
+
1273
+ set_content_type_header!
1274
+ javascript = Section.find_by(name: 'javascript')
1275
+
1276
+ put :update,
1277
+ {
1278
+ id: 3,
1279
+ data: {
1280
+ type: 'posts',
1281
+ id: '3',
1282
+ attributes: {
1283
+ title: 'A great new Post'
1284
+ },
1285
+ relationships: {
1286
+ asdfg: 'aaaa'
1287
+ }
1288
+ }
1289
+ }
1290
+
1291
+ assert_response :success
1292
+ assert_equal "A great new Post", json_response["data"]["attributes"]["title"]
1293
+ assert_equal "Param not allowed", json_response["meta"]["warnings"][0]["title"]
1294
+ assert_equal "asdfg is not allowed.", json_response["meta"]["warnings"][0]["detail"]
1295
+ assert_equal "PARAM_NOT_ALLOWED", json_response["meta"]["warnings"][0]["code"]
1296
+ ensure
1297
+ JSONAPI.configuration.raise_if_parameters_not_allowed = true
1298
+ JSONAPI.configuration.use_text_errors = false
1299
+ end
1300
+
1153
1301
  def test_update_missing_param
1154
1302
  set_content_type_header!
1155
1303
  javascript = Section.find_by(name: 'javascript')
@@ -1550,6 +1698,7 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1550
1698
  get :index, {sort: 'not_in_record'}
1551
1699
  assert_response 400
1552
1700
  assert_equal 'INVALID_SORT_CRITERIA', json_response['errors'][0]['code']
1701
+ ensure
1553
1702
  JSONAPI.configuration.use_text_errors = false
1554
1703
  end
1555
1704
 
@@ -1605,6 +1754,7 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1605
1754
 
1606
1755
  def test_create_expense_entries_underscored
1607
1756
  set_content_type_header!
1757
+ original_config = JSONAPI.configuration.dup
1608
1758
  JSONAPI.configuration.json_key_format = :underscored_key
1609
1759
 
1610
1760
  post :create,
@@ -1632,10 +1782,13 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1632
1782
 
1633
1783
  delete :destroy, {id: json_response['data']['id']}
1634
1784
  assert_response :no_content
1785
+ ensure
1786
+ JSONAPI.configuration = original_config
1635
1787
  end
1636
1788
 
1637
1789
  def test_create_expense_entries_camelized_key
1638
1790
  set_content_type_header!
1791
+ original_config = JSONAPI.configuration.dup
1639
1792
  JSONAPI.configuration.json_key_format = :camelized_key
1640
1793
 
1641
1794
  post :create,
@@ -1663,10 +1816,13 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1663
1816
 
1664
1817
  delete :destroy, {id: json_response['data']['id']}
1665
1818
  assert_response :no_content
1819
+ ensure
1820
+ JSONAPI.configuration = original_config
1666
1821
  end
1667
1822
 
1668
1823
  def test_create_expense_entries_dasherized_key
1669
1824
  set_content_type_header!
1825
+ original_config = JSONAPI.configuration.dup
1670
1826
  JSONAPI.configuration.json_key_format = :dasherized_key
1671
1827
 
1672
1828
  post :create,
@@ -1694,6 +1850,8 @@ class ExpenseEntriesControllerTest < ActionController::TestCase
1694
1850
 
1695
1851
  delete :destroy, {id: json_response['data']['id']}
1696
1852
  assert_response :no_content
1853
+ ensure
1854
+ JSONAPI.configuration = original_config
1697
1855
  end
1698
1856
  end
1699
1857
 
@@ -1710,6 +1868,7 @@ class IsoCurrenciesControllerTest < ActionController::TestCase
1710
1868
 
1711
1869
  def test_create_currencies_client_generated_id
1712
1870
  set_content_type_header!
1871
+ original_config = JSONAPI.configuration.dup
1713
1872
  JSONAPI.configuration.json_key_format = :underscored_route
1714
1873
 
1715
1874
  post :create,
@@ -1733,6 +1892,8 @@ class IsoCurrenciesControllerTest < ActionController::TestCase
1733
1892
 
1734
1893
  delete :destroy, {id: json_response['data']['id']}
1735
1894
  assert_response :no_content
1895
+ ensure
1896
+ JSONAPI.configuration = original_config
1736
1897
  end
1737
1898
 
1738
1899
  def test_currencies_primary_key_sort
@@ -1750,6 +1911,7 @@ class IsoCurrenciesControllerTest < ActionController::TestCase
1750
1911
  end
1751
1912
 
1752
1913
  def test_currencies_json_key_underscored_sort
1914
+ original_config = JSONAPI.configuration.dup
1753
1915
  JSONAPI.configuration.json_key_format = :underscored_key
1754
1916
  get :index, {sort: 'country_name'}
1755
1917
  assert_response :success
@@ -1765,9 +1927,12 @@ class IsoCurrenciesControllerTest < ActionController::TestCase
1765
1927
  assert_equal 'United States', json_response['data'][0]['attributes']['country_name']
1766
1928
  assert_equal 'Euro Member Countries', json_response['data'][1]['attributes']['country_name']
1767
1929
  assert_equal 'Canada', json_response['data'][2]['attributes']['country_name']
1930
+ ensure
1931
+ JSONAPI.configuration = original_config
1768
1932
  end
1769
1933
 
1770
1934
  def test_currencies_json_key_dasherized_sort
1935
+ original_config = JSONAPI.configuration.dup
1771
1936
  JSONAPI.configuration.json_key_format = :dasherized_key
1772
1937
  get :index, {sort: 'country-name'}
1773
1938
  assert_response :success
@@ -1783,9 +1948,12 @@ class IsoCurrenciesControllerTest < ActionController::TestCase
1783
1948
  assert_equal 'United States', json_response['data'][0]['attributes']['country-name']
1784
1949
  assert_equal 'Euro Member Countries', json_response['data'][1]['attributes']['country-name']
1785
1950
  assert_equal 'Canada', json_response['data'][2]['attributes']['country-name']
1951
+ ensure
1952
+ JSONAPI.configuration = original_config
1786
1953
  end
1787
1954
 
1788
1955
  def test_currencies_json_key_custom_json_key_sort
1956
+ original_config = JSONAPI.configuration.dup
1789
1957
  JSONAPI.configuration.json_key_format = :upper_camelized_key
1790
1958
  get :index, {sort: 'CountryName'}
1791
1959
  assert_response :success
@@ -1801,30 +1969,41 @@ class IsoCurrenciesControllerTest < ActionController::TestCase
1801
1969
  assert_equal 'United States', json_response['data'][0]['attributes']['CountryName']
1802
1970
  assert_equal 'Euro Member Countries', json_response['data'][1]['attributes']['CountryName']
1803
1971
  assert_equal 'Canada', json_response['data'][2]['attributes']['CountryName']
1972
+ ensure
1973
+ JSONAPI.configuration = original_config
1804
1974
  end
1805
1975
 
1806
1976
  def test_currencies_json_key_underscored_filter
1977
+ original_config = JSONAPI.configuration.dup
1807
1978
  JSONAPI.configuration.json_key_format = :underscored_key
1808
1979
  get :index, {filter: {country_name: 'Canada'}}
1809
1980
  assert_response :success
1810
1981
  assert_equal 1, json_response['data'].size
1811
1982
  assert_equal 'Canada', json_response['data'][0]['attributes']['country_name']
1983
+ ensure
1984
+ JSONAPI.configuration = original_config
1812
1985
  end
1813
1986
 
1814
1987
  def test_currencies_json_key_camelized_key_filter
1988
+ original_config = JSONAPI.configuration.dup
1815
1989
  JSONAPI.configuration.json_key_format = :camelized_key
1816
1990
  get :index, {filter: {'countryName' => 'Canada'}}
1817
1991
  assert_response :success
1818
1992
  assert_equal 1, json_response['data'].size
1819
1993
  assert_equal 'Canada', json_response['data'][0]['attributes']['countryName']
1994
+ ensure
1995
+ JSONAPI.configuration = original_config
1820
1996
  end
1821
1997
 
1822
1998
  def test_currencies_json_key_custom_json_key_filter
1999
+ original_config = JSONAPI.configuration.dup
1823
2000
  JSONAPI.configuration.json_key_format = :upper_camelized_key
1824
2001
  get :index, {filter: {'CountryName' => 'Canada'}}
1825
2002
  assert_response :success
1826
2003
  assert_equal 1, json_response['data'].size
1827
2004
  assert_equal 'Canada', json_response['data'][0]['attributes']['CountryName']
2005
+ ensure
2006
+ JSONAPI.configuration = original_config
1828
2007
  end
1829
2008
  end
1830
2009
 
@@ -1851,6 +2030,7 @@ class PeopleControllerTest < ActionController::TestCase
1851
2030
  end
1852
2031
 
1853
2032
  def test_update_link_with_dasherized_type
2033
+ original_config = JSONAPI.configuration.dup
1854
2034
  JSONAPI.configuration.json_key_format = :dasherized_key
1855
2035
  set_content_type_header!
1856
2036
  put :update,
@@ -1870,6 +2050,8 @@ class PeopleControllerTest < ActionController::TestCase
1870
2050
  }
1871
2051
  }
1872
2052
  assert_response :success
2053
+ ensure
2054
+ JSONAPI.configuration = original_config
1873
2055
  end
1874
2056
 
1875
2057
  def test_create_validations_missing_attribute
@@ -1933,6 +2115,7 @@ class PeopleControllerTest < ActionController::TestCase
1933
2115
  end
1934
2116
 
1935
2117
  def test_get_related_resource
2118
+ original_config = JSONAPI.configuration.dup
1936
2119
  JSONAPI.configuration.json_key_format = :dasherized_key
1937
2120
  JSONAPI.configuration.route_format = :underscored_key
1938
2121
  get :get_related_resource, {post_id: '2', relationship: 'author', source:'posts'}
@@ -1986,6 +2169,8 @@ class PeopleControllerTest < ActionController::TestCase
1986
2169
  },
1987
2170
  json_response
1988
2171
  )
2172
+ ensure
2173
+ JSONAPI.configuration = original_config
1989
2174
  end
1990
2175
 
1991
2176
  def test_get_related_resource_nil
@@ -2195,6 +2380,7 @@ end
2195
2380
 
2196
2381
  class FactsControllerTest < ActionController::TestCase
2197
2382
  def test_type_formatting
2383
+ original_config = JSONAPI.configuration.dup
2198
2384
  JSONAPI.configuration.json_key_format = :camelized_key
2199
2385
  get :show, {id: '1'}
2200
2386
  assert_response :success
@@ -2208,9 +2394,12 @@ class FactsControllerTest < ActionController::TestCase
2208
2394
  assert_equal '2000-01-01T20:00:00Z', json_response['data']['attributes']['bedtime']
2209
2395
  assert_equal 'abc', json_response['data']['attributes']['photo']
2210
2396
  assert_equal false, json_response['data']['attributes']['cool']
2397
+ ensure
2398
+ JSONAPI.configuration = original_config
2211
2399
  end
2212
2400
 
2213
2401
  def test_create_with_invalid_data
2402
+ original_config = JSONAPI.configuration.dup
2214
2403
  JSONAPI.configuration.json_key_format = :dasherized_key
2215
2404
  set_content_type_header!
2216
2405
  post :create,
@@ -2242,6 +2431,8 @@ class FactsControllerTest < ActionController::TestCase
2242
2431
  assert_equal "/data/attributes/bio", json_response['errors'][1]['source']['pointer']
2243
2432
  assert_equal "can't be blank", json_response['errors'][1]['title']
2244
2433
  assert_equal "bio - can't be blank", json_response['errors'][1]['detail']
2434
+ ensure
2435
+ JSONAPI.configuration = original_config
2245
2436
  end
2246
2437
  end
2247
2438
 
@@ -2447,25 +2638,25 @@ class Api::V2::BooksControllerTest < ActionController::TestCase
2447
2638
  def test_books_banned_non_book_admin
2448
2639
  $test_user = Person.find(1)
2449
2640
  Api::V2::BookResource.paginator :offset
2641
+ JSONAPI.configuration.top_level_meta_include_record_count = true
2450
2642
  count_queries do
2451
- JSONAPI.configuration.top_level_meta_include_record_count = true
2452
2643
  get :index, {page: {offset: 50, limit: 12}}
2453
- JSONAPI.configuration.top_level_meta_include_record_count = false
2454
2644
  end
2455
2645
  assert_response :success
2456
2646
  assert_equal 12, json_response['data'].size
2457
2647
  assert_equal 'Book 50', json_response['data'][0]['attributes']['title']
2458
2648
  assert_equal 901, json_response['meta']['record-count']
2459
2649
  assert_query_count(2)
2650
+ ensure
2651
+ JSONAPI.configuration.top_level_meta_include_record_count = false
2460
2652
  end
2461
2653
 
2462
2654
  def test_books_banned_non_book_admin_includes_switched
2463
2655
  $test_user = Person.find(1)
2464
2656
  Api::V2::BookResource.paginator :offset
2657
+ JSONAPI.configuration.top_level_meta_include_record_count = true
2465
2658
  count_queries do
2466
- JSONAPI.configuration.top_level_meta_include_record_count = true
2467
2659
  get :index, {page: {offset: 0, limit: 12}, include: 'book-comments'}
2468
- JSONAPI.configuration.top_level_meta_include_record_count = false
2469
2660
  end
2470
2661
 
2471
2662
  assert_response :success
@@ -2476,15 +2667,16 @@ class Api::V2::BooksControllerTest < ActionController::TestCase
2476
2667
  assert_equal 'book-comments', json_response['included'][0]['type']
2477
2668
  assert_equal 901, json_response['meta']['record-count']
2478
2669
  assert_query_count(3)
2670
+ ensure
2671
+ JSONAPI.configuration.top_level_meta_include_record_count = false
2479
2672
  end
2480
2673
 
2481
2674
  def test_books_banned_non_book_admin_includes_nested_includes
2482
2675
  $test_user = Person.find(1)
2676
+ JSONAPI.configuration.top_level_meta_include_record_count = true
2483
2677
  Api::V2::BookResource.paginator :offset
2484
2678
  count_queries do
2485
- JSONAPI.configuration.top_level_meta_include_record_count = true
2486
2679
  get :index, {page: {offset: 0, limit: 12}, include: 'book-comments.author'}
2487
- JSONAPI.configuration.top_level_meta_include_record_count = false
2488
2680
  end
2489
2681
  assert_response :success
2490
2682
  assert_equal 12, json_response['data'].size
@@ -2492,51 +2684,56 @@ class Api::V2::BooksControllerTest < ActionController::TestCase
2492
2684
  assert_equal 'Book 0', json_response['data'][0]['attributes']['title']
2493
2685
  assert_equal 901, json_response['meta']['record-count']
2494
2686
  assert_query_count(4)
2687
+ ensure
2688
+ JSONAPI.configuration.top_level_meta_include_record_count = false
2495
2689
  end
2496
2690
 
2497
2691
  def test_books_banned_admin
2498
2692
  $test_user = Person.find(5)
2499
2693
  Api::V2::BookResource.paginator :offset
2500
- query_count = count_queries do
2501
- JSONAPI.configuration.top_level_meta_include_record_count = true
2694
+ JSONAPI.configuration.top_level_meta_include_record_count = true
2695
+ count_queries do
2502
2696
  get :index, {page: {offset: 50, limit: 12}, filter: {banned: 'true'}}
2503
- JSONAPI.configuration.top_level_meta_include_record_count = false
2504
2697
  end
2505
2698
  assert_response :success
2506
2699
  assert_equal 12, json_response['data'].size
2507
2700
  assert_equal 'Book 651', json_response['data'][0]['attributes']['title']
2508
2701
  assert_equal 99, json_response['meta']['record-count']
2509
2702
  assert_query_count(2)
2703
+ ensure
2704
+ JSONAPI.configuration.top_level_meta_include_record_count = false
2510
2705
  end
2511
2706
 
2512
2707
  def test_books_not_banned_admin
2513
2708
  $test_user = Person.find(5)
2514
2709
  Api::V2::BookResource.paginator :offset
2710
+ JSONAPI.configuration.top_level_meta_include_record_count = true
2515
2711
  count_queries do
2516
- JSONAPI.configuration.top_level_meta_include_record_count = true
2517
2712
  get :index, {page: {offset: 50, limit: 12}, filter: {banned: 'false'}}
2518
- JSONAPI.configuration.top_level_meta_include_record_count = false
2519
2713
  end
2520
2714
  assert_response :success
2521
2715
  assert_equal 12, json_response['data'].size
2522
2716
  assert_equal 'Book 50', json_response['data'][0]['attributes']['title']
2523
2717
  assert_equal 901, json_response['meta']['record-count']
2524
2718
  assert_query_count(2)
2719
+ ensure
2720
+ JSONAPI.configuration.top_level_meta_include_record_count = false
2525
2721
  end
2526
2722
 
2527
2723
  def test_books_banned_non_book_admin_overlapped
2528
2724
  $test_user = Person.find(1)
2529
2725
  Api::V2::BookResource.paginator :offset
2726
+ JSONAPI.configuration.top_level_meta_include_record_count = true
2530
2727
  count_queries do
2531
- JSONAPI.configuration.top_level_meta_include_record_count = true
2532
2728
  get :index, {page: {offset: 590, limit: 20}}
2533
- JSONAPI.configuration.top_level_meta_include_record_count = false
2534
2729
  end
2535
2730
  assert_response :success
2536
2731
  assert_equal 20, json_response['data'].size
2537
2732
  assert_equal 'Book 590', json_response['data'][0]['attributes']['title']
2538
2733
  assert_equal 901, json_response['meta']['record-count']
2539
2734
  assert_query_count(2)
2735
+ ensure
2736
+ JSONAPI.configuration.top_level_meta_include_record_count = false
2540
2737
  end
2541
2738
 
2542
2739
  def test_books_included_exclude_unapproved
@@ -2625,6 +2822,7 @@ class Api::V4::BooksControllerTest < ActionController::TestCase
2625
2822
  end
2626
2823
 
2627
2824
  def test_books_offset_pagination_meta
2825
+ original_config = JSONAPI.configuration.dup
2628
2826
  JSONAPI.configuration.operations_processor = :counting_active_record
2629
2827
  Api::V4::BookResource.paginator :offset
2630
2828
  get :index, {page: {offset: 50, limit: 12}}
@@ -2632,10 +2830,12 @@ class Api::V4::BooksControllerTest < ActionController::TestCase
2632
2830
  assert_equal 12, json_response['data'].size
2633
2831
  assert_equal 'Book 50', json_response['data'][0]['attributes']['title']
2634
2832
  assert_equal 901, json_response['meta']['totalRecords']
2635
- JSONAPI.configuration.operations_processor = :active_record
2833
+ ensure
2834
+ JSONAPI.configuration = original_config
2636
2835
  end
2637
2836
 
2638
2837
  def test_books_operation_links
2838
+ original_config = JSONAPI.configuration.dup
2639
2839
  JSONAPI.configuration.operations_processor = :counting_active_record
2640
2840
  Api::V4::BookResource.paginator :offset
2641
2841
  get :index, {page: {offset: 50, limit: 12}}
@@ -2644,7 +2844,8 @@ class Api::V4::BooksControllerTest < ActionController::TestCase
2644
2844
  assert_equal 'Book 50', json_response['data'][0]['attributes']['title']
2645
2845
  assert_equal 5, json_response['links'].size
2646
2846
  assert_equal 'https://test_corp.com', json_response['links']['spec']
2647
- JSONAPI.configuration.operations_processor = :active_record
2847
+ ensure
2848
+ JSONAPI.configuration = original_config
2648
2849
  end
2649
2850
  end
2650
2851
 
@@ -38,37 +38,50 @@ class RequestTest < ActionDispatch::IntegrationTest
38
38
  end
39
39
 
40
40
  def test_get_underscored_key
41
+ original_config = JSONAPI.configuration.dup
41
42
  JSONAPI.configuration.json_key_format = :underscored_key
42
43
  get '/iso_currencies'
43
44
  assert_equal 200, status
44
45
  assert_equal 3, json_response['data'].size
46
+ ensure
47
+ JSONAPI.configuration = original_config
45
48
  end
46
49
 
47
50
  def test_get_underscored_key_filtered
51
+ original_config = JSONAPI.configuration.dup
48
52
  JSONAPI.configuration.json_key_format = :underscored_key
49
53
  get '/iso_currencies?filter[country_name]=Canada'
50
54
  assert_equal 200, status
51
55
  assert_equal 1, json_response['data'].size
52
56
  assert_equal 'Canada', json_response['data'][0]['attributes']['country_name']
57
+ ensure
58
+ JSONAPI.configuration = original_config
53
59
  end
54
60
 
55
61
  def test_get_camelized_key_filtered
62
+ original_config = JSONAPI.configuration.dup
56
63
  JSONAPI.configuration.json_key_format = :camelized_key
57
64
  get '/iso_currencies?filter[countryName]=Canada'
58
65
  assert_equal 200, status
59
66
  assert_equal 1, json_response['data'].size
60
67
  assert_equal 'Canada', json_response['data'][0]['attributes']['countryName']
68
+ ensure
69
+ JSONAPI.configuration = original_config
61
70
  end
62
71
 
63
72
  def test_get_camelized_route_and_key_filtered
73
+ original_config = JSONAPI.configuration.dup
64
74
  JSONAPI.configuration.json_key_format = :camelized_key
65
75
  get '/api/v4/isoCurrencies?filter[countryName]=Canada'
66
76
  assert_equal 200, status
67
77
  assert_equal 1, json_response['data'].size
68
78
  assert_equal 'Canada', json_response['data'][0]['attributes']['countryName']
79
+ ensure
80
+ JSONAPI.configuration = original_config
69
81
  end
70
82
 
71
83
  def test_get_camelized_route_and_links
84
+ original_config = JSONAPI.configuration.dup
72
85
  JSONAPI.configuration.json_key_format = :camelized_key
73
86
  JSONAPI.configuration.route_format = :camelized_route
74
87
  get '/api/v4/expenseEntries/1/relationships/isoCurrency'
@@ -82,6 +95,8 @@ class RequestTest < ActionDispatch::IntegrationTest
82
95
  'id' => 'USD'
83
96
  }
84
97
  }, json_response)
98
+ ensure
99
+ JSONAPI.configuration = original_config
85
100
  end
86
101
 
87
102
  def test_put_single_without_content_type
@@ -398,6 +413,19 @@ class RequestTest < ActionDispatch::IntegrationTest
398
413
  assert_equal 'http://www.example.com/api/v2/books/1/book_comments?page%5Blimit%5D=10&page%5Boffset%5D=41', json_response['links']['last']
399
414
  end
400
415
 
416
+ def test_pagination_related_resources_links_meta
417
+ Api::V2::BookResource.paginator :offset
418
+ Api::V2::BookCommentResource.paginator :offset
419
+ JSONAPI.configuration.top_level_meta_include_record_count = true
420
+ get '/api/v2/books/1/book_comments?page[limit]=10'
421
+ assert_equal 51, json_response['meta']['record_count']
422
+ assert_equal 'http://www.example.com/api/v2/books/1/book_comments?page%5Blimit%5D=10&page%5Boffset%5D=0', json_response['links']['first']
423
+ assert_equal 'http://www.example.com/api/v2/books/1/book_comments?page%5Blimit%5D=10&page%5Boffset%5D=10', json_response['links']['next']
424
+ assert_equal 'http://www.example.com/api/v2/books/1/book_comments?page%5Blimit%5D=10&page%5Boffset%5D=41', json_response['links']['last']
425
+ ensure
426
+ JSONAPI.configuration.top_level_meta_include_record_count = false
427
+ end
428
+
401
429
  def test_pagination_related_resources_without_related
402
430
  Api::V2::BookResource.paginator :offset
403
431
  Api::V2::BookCommentResource.paginator :offset
@@ -511,6 +539,7 @@ class RequestTest < ActionDispatch::IntegrationTest
511
539
  end
512
540
 
513
541
  def test_flow_self_formatted_route_1
542
+ original_config = JSONAPI.configuration.dup
514
543
  JSONAPI.configuration.route_format = :dasherized_route
515
544
  JSONAPI.configuration.json_key_format = :dasherized_key
516
545
  get '/api/v6/purchase-orders'
@@ -521,9 +550,12 @@ class RequestTest < ActionDispatch::IntegrationTest
521
550
  get po_1['links']['self']
522
551
  assert_equal 200, status
523
552
  assert_hash_equals po_1, json_response['data']
553
+ ensure
554
+ JSONAPI.configuration = original_config
524
555
  end
525
556
 
526
557
  def test_flow_self_formatted_route_2
558
+ original_config = JSONAPI.configuration.dup
527
559
  JSONAPI.configuration.route_format = :underscored_route
528
560
  JSONAPI.configuration.json_key_format = :dasherized_key
529
561
  get '/api/v7/purchase_orders'
@@ -535,9 +567,12 @@ class RequestTest < ActionDispatch::IntegrationTest
535
567
  get po_1['links']['self']
536
568
  assert_equal 200, status
537
569
  assert_hash_equals po_1, json_response['data']
570
+ ensure
571
+ JSONAPI.configuration = original_config
538
572
  end
539
573
 
540
574
  def test_flow_self_formatted_route_3
575
+ original_config = JSONAPI.configuration.dup
541
576
  JSONAPI.configuration.route_format = :underscored_route
542
577
  JSONAPI.configuration.json_key_format = :underscored_key
543
578
  get '/api/v7/purchase_orders'
@@ -549,9 +584,12 @@ class RequestTest < ActionDispatch::IntegrationTest
549
584
  get po_1['links']['self']
550
585
  assert_equal 200, status
551
586
  assert_hash_equals po_1, json_response['data']
587
+ ensure
588
+ JSONAPI.configuration = original_config
552
589
  end
553
590
 
554
591
  def test_post_formatted_keys
592
+ original_config = JSONAPI.configuration.dup
555
593
  JSONAPI.configuration.route_format = :dasherized_route
556
594
  JSONAPI.configuration.json_key_format = :dasherized_key
557
595
  post '/api/v6/purchase-orders',
@@ -565,9 +603,12 @@ class RequestTest < ActionDispatch::IntegrationTest
565
603
  }.to_json, "CONTENT_TYPE" => JSONAPI::MEDIA_TYPE
566
604
 
567
605
  assert_equal 201, status
606
+ ensure
607
+ JSONAPI.configuration = original_config
568
608
  end
569
609
 
570
610
  def test_post_formatted_keys_different_route_key_1
611
+ original_config = JSONAPI.configuration.dup
571
612
  JSONAPI.configuration.route_format = :dasherized_route
572
613
  JSONAPI.configuration.json_key_format = :underscored_key
573
614
  post '/api/v6/purchase-orders',
@@ -581,9 +622,12 @@ class RequestTest < ActionDispatch::IntegrationTest
581
622
  }.to_json, "CONTENT_TYPE" => JSONAPI::MEDIA_TYPE
582
623
 
583
624
  assert_equal 201, status
625
+ ensure
626
+ JSONAPI.configuration = original_config
584
627
  end
585
628
 
586
629
  def test_post_formatted_keys_different_route_key_2
630
+ original_config = JSONAPI.configuration.dup
587
631
  JSONAPI.configuration.route_format = :underscored_route
588
632
  JSONAPI.configuration.json_key_format = :dasherized_key
589
633
  post '/api/v7/purchase_orders',
@@ -597,9 +641,12 @@ class RequestTest < ActionDispatch::IntegrationTest
597
641
  }.to_json, "CONTENT_TYPE" => JSONAPI::MEDIA_TYPE
598
642
 
599
643
  assert_equal 201, status
644
+ ensure
645
+ JSONAPI.configuration = original_config
600
646
  end
601
647
 
602
648
  def test_post_formatted_keys_wrong_format
649
+ original_config = JSONAPI.configuration.dup
603
650
  JSONAPI.configuration.route_format = :dasherized_route
604
651
  JSONAPI.configuration.json_key_format = :dasherized_key
605
652
  post '/api/v6/purchase-orders',
@@ -613,9 +660,12 @@ class RequestTest < ActionDispatch::IntegrationTest
613
660
  }.to_json, "CONTENT_TYPE" => JSONAPI::MEDIA_TYPE
614
661
 
615
662
  assert_equal 400, status
663
+ ensure
664
+ JSONAPI.configuration = original_config
616
665
  end
617
666
 
618
667
  def test_patch_formatted_dasherized
668
+ original_config = JSONAPI.configuration.dup
619
669
  JSONAPI.configuration.route_format = :dasherized_route
620
670
  JSONAPI.configuration.json_key_format = :dasherized_key
621
671
  patch '/api/v6/purchase-orders/1',
@@ -633,6 +683,7 @@ class RequestTest < ActionDispatch::IntegrationTest
633
683
  end
634
684
 
635
685
  def test_patch_formatted_dasherized_links
686
+ original_config = JSONAPI.configuration.dup
636
687
  JSONAPI.configuration.route_format = :dasherized_route
637
688
  JSONAPI.configuration.json_key_format = :dasherized_key
638
689
  patch '/api/v6/line-items/1',
@@ -652,9 +703,12 @@ class RequestTest < ActionDispatch::IntegrationTest
652
703
  }.to_json, "CONTENT_TYPE" => JSONAPI::MEDIA_TYPE
653
704
 
654
705
  assert_equal 200, status
706
+ ensure
707
+ JSONAPI.configuration = original_config
655
708
  end
656
709
 
657
710
  def test_patch_formatted_dasherized_replace_to_many
711
+ original_config = JSONAPI.configuration.dup
658
712
  JSONAPI.configuration.route_format = :dasherized_route
659
713
  JSONAPI.configuration.json_key_format = :dasherized_key
660
714
  patch '/api/v6/purchase-orders/2?include=line-items,order-flags',
@@ -680,9 +734,12 @@ class RequestTest < ActionDispatch::IntegrationTest
680
734
  }.to_json, "CONTENT_TYPE" => JSONAPI::MEDIA_TYPE
681
735
 
682
736
  assert_equal 200, status
737
+ ensure
738
+ JSONAPI.configuration = original_config
683
739
  end
684
740
 
685
741
  def test_post_to_many_link
742
+ original_config = JSONAPI.configuration.dup
686
743
  JSONAPI.configuration.route_format = :dasherized_route
687
744
  JSONAPI.configuration.json_key_format = :dasherized_key
688
745
  post '/api/v6/purchase-orders/3/relationships/line-items',
@@ -694,9 +751,12 @@ class RequestTest < ActionDispatch::IntegrationTest
694
751
  }.to_json, "CONTENT_TYPE" => JSONAPI::MEDIA_TYPE
695
752
 
696
753
  assert_equal 204, status
754
+ ensure
755
+ JSONAPI.configuration = original_config
697
756
  end
698
757
 
699
758
  def test_patch_to_many_link
759
+ original_config = JSONAPI.configuration.dup
700
760
  JSONAPI.configuration.route_format = :dasherized_route
701
761
  JSONAPI.configuration.json_key_format = :dasherized_key
702
762
  patch '/api/v6/purchase-orders/3/relationships/order-flags',
@@ -708,9 +768,12 @@ class RequestTest < ActionDispatch::IntegrationTest
708
768
  }.to_json, "CONTENT_TYPE" => JSONAPI::MEDIA_TYPE
709
769
 
710
770
  assert_equal 204, status
771
+ ensure
772
+ JSONAPI.configuration = original_config
711
773
  end
712
774
 
713
775
  def test_patch_to_one
776
+ original_config = JSONAPI.configuration.dup
714
777
  JSONAPI.configuration.route_format = :dasherized_route
715
778
  JSONAPI.configuration.json_key_format = :dasherized_key
716
779
  patch '/api/v6/line-items/5/relationships/purchase-order',
@@ -719,6 +782,8 @@ class RequestTest < ActionDispatch::IntegrationTest
719
782
  }.to_json, "CONTENT_TYPE" => JSONAPI::MEDIA_TYPE
720
783
 
721
784
  assert_equal 204, status
785
+ ensure
786
+ JSONAPI.configuration = original_config
722
787
  end
723
788
 
724
789
  def test_include_parameter_allowed
@@ -964,6 +964,7 @@ class SerializerTest < ActionDispatch::IntegrationTest
964
964
  JSONAPI::ResourceSerializer.new(PostResource,
965
965
  include: ['comments', 'comments.tags']).serialize_to_hash(posts)
966
966
  )
967
+ ensure
967
968
  JSONAPI.configuration.always_include_to_one_linkage_data = false
968
969
  end
969
970
 
@@ -1410,9 +1411,6 @@ class SerializerTest < ActionDispatch::IntegrationTest
1410
1411
  end
1411
1412
 
1412
1413
  def test_serializer_camelized_with_value_formatters
1413
- # JSONAPI.configuration.json_key_format = :camelized_key
1414
- # JSONAPI.configuration.route_format = :camelized_route
1415
-
1416
1414
  assert_hash_equals(
1417
1415
  {
1418
1416
  data: {
@@ -1618,6 +1616,7 @@ class SerializerTest < ActionDispatch::IntegrationTest
1618
1616
  end
1619
1617
 
1620
1618
  def test_serializer_booleans
1619
+ original_config = JSONAPI.configuration.dup
1621
1620
  JSONAPI.configuration.json_key_format = :underscored_key
1622
1621
 
1623
1622
  preferences = PreferencesResource.new(Preferences.find(1))
@@ -1651,9 +1650,12 @@ class SerializerTest < ActionDispatch::IntegrationTest
1651
1650
  },
1652
1651
  JSONAPI::ResourceSerializer.new(PreferencesResource).serialize_to_hash(preferences)
1653
1652
  )
1653
+ ensure
1654
+ JSONAPI.configuration = original_config
1654
1655
  end
1655
1656
 
1656
1657
  def test_serializer_data_types
1658
+ original_config = JSONAPI.configuration.dup
1657
1659
  JSONAPI.configuration.json_key_format = :underscored_key
1658
1660
 
1659
1661
  facts = FactResource.new(Fact.find(1))
@@ -1681,6 +1683,8 @@ class SerializerTest < ActionDispatch::IntegrationTest
1681
1683
  },
1682
1684
  JSONAPI::ResourceSerializer.new(FactResource).serialize_to_hash(facts)
1683
1685
  )
1686
+ ensure
1687
+ JSONAPI.configuration = original_config
1684
1688
  end
1685
1689
 
1686
1690
  def test_serializer_to_one
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonapi-resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ version: 0.5.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Gebhardt
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-08-10 00:00:00.000000000 Z
12
+ date: 2015-08-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler