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 +4 -4
- data/.version +1 -1
- data/lib/json-exporter/base.rb +69 -94
- data/lib/json-exporter/klass_func.rb +2 -2
- data/lib/json-exporter.rb +1 -0
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 239935a36b473264e3694256237aa268bbc60bbd110692c5e0059a149b870df5
|
4
|
+
data.tar.gz: 3dd051ab1645e26dbe35a8db652b4aad98498057b7ad6f34bd06458850f90eae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49c06546834cdf633f4d56d99afb8a9f4fce9cfbd180bc3d0ac0a907704b2505547a660758e0f2d0729a4a2613a8a93d2770cbb9fd35aed110450e85ad313acd
|
7
|
+
data.tar.gz: 748eee943a3975b8912d2f64094fa770be7ab038455c541c8513a4b3e18bab03d617a817633a685ced4c7c8d7f181ba3773ec5b9256ba80167430fefc11b1c86
|
data/.version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.4
|
data/lib/json-exporter/base.rb
CHANGED
@@ -1,158 +1,133 @@
|
|
1
1
|
class JsonExporter
|
2
2
|
EXPORTERS ||= {}
|
3
|
-
FILTERS ||= {
|
3
|
+
FILTERS ||= {before:{}, after:{}}
|
4
|
+
INFLECTOR ||= Dry::Inflector.new
|
4
5
|
|
5
6
|
class << self
|
6
|
-
def define
|
7
|
-
if
|
8
|
-
|
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
|
-
|
19
|
+
__define_filter :before, &block
|
25
20
|
end
|
26
21
|
|
27
|
-
def
|
28
|
-
|
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 :
|
38
|
+
attr_accessor :json, :model, :opts
|
36
39
|
|
37
|
-
|
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
|
-
|
43
|
-
|
44
|
-
|
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
|
49
|
-
opts
|
50
|
-
opts
|
51
|
-
|
52
|
-
|
53
|
-
@
|
54
|
-
@
|
55
|
-
@
|
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
|
-
|
58
|
+
before
|
63
59
|
instance_exec &@block
|
64
|
-
|
60
|
+
after
|
65
61
|
|
66
|
-
@
|
62
|
+
@json
|
67
63
|
end
|
68
64
|
|
69
|
-
def
|
70
|
-
|
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
|
78
|
-
|
79
|
-
|
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,
|
94
|
-
return if @opts[:current_depth] > @opts[:
|
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.
|
100
|
-
cmodel = cmodel.
|
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
|
-
|
87
|
+
underscored = INFLECTOR.underscore(name.class.to_s).to_sym
|
88
|
+
name, cmodel = underscored, name
|
104
89
|
end
|
105
90
|
|
106
|
-
@
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
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
|
101
|
+
def property name, data = :_undefined, &block
|
118
102
|
if block_given?
|
119
103
|
hash_data = {}
|
120
|
-
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
|
-
@
|
110
|
+
@json[name] = data unless data.nil?
|
127
111
|
end
|
128
112
|
alias :prop :property
|
129
113
|
|
130
|
-
|
131
|
-
|
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
|
-
|
145
|
-
|
146
|
-
|
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
|
153
|
-
|
154
|
-
|
155
|
-
|
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(
|
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(
|
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
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.
|
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
|
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.
|
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: []
|