json-exporter 0.3.2 → 0.4.4

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
  SHA256:
3
- metadata.gz: a8d838703ee920866377de7d41ee5203a0b11496088fd9676ce7e2fa71c95ca0
4
- data.tar.gz: 60f697333d5b70b3a5dae4a9cf2297123519d4bd7f5bbbf6e06c79f1af2377dc
3
+ metadata.gz: 239935a36b473264e3694256237aa268bbc60bbd110692c5e0059a149b870df5
4
+ data.tar.gz: 3dd051ab1645e26dbe35a8db652b4aad98498057b7ad6f34bd06458850f90eae
5
5
  SHA512:
6
- metadata.gz: '09f9ecfa0f902e21c33c9080cf0e9b90286ba2cb42c78a2edd108f790589120820827059ac400d5a6e078adc87da6038a9c05e02c1dcfd29510631ca40a65eb1'
7
- data.tar.gz: 46b46b44094069ab10973fdff844659d9ac6f5472870968288e4b6a5e737ddf692fc4add3de2d9eb94b8f859a156d2ee80ce1b424a0ec9e851802f2ad12bc91f
6
+ metadata.gz: 49c06546834cdf633f4d56d99afb8a9f4fce9cfbd180bc3d0ac0a907704b2505547a660758e0f2d0729a4a2613a8a93d2770cbb9fd35aed110450e85ad313acd
7
+ data.tar.gz: 748eee943a3975b8912d2f64094fa770be7ab038455c541c8513a4b3e18bab03d617a817633a685ced4c7c8d7f181ba3773ec5b9256ba80167430fefc11b1c86
data/.version CHANGED
@@ -1 +1 @@
1
- 0.3.2
1
+ 0.4.4
@@ -1,158 +1,133 @@
1
1
  class JsonExporter
2
2
  EXPORTERS ||= {}
3
- FILTERS ||= {b:{}, a:{}}
3
+ FILTERS ||= {before:{}, after:{}}
4
+ INFLECTOR ||= Dry::Inflector.new
4
5
 
5
6
  class << self
6
- def define *args, &block
7
- if args.first.is_a?(Hash)
8
- name, opts = nil, args[0]
9
- else
10
- name, opts = args[0], args[1]
11
- end
12
-
13
- name = name ? name.to_s.classify : to_s
14
- opts ||= {}
7
+ def define name = nil, &block
8
+ # if name is given, prepend name, if not, use class name as exporter name
9
+ name = name ? "#{INFLECTOR.classify(name)}#{to_s}" : to_s
15
10
 
16
11
  EXPORTERS[name] = block
17
12
  end
18
13
 
19
- def export name, opts={}
20
- new(name, opts).render
14
+ def export name, opts = nil
15
+ new(name, opts || {}).render
21
16
  end
22
17
 
23
18
  def before &block
24
- FILTERS[:b][to_s] = block
19
+ __define_filter :before, &block
25
20
  end
26
21
 
27
- def filter &block
28
- FILTERS[:a][to_s] = block
22
+ def after &block
23
+ __define_filter :after, &block
24
+ end
25
+
26
+ private
27
+
28
+ def __define_filter name, &block
29
+ define_method name do
30
+ super() if self.class != JsonExporter
31
+ instance_exec &block
32
+ end
29
33
  end
30
- alias :after :filter
31
34
  end
32
35
 
33
36
  ###
34
37
 
35
- attr_accessor :response, :user, :model, :opts
38
+ attr_accessor :json, :model, :opts
36
39
 
37
- def initialize model, opts={}
38
- if model.is_a?(String) || model.is_a?(Symbol)
39
- raise ArgumentError, 'model argument is not model instance (it is %s)' % model.class
40
- end
40
+ alias :response :json
41
41
 
42
- opts[:version] ||= opts.delete(:v) || 1
43
-
44
- if opts.class == Hash
45
- opts = opts.to_hwia :version, :user, :depth, :current_depth, :exporter, :meta, :wia, :compact
42
+ def initialize model, opts = {}
43
+ if [String, Symbol].include?(model.class)
44
+ raise ArgumentError, 'model argument is not model instance (it is a %s)' % model.class
46
45
  end
47
46
 
48
- opts.meta ||= {}
49
- opts.depth ||= 2 # 2 is default depth
50
- opts.current_depth ||= 0
51
- opts.current_depth += 1
52
-
53
- @model = model
54
- @user = opts[:user]
55
- @opts = opts
56
- @meta = opts.wia ? opts.meta.to_hwia : opts.meta
57
- @block = exporter_find_class
58
- @response = opts.wia ? {}.to_hwia : {}
47
+ opts[:export_depth] ||= 2 # 2 is default depth. if we encounter nested recursive exports, will go only to depth 2
48
+ opts[:current_depth] ||= 0
49
+ opts[:current_depth] += 1
50
+
51
+ @model = model
52
+ @opts = opts.to_hwia
53
+ @block = __find_exporter
54
+ @json = {}
59
55
  end
60
56
 
61
57
  def render
62
- exporter_apply_filters :b
58
+ before
63
59
  instance_exec &@block
64
- exporter_apply_filters :a
60
+ after
65
61
 
66
- @opts.compact ? @response.compact : @response
62
+ @json
67
63
  end
68
64
 
69
- def version version_num=nil, &block
70
- return @opts.version unless version_num
71
-
72
- if block && @opts.version >= version_num
73
- instance_exec &block
74
- end
65
+ def merge data
66
+ data.each {|k,v| json[k] = v }
75
67
  end
76
68
 
77
- def meta arg = nil
78
- if arg
79
- if !block_given?
80
- raise ArgumentError.new('Block not given for meta with param')
81
- elsif @meta[arg]
82
- yield
83
- end
84
- else
85
- @meta
86
- end
87
- end
69
+ def before; end
70
+
71
+ def after; end
88
72
 
89
73
  private
90
74
 
91
75
  # export object
92
76
  # export :org_users, key: :users
93
- def export name, opts = {}
94
- return if @opts[:current_depth] > @opts[:depth]
77
+ def export name, local_opts = {}
78
+ return if @opts[:current_depth] > @opts[:export_depth]
95
79
 
96
80
  if name.is_a?(Symbol)
97
81
  name, cmodel = name, @model.send(name)
98
82
 
99
- if cmodel.respond_to?(:all) && cmodel.respond_to?(:first)
100
- cmodel = cmodel.all.map { |el| JsonExporter.export(el, @opts.dup) }
83
+ if cmodel.class.to_s.include?('Array')
84
+ cmodel = cmodel.map { |el| self.class.export(el, __opts) }
101
85
  end
102
86
  else
103
- name, cmodel = name.class.to_s.underscore.to_sym, name
87
+ underscored = INFLECTOR.underscore(name.class.to_s).to_sym
88
+ name, cmodel = underscored, name
104
89
  end
105
90
 
106
- @response[opts[:key] || name] =
107
- if [Array].include?(cmodel.class)
108
- cmodel
109
- elsif cmodel.nil?
110
- nil
111
- else
112
- JsonExporter.export(cmodel, @opts)
113
- end
91
+ @json[name] = if [Array].include?(cmodel.class)
92
+ cmodel
93
+ elsif cmodel.nil?
94
+ nil
95
+ else
96
+ self.class.new(cmodel, __opts(local_opts)).render
97
+ end
114
98
  end
115
99
 
116
100
  # add property to exporter
117
- def property name, data=:_undefined
101
+ def property name, data = :_undefined, &block
118
102
  if block_given?
119
103
  hash_data = {}
120
- data = yield hash_data
104
+ data = instance_exec hash_data, &block
121
105
  data = hash_data if hash_data.keys.first
122
106
  elsif data == :_undefined
123
107
  data = @model.send(name)
124
108
  end
125
109
 
126
- @response[name] = data unless data.nil?
110
+ @json[name] = data unless data.nil?
127
111
  end
128
112
  alias :prop :property
129
113
 
130
- # finds versioned exporter
131
- def exporter_find_class version=nil
132
- exporter =
133
- if self.class == JsonExporter
134
- # JsonExporter.define User do
135
- @opts.exporter ? @opts.exporter.to_s.classify : model.class
136
- else
137
- # class FooExporter< JsonExporter
138
- self.class
139
- end
140
-
141
- EXPORTERS[exporter.to_s] || raise('Exporter "%s" (:%s) not found' % [exporter, exporter.to_s.underscore])
142
- end
114
+ def __find_exporter version = nil
115
+ base = INFLECTOR.classify @opts[:exporter] || model.class.to_s
116
+ exporter = self.class.to_s
143
117
 
144
- def exporter_apply_filters kind
145
- for klass in self.class.ancestors.reverse.map(&:to_s)
146
- if filter = FILTERS[kind][klass]
147
- instance_exec(&filter) if filter
148
- end
118
+ self.class.ancestors.map(&:to_s).each do |klass|
119
+ block = EXPORTERS[[base, klass].join] || EXPORTERS[klass]
120
+ return block if block
149
121
  end
122
+
123
+ raise %[Exporter for class "#{base}" not found.]
150
124
  end
151
125
 
152
- def merge object
153
- object.each do |k, v|
154
- prop k.to_sym, v
155
- end
126
+ def __opts start = {}
127
+ start.merge(
128
+ export_depth: @opts[:export_depth],
129
+ current_depth: @opts[:current_depth]
130
+ )
156
131
  end
157
132
  end
158
133
 
@@ -1,9 +1,9 @@
1
- # shortcut for JsonExporter.define(name) {}
1
+ # shortcut for JsonExporter.define(:page) {}
2
2
  # JsonExporter :page do
3
3
  # prop :name
4
4
  # end
5
5
 
6
- # shortcut for JsonExporter.new(object).render
6
+ # shortcut for JsonExporter.new(Page.first).render
7
7
  # JsonExporter Page.first
8
8
 
9
9
  def JsonExporter name_or_object, opts = {}, &block
data/lib/json-exporter.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'hash_wia'
2
+ require 'dry-inflector'
2
3
 
3
4
  require_relative './json-exporter/base'
4
5
  require_relative './json-exporter/klass_func'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-exporter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dino Reic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-24 00:00:00.000000000 Z
11
+ date: 2022-08-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hash_wia
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-inflector
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: Fast ruby object JSON exporter, easy to use and extend
28
42
  email: reic.dino@gmail.com
29
43
  executables: []
@@ -53,8 +67,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  requirements: []
56
- rubygems_version: 3.2.22
70
+ rubygems_version: 3.2.3
57
71
  signing_key:
58
72
  specification_version: 4
59
- summary: Fast, simple & powerful object exporter
73
+ summary: Fast, simple & powerful object exporter to json
60
74
  test_files: []