jsonapionify 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +13 -5
  2. data/.rubocop.yml +1 -0
  3. data/.ruby-version +1 -1
  4. data/.travis.yml +8 -0
  5. data/README.md +85 -3
  6. data/Rakefile +14 -0
  7. data/jsonapionify.gemspec +3 -0
  8. data/lib/jsonapionify/api/action.rb +84 -121
  9. data/lib/jsonapionify/api/attribute.rb +97 -20
  10. data/lib/jsonapionify/api/base/class_methods.rb +5 -4
  11. data/lib/jsonapionify/api/base/delegation.rb +20 -4
  12. data/lib/jsonapionify/api/base/doc_helper.rb +3 -3
  13. data/lib/jsonapionify/api/base/reloader.rb +1 -1
  14. data/lib/jsonapionify/api/base/resource_definitions.rb +28 -15
  15. data/lib/jsonapionify/api/base.rb +6 -0
  16. data/lib/jsonapionify/api/context.rb +18 -5
  17. data/lib/jsonapionify/api/context_delegate.rb +24 -7
  18. data/lib/jsonapionify/api/errors.rb +2 -0
  19. data/lib/jsonapionify/api/errors_object.rb +6 -5
  20. data/lib/jsonapionify/api/relationship/blocks.rb +1 -1
  21. data/lib/jsonapionify/api/relationship/many.rb +35 -11
  22. data/lib/jsonapionify/api/relationship/one.rb +17 -7
  23. data/lib/jsonapionify/api/relationship.rb +20 -6
  24. data/lib/jsonapionify/api/resource/builders.rb +81 -30
  25. data/lib/jsonapionify/api/resource/caching.rb +28 -0
  26. data/lib/jsonapionify/api/resource/caller.rb +61 -0
  27. data/lib/jsonapionify/api/resource/class_methods.rb +6 -2
  28. data/lib/jsonapionify/api/resource/defaults/actions.rb +47 -0
  29. data/lib/jsonapionify/api/resource/defaults/errors.rb +61 -15
  30. data/lib/jsonapionify/api/resource/defaults/hooks.rb +68 -0
  31. data/lib/jsonapionify/api/resource/defaults/options.rb +16 -28
  32. data/lib/jsonapionify/api/resource/defaults/params.rb +3 -0
  33. data/lib/jsonapionify/api/resource/defaults/request_contexts.rb +80 -32
  34. data/lib/jsonapionify/api/resource/defaults/response_contexts.rb +13 -6
  35. data/lib/jsonapionify/api/resource/defaults.rb +1 -1
  36. data/lib/jsonapionify/api/resource/definitions/actions.rb +81 -55
  37. data/lib/jsonapionify/api/resource/definitions/attributes.rb +46 -10
  38. data/lib/jsonapionify/api/resource/definitions/contexts.rb +6 -2
  39. data/lib/jsonapionify/api/resource/definitions/helpers.rb +1 -1
  40. data/lib/jsonapionify/api/resource/definitions/pagination.rb +47 -56
  41. data/lib/jsonapionify/api/resource/definitions/params.rb +11 -15
  42. data/lib/jsonapionify/api/resource/definitions/relationships.rb +43 -7
  43. data/lib/jsonapionify/api/resource/definitions/request_headers.rb +6 -3
  44. data/lib/jsonapionify/api/resource/definitions/response_headers.rb +1 -1
  45. data/lib/jsonapionify/api/resource/definitions/scopes.rb +5 -5
  46. data/lib/jsonapionify/api/resource/definitions/sorting.rb +12 -11
  47. data/lib/jsonapionify/api/resource/definitions.rb +1 -1
  48. data/lib/jsonapionify/api/resource/error_handling.rb +92 -20
  49. data/lib/jsonapionify/api/resource/exec.rb +11 -0
  50. data/lib/jsonapionify/api/resource/includer.rb +89 -1
  51. data/lib/jsonapionify/api/resource.rb +55 -8
  52. data/lib/jsonapionify/api/response.rb +43 -14
  53. data/lib/jsonapionify/api/server/media_type.rb +36 -0
  54. data/lib/jsonapionify/api/server/request.rb +25 -11
  55. data/lib/jsonapionify/api/server.rb +8 -4
  56. data/lib/jsonapionify/api/sort_field.rb +18 -0
  57. data/lib/jsonapionify/api/sort_field_set.rb +1 -1
  58. data/lib/jsonapionify/api/test_helper.rb +46 -0
  59. data/lib/jsonapionify/documentation/template.erb +2 -2
  60. data/lib/jsonapionify/documentation.rb +10 -0
  61. data/lib/jsonapionify/structure/collections/base.rb +10 -3
  62. data/lib/jsonapionify/structure/helpers/object_defaults.rb +5 -10
  63. data/lib/jsonapionify/structure/maps/relationships.rb +4 -0
  64. data/lib/jsonapionify/structure/objects/attributes.rb +4 -0
  65. data/lib/jsonapionify/structure/objects/base.rb +22 -9
  66. data/lib/jsonapionify/structure/objects/error.rb +2 -0
  67. data/lib/jsonapionify/structure/objects/jsonapi.rb +1 -0
  68. data/lib/jsonapionify/structure/objects/link.rb +1 -0
  69. data/lib/jsonapionify/structure/objects/relationship.rb +2 -0
  70. data/lib/jsonapionify/structure/objects/resource.rb +2 -0
  71. data/lib/jsonapionify/structure/objects/resource_identifier.rb +12 -4
  72. data/lib/jsonapionify/structure/objects/top_level.rb +4 -2
  73. data/lib/jsonapionify/types/array_type.rb +16 -11
  74. data/lib/jsonapionify/types/boolean_type.rb +9 -4
  75. data/lib/jsonapionify/types/date_string_type.rb +7 -10
  76. data/lib/jsonapionify/types/float_type.rb +13 -0
  77. data/lib/jsonapionify/types/integer_type.rb +12 -0
  78. data/lib/jsonapionify/types/object_type.rb +7 -2
  79. data/lib/jsonapionify/types/string_type.rb +12 -0
  80. data/lib/jsonapionify/types/time_string_type.rb +8 -10
  81. data/lib/jsonapionify/types.rb +43 -5
  82. data/lib/jsonapionify/version.rb +1 -1
  83. data/lib/jsonapionify.rb +36 -1
  84. metadata +121 -74
@@ -4,6 +4,10 @@ module JSONAPIonify::Types
4
4
  extend JSONAPIonify::Autoload
5
5
  autoload_all
6
6
 
7
+ DumpError = Class.new(StandardError)
8
+ LoadError = Class.new(StandardError)
9
+ NotNullError = Class.new(StandardError)
10
+
7
11
  def types
8
12
  DefinitionFinder
9
13
  end
@@ -20,6 +24,32 @@ module JSONAPIonify::Types
20
24
  include JSONAPIonify::Callbacks
21
25
  define_callbacks :initialize
22
26
 
27
+ def self.dumper(&block)
28
+ meth = instance_method define_method(:dump, &block)
29
+ define_method(:dump) do |value|
30
+ return nil if value.nil? && !not_null?
31
+ raise NotNullError if value.nil? && not_null?
32
+ meth.bind(self).call(value)
33
+ end
34
+ end
35
+
36
+ def self.loader(&block)
37
+ meth = instance_method define_method(:load, &block)
38
+ define_method(:load) do |value|
39
+ return nil if value.nil? && !not_null?
40
+ raise NotNullError if value.nil? && not_null?
41
+ meth.bind(self).call(value)
42
+ end
43
+ end
44
+
45
+ loader do |value|
46
+ value
47
+ end
48
+
49
+ dumper do |value|
50
+ JSON.load JSON.dump value
51
+ end
52
+
23
53
  def name
24
54
  self.class.name.split('::').last.chomp('Type')
25
55
  end
@@ -30,17 +60,25 @@ module JSONAPIonify::Types
30
60
  run_callbacks :initialize do
31
61
  @options = options
32
62
  end
33
- freeze
34
63
  end
35
64
 
36
- def load(non_ruby)
37
- non_ruby
65
+ def to_s
66
+ name = self.class.name.split('::').last.chomp('Type')
67
+ name << "[#{options[:of].to_s}]" if options[:of]
68
+ name
38
69
  end
39
70
 
40
- def dump(ruby)
41
- JSON.load JSON.dump ruby
71
+ def not_null!
72
+ @not_null = true
73
+ self
42
74
  end
43
75
 
76
+ def not_null?
77
+ !!@not_null
78
+ end
79
+
80
+ private
81
+
44
82
  def verify(non_ruby)
45
83
  dump(load(non_ruby)) == non_ruby
46
84
  end
@@ -1,3 +1,3 @@
1
1
  module JSONAPIonify
2
- VERSION = "0.9.0"
2
+ VERSION = "0.9.1"
3
3
  end
data/lib/jsonapionify.rb CHANGED
@@ -4,6 +4,7 @@ require "active_support/core_ext/string/inflections"
4
4
  require "active_support/core_ext/hash/keys"
5
5
  require 'active_support/cache'
6
6
  require 'jsonapionify/autoload'
7
+ require 'oj'
7
8
 
8
9
  module JSONAPIonify
9
10
  autoload :VERSION, 'jsonapi-objects/version'
@@ -23,7 +24,7 @@ module JSONAPIonify
23
24
  end
24
25
 
25
26
  def self.parse(hash)
26
- hash = JSON.parse(hash) if hash.is_a? String
27
+ hash = Oj.load(hash) if hash.is_a? String
27
28
  Structure::Objects::TopLevel.from_hash(hash)
28
29
  end
29
30
 
@@ -41,10 +42,44 @@ module JSONAPIonify
41
42
  )
42
43
  end
43
44
 
45
+ def self.verbose_errors=(value)
46
+ self.show_backtrace = @verbose_errors = value
47
+ end
48
+
49
+ def self.verbose_errors
50
+ return @verbose_errors if instance_variable_defined?(:@verbose_errors)
51
+ self.verbose_errors = ENV['RACK_ENV'] != 'production'
52
+ end
53
+
54
+ def self.show_backtrace=(value)
55
+ @show_backtrace = value
56
+ end
57
+
58
+ def self.show_backtrace
59
+ return @show_backtrace if instance_variable_defined?(:@show_backtrace)
60
+ self.show_backtrace = ENV['RACK_ENV'] != 'production'
61
+ end
62
+
63
+ def self.logger=(logger)
64
+ @logger = logger
65
+ end
66
+
67
+ def self.logger
68
+ @logger ||= defined?(Rails) ? Rails.logger : Logger.new('/dev/null')
69
+ end
70
+
44
71
  def self.cache_store=(store)
45
72
  @cache_store = store
46
73
  end
47
74
 
75
+ def self.disable_validation(bool)
76
+ @validation_disabled = bool
77
+ end
78
+
79
+ def self.validation_disabled?
80
+ !!@validation_disabled
81
+ end
82
+
48
83
  def self.cache_store
49
84
  @cache_store ||= ActiveSupport::Cache.lookup_store :null_store
50
85
  end