jsonize 0.2.0 → 0.3.0

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
  SHA256:
3
- metadata.gz: d3227e59ca0f4826ae7a108ba9ab99419e2441fa7ca4182cd288000fe5caaa5b
4
- data.tar.gz: 5d79a0a28100a90b628b96820d250a10fa9b70806203b078d68c7828a035d88a
3
+ metadata.gz: 5f9ca1fdab05a8d207c70e1600579a486d4532431fae68683398cb1ee1d8e7ec
4
+ data.tar.gz: bd1db6eda7a52b81fbfdeda0b83c9ede523da3c06df6fecefe961e9006784def
5
5
  SHA512:
6
- metadata.gz: e427382e3c42a97b5991c2d382a078a198562c1686c835e7039546de9ce360890c8cd6ada52bb3339c1835fd9422d686875631ecdad6bf30f312a5bac38480ab
7
- data.tar.gz: e35614f1087c93893ee1dc739b4c2a85756f632afcb99a419b70afb605714b459f5b8bf3bc2b1e0435527d4ce24999993df61e6c39366eb5c53d01cbda81a7c8
6
+ metadata.gz: 427fbc6d4eb02797ffcf4a93915b044d14cfb205ec7b8cd2784258f989b98739cef5b69a294e37cbd6a5e02a6895a9eecf45a92911906f64229296ae3398ce14
7
+ data.tar.gz: 47329b942f4f8f89243c5cb8c775186d80febecb0233944978cfdd3d1b8a3cae2bc90bb9e79ce893487dbea49b86c5b3505a0c8259b23657a548819febc6dcca
data/README.md CHANGED
@@ -32,7 +32,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
32
32
 
33
33
  ## Contributing
34
34
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/jsonize. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/jsonize/blob/master/CODE_OF_CONDUCT.md).
35
+ Bug reports and pull requests are welcome on GitHub at https://codeberg.org/majioa/jsonize. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://codeberg.org/majioa/jsonize/blob/master/CODE_OF_CONDUCT.md).
36
36
 
37
37
 
38
38
  ## License
@@ -41,4 +41,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
41
41
 
42
42
  ## Code of Conduct
43
43
 
44
- Everyone interacting in the Jsonize project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/jsonize/blob/master/CODE_OF_CONDUCT.md).
44
+ Everyone interacting in the Jsonize project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://codeberg.org/majioa/jsonize/blob/master/CODE_OF_CONDUCT.md).
data/jsonize.gemspec CHANGED
@@ -8,15 +8,15 @@ Gem::Specification.new do |spec|
8
8
 
9
9
  spec.summary = %q{Act as as_json for active record model or as a jsonize}
10
10
  spec.description = %q{Act as as_json for active record model or as a jsonize using the cacheable redisize}
11
- spec.homepage = "https://github.com/majioa/jsonize"
11
+ spec.homepage = "https://codeberg.org/majioa/jsonize"
12
12
  spec.license = "MIT"
13
13
  spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
14
14
 
15
15
  spec.metadata["allowed_push_host"] = "https://rubygems.org"
16
16
 
17
17
  spec.metadata["homepage_uri"] = spec.homepage
18
- spec.metadata["source_code_uri"] = "https://github.com/majioa/jsonize"
19
- spec.metadata["changelog_uri"] = "https://github.com/majioa/jsonize/CHANGELOG.md"
18
+ spec.metadata["source_code_uri"] = "https://codeberg.org/majioa/jsonize"
19
+ spec.metadata["changelog_uri"] = "https://codeberg.org/majioa/jsonize/CHANGELOG.md"
20
20
 
21
21
  # Specify which files should be added to the gem when it is released.
22
22
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -3,4 +3,5 @@ require 'active_support/lazy_load_hooks'
3
3
  ActiveSupport.on_load :active_record do
4
4
  ::ActiveRecord::Base.send :include, Jsonize
5
5
  ::ActiveRecord::Relation.send :include, Jsonize::Relation
6
+ ::Enumerable.send :include, Jsonize::Collection
6
7
  end
@@ -1,3 +1,3 @@
1
1
  module Jsonize
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/jsonize.rb CHANGED
@@ -34,18 +34,18 @@ module Jsonize
34
34
  end
35
35
 
36
36
  def generate_relation rela, source_in, options
37
- source = source_in.is_a?(Hash) ? source_in : source_in.polymorphic? ?
38
- {} : required_attibutes(source_in.klass, {})
37
+ attr_props = source_in.is_a?(Hash) ? source_in : source_in.polymorphic? ?
38
+ {} : jsonize_scheme_for(source_in.klass, attibute_tree(source_in.klass, options))
39
39
 
40
40
  case rela
41
41
  when Enumerable
42
42
  rela.map do |rec|
43
- generate_json(rec, source, options)
43
+ generate_json(rec, attr_props, options)
44
44
  end
45
45
  when NilClass
46
46
  nil
47
47
  when Object
48
- generate_json(rela, source, options)
48
+ generate_json(rela, attr_props, options)
49
49
  end
50
50
  end
51
51
 
@@ -57,11 +57,24 @@ module Jsonize
57
57
  [props].flatten.reduce(nil) do |r, source|
58
58
  case source
59
59
  when UnboundMethod
60
- r || source.bind(flow)[]
60
+ r ||
61
+ begin
62
+ source.bind(flow)[]
63
+ rescue ActiveModel::MissingAttributeError, TypeError, NoMethodError
64
+ rescue Exception => e
65
+ $stderr.puts("#{e.class}: #{e.message}")
66
+ # binding.pry
67
+ end
61
68
  when Proc
62
69
  r || source[flow]
63
70
  when Hash, ActiveRecord::Reflection::AbstractReflection
64
- generate_relation(r || flow.send(name), source, options)
71
+ o = !options[:only] ? options :
72
+ options[:only].is_a?(Hash) ? options.merge(only: options[:only][name]) :
73
+ options.merge(only: nil)
74
+
75
+ generate_relation(r || flow.respond_to?(name) && flow.send(name) || nil, source, o)
76
+ when NilClass
77
+ r
65
78
  else
66
79
  raise
67
80
  end
@@ -80,24 +93,35 @@ module Jsonize
80
93
  if x.is_a?(Hash)
81
94
  x.reduce(h) do |hh, (sub, subattrs)|
82
95
  if submodel = model._reflections[sub]&.klass
83
- hh.merge(sub.to_sym => prepare_attributes(submodel, subattrs))
96
+ collect_attributes(hh, model, sub, sub.to_sym, prepare_attributes(submodel, subattrs))
84
97
  else
85
98
  hh
86
99
  end
87
100
  end
88
101
  else
89
- props = [
90
- model._reflections[x.to_s],
91
- model.instance_methods.include?(x.to_sym) ? model.instance_method(x.to_sym) : nil,
92
- (self.class == model ? self.attribute_names : model.attribute_names).
93
- include?(x.to_s) ? ->(this) { this.read_attribute(x) } : nil
94
- ].compact
95
-
96
- h.merge(x.to_s.sub(/^_/, '').to_sym => props)
102
+ collect_attributes(h, model, x, x.to_s.sub(/^_/, '').to_sym, nil)
97
103
  end
98
104
  end
99
105
  end
100
106
 
107
+ def collect_attributes h, model, name, key, value
108
+ base = [ ->(this) { this.respond_to?(:read_attribute) ? this.read_attribute("_#{name}") : nil } ]
109
+
110
+ props =
111
+ unless value
112
+ [model._reflections[name.to_s],
113
+ model.instance_methods.include?(name.to_sym) ? model.instance_method(name.to_sym) : nil,
114
+ ->(this) { this.is_a?(Hash) ? this[name] : nil },
115
+ (self.class == model ? self.attribute_names : model.attribute_names).include?(name.to_s) ?
116
+ ->(this) { this.respond_to?(:read_attribute) ? this.read_attribute(name) : nil } : nil,
117
+ ].compact
118
+ else
119
+ [value]
120
+ end
121
+
122
+ h.merge(key => base.concat(props))
123
+ end
124
+
101
125
  def attibute_tree klass, options = {}
102
126
  options[:only] ||
103
127
  jsonize_attributes_except(self.class == klass ? self.attribute_names : klass.attribute_names,
@@ -149,6 +173,50 @@ module Jsonize
149
173
  generate_json(self, attr_props, options)
150
174
  end
151
175
 
176
+ module Collection
177
+ def jsonize context = {}
178
+ method =
179
+ case self
180
+ when Hash
181
+ :redisize_hash
182
+ when Array
183
+ :redisize_array
184
+ end
185
+
186
+ send(method) do
187
+ as_pure_json(context)
188
+ end
189
+ end
190
+
191
+ def recontext context, key
192
+ context_only = [context[:only]].flatten(1).reduce(nil) { |r, x| r || (x.is_a?(Hash) ? x[key] : r) }
193
+ context_except = [context[:except]].flatten(1).reduce(nil) { |r, x| r || (x.is_a?(Hash) ? x[key] : r) }
194
+
195
+ context.merge(only: context_only, except: context_except)
196
+ end
197
+
198
+ def as_pure_json context = {}
199
+ case self
200
+ when Hash
201
+ self.map do |key, value_in|
202
+ new_context = recontext(context, key)
203
+
204
+ value = value_in.respond_to?(:as_pure_json) ? value_in.as_pure_json(new_context) : value_in.as_json(new_context)
205
+
206
+ [key.to_s, value]
207
+ end.to_h
208
+ when Array
209
+ self.map.with_index do |value_in, index|
210
+ new_context = recontext(context, index.to_i)
211
+
212
+ value_in.respond_to?(:as_pure_json) ? value_in.as_pure_json(new_context) : value_in.as_json(new_context)
213
+ end
214
+ else
215
+ as_json(context)
216
+ end
217
+ end
218
+ end
219
+
152
220
  module Relation
153
221
  def jsonize context = {}
154
222
  redisize_sql do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonize
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel «Malo» Skrylev
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-12-31 00:00:00.000000000 Z
11
+ date: 2024-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redisize
@@ -72,14 +72,14 @@ files:
72
72
  - lib/jsonize.rb
73
73
  - lib/jsonize/orm/active_record.rb
74
74
  - lib/jsonize/version.rb
75
- homepage: https://github.com/majioa/jsonize
75
+ homepage: https://codeberg.org/majioa/jsonize
76
76
  licenses:
77
77
  - MIT
78
78
  metadata:
79
79
  allowed_push_host: https://rubygems.org
80
- homepage_uri: https://github.com/majioa/jsonize
81
- source_code_uri: https://github.com/majioa/jsonize
82
- changelog_uri: https://github.com/majioa/jsonize/CHANGELOG.md
80
+ homepage_uri: https://codeberg.org/majioa/jsonize
81
+ source_code_uri: https://codeberg.org/majioa/jsonize
82
+ changelog_uri: https://codeberg.org/majioa/jsonize/CHANGELOG.md
83
83
  post_install_message:
84
84
  rdoc_options: []
85
85
  require_paths:
@@ -95,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  requirements: []
98
- rubygems_version: 3.3.7
98
+ rubygems_version: 3.3.26
99
99
  signing_key:
100
100
  specification_version: 4
101
101
  summary: Act as as_json for active record model or as a jsonize