jsonapi-resources 0.5.5 → 0.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 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