json-exporter 0.3.2 → 0.4.4

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: 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: []