nagare 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/lib/nagare.rb +131 -0
  3. data/lib/nagare/railtie.rb +43 -0
  4. metadata +74 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 4cb3d508860caa3dc32dc42d5576fc1dc3319d7d
4
+ data.tar.gz: a2bf374a731001a116227af14d9e1d06719a0f3c
5
+ SHA512:
6
+ metadata.gz: 35770de8b7dfec7e9d0d5513034888d124891baffe6a4dfbd978bb1413d903f6351bb2c7703c658131151b55cd399f36207882178214750b429ca094d59efb0c
7
+ data.tar.gz: 0b9d7cbf9cc86d5f528c7b75c521afd2fa2b04ff71d170b04c486ba766d14cbb05433c29a7cba6f944484bb50808053f3fb11d78c28b1b4be337eb5ba78adcf1
@@ -0,0 +1,131 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+
4
+ module Nagare
5
+ class Item
6
+ def self._attributes
7
+ @attributes ||= []
8
+ end
9
+
10
+ def self.attributes(*attributes)
11
+ @attributes = _attributes.concat(attributes)
12
+
13
+ attributes.each do |attribute|
14
+ define_method(attribute) do
15
+ if object.respond_to?(attribute)
16
+ object.send(attribute)
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ def initialize(object, context)
23
+ @object = object
24
+ @context = context
25
+ end
26
+
27
+ def attributes
28
+ self.class._attributes.inject({}) do |hash, attribute|
29
+ hash[attribute.to_s] = send(attribute)
30
+ hash
31
+ end.compact
32
+ end
33
+
34
+ def method_missing(key, *args)
35
+ if context.respond_to?(key)
36
+ context.send(key, *args)
37
+ else
38
+ super
39
+ end
40
+ end
41
+
42
+ def as_json(options = nil)
43
+ attributes
44
+ end
45
+
46
+ private
47
+
48
+ attr_reader :object, :context
49
+ end
50
+
51
+ class Collection < Item
52
+ include Enumerable
53
+
54
+ def self._key
55
+ @key || "items"
56
+ end
57
+
58
+ def self.key(key)
59
+ @key = key
60
+ end
61
+
62
+ def self.attributes(*attributes)
63
+ @attributes = _attributes.concat(attributes)
64
+ end
65
+
66
+ def initialize(collection, context, serializer:)
67
+ @collection = collection
68
+ @context = context
69
+ @serializer = serializer
70
+ end
71
+
72
+ def each
73
+ collection.map do |item|
74
+ yield serializer.new(item, context)
75
+ end
76
+ end
77
+
78
+ def as_json(options = nil)
79
+ items = collection.map do |item|
80
+ serializer.new(item, context).as_json
81
+ end
82
+
83
+ attributes.merge({
84
+ self.class._key => items,
85
+ })
86
+ end
87
+
88
+ private
89
+
90
+ undef :object
91
+ attr_reader :collection, :serializer
92
+ end
93
+
94
+ class Adapter
95
+ def initialize(serializer)
96
+ @serializer = serializer
97
+ end
98
+
99
+ def as_json(options = nil)
100
+ serializer.as_json(options)
101
+ end
102
+
103
+ private
104
+
105
+ attr_reader :serializer
106
+ end
107
+
108
+ class Context
109
+ def initialize(attributes = {})
110
+ @attributes = attributes
111
+ end
112
+
113
+ def extend(attributes)
114
+ Context.new(@attributes.merge(attributes))
115
+ end
116
+
117
+ def respond_to?(key, private_methods = false)
118
+ @attributes.has_key?(key) || super
119
+ end
120
+
121
+ def method_missing(method)
122
+ if @attributes.has_key?(method)
123
+ @attributes.fetch(method)
124
+ else
125
+ super
126
+ end
127
+ end
128
+ end
129
+ end
130
+
131
+ require 'nagare/railtie' if defined?(Rails)
@@ -0,0 +1,43 @@
1
+ module Nagare
2
+ module Controller
3
+ private
4
+
5
+ def nagare_adapter
6
+ Nagare::Adapter
7
+ end
8
+
9
+ def nagare_context
10
+ @nagare_context ||= Nagare::Context.new
11
+ end
12
+
13
+ def _render_with_renderer_json(resource, options)
14
+ serializers = options.fetch(:serializers, nil)
15
+
16
+ if serializers.nil?
17
+ return super(resource, options)
18
+ end
19
+
20
+ if resource.respond_to?(:each)
21
+ collection_serializer = serializers.fetch(:collection)
22
+ item_serializer = serializers.fetch(:item)
23
+
24
+ serializer = collection_serializer.
25
+ new(resource, nagare_context.extend(options.fetch(:context, {})), serializer: item_serializer)
26
+ else
27
+ item_serializer = serializers.fetch(:item)
28
+
29
+ serializer = item_serializer.new(resource, nagare_context.extend(options.fetch(:context, {})))
30
+ end
31
+
32
+ super(nagare_adapter.new(serializer), options)
33
+ end
34
+ end
35
+
36
+ class Railtie < Rails::Railtie
37
+ initializer "nagare.action_controller" do
38
+ ActiveSupport.on_load(:action_controller) do
39
+ include Nagare::Controller
40
+ end
41
+ end
42
+ end
43
+ end
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nagare
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Eric Oestrich
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.0'
41
+ description: Serialize your ruby objects
42
+ email:
43
+ - eric@oestrich.org
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - lib/nagare.rb
49
+ - lib/nagare/railtie.rb
50
+ homepage: http://github.com/oestrich/nagare
51
+ licenses:
52
+ - MIT
53
+ metadata: {}
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 1.3.6
68
+ requirements: []
69
+ rubyforge_project:
70
+ rubygems_version: 2.5.1
71
+ signing_key:
72
+ specification_version: 4
73
+ summary: Serialize your ruby objects
74
+ test_files: []