json-exporter 0.2.1 → 0.3.0
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.rb +1 -112
- data/lib/json-exporter/base.rb +124 -0
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ea8fbcdeb00712d423e781894943e2a6e2b5eaad29bb227e7e014bd7eb84dbab
|
4
|
+
data.tar.gz: 4217c182ae80640257d5db886bfdaa75583f47ed9de842f4ffe742c7efe63634
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55629be4525d1bc676e6e7f29c09d1f94d10aa91a8845bdcbe00505d8e6613cbe2b10baccc358fecbfc2c4262eaf5ed56bda081e93b088829d945ba4b41194e6
|
7
|
+
data.tar.gz: 9aa6843b5440a0948ecb971dbc3a21dbaabebf6d0296fca20fb01b1858e1ffc21f75f992800924d31157d8b79612b4cf67c514e6802a43729bd6c3fed5f4db3c
|
data/.version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/json-exporter.rb
CHANGED
@@ -1,114 +1,3 @@
|
|
1
1
|
require 'hash_wia'
|
2
2
|
|
3
|
-
|
4
|
-
EXPORTERS ||= {
|
5
|
-
__filter: proc {}
|
6
|
-
}
|
7
|
-
|
8
|
-
attr_accessor :response, :user, :model, :version
|
9
|
-
|
10
|
-
class << self
|
11
|
-
def define name, opts={}, &block
|
12
|
-
version = opts.delete(:version) || opts.delete(:v) || 1
|
13
|
-
EXPORTERS[version] ||= {}
|
14
|
-
EXPORTERS[version][name.to_s.classify] = block
|
15
|
-
end
|
16
|
-
|
17
|
-
def export name, opts={}
|
18
|
-
new(name, opts).render
|
19
|
-
end
|
20
|
-
|
21
|
-
def filter &block
|
22
|
-
EXPORTERS[:__filter] = block
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
###
|
27
|
-
|
28
|
-
def initialize model, opts={}
|
29
|
-
if model.is_a?(String) || model.is_a?(Symbol)
|
30
|
-
raise ArgumentError, 'model argument is not model instance (it is %s)' % model.class
|
31
|
-
end
|
32
|
-
|
33
|
-
unless opts.is_a?(Hash)
|
34
|
-
raise ArgumentError, 'JsonExporter opts is not a hash'
|
35
|
-
end
|
36
|
-
|
37
|
-
opts[:version] ||= opts.delete(:v) || 1
|
38
|
-
opts[:depth] ||= 2 # 2 is default depth
|
39
|
-
opts[:current_depth] ||= 0
|
40
|
-
opts[:current_depth] += 1
|
41
|
-
|
42
|
-
unallowed = opts.keys - %i(user version depth current_depth exporter)
|
43
|
-
raise ArgumentError, 'Unallowed key JsonExporter option found: %s' % unallowed.first if unallowed.first
|
44
|
-
|
45
|
-
@model = model
|
46
|
-
@version = opts[:version]
|
47
|
-
@user = opts[:user]
|
48
|
-
@opts = opts
|
49
|
-
@block = _find_exporter
|
50
|
-
|
51
|
-
@response = {}.to_hwia
|
52
|
-
end
|
53
|
-
|
54
|
-
def render
|
55
|
-
instance_exec &@block
|
56
|
-
instance_exec &EXPORTERS[:__filter]
|
57
|
-
@response
|
58
|
-
end
|
59
|
-
|
60
|
-
private
|
61
|
-
|
62
|
-
# export object
|
63
|
-
def export name
|
64
|
-
return if @opts[:current_depth] > @opts[:depth]
|
65
|
-
|
66
|
-
if name.is_a?(Symbol)
|
67
|
-
name, cmodel = name, @model.send(name)
|
68
|
-
else
|
69
|
-
name, cmodel = name.class.to_s.underscore.to_sym, name
|
70
|
-
end
|
71
|
-
|
72
|
-
@response[name] =
|
73
|
-
if [Array].include?(cmodel.class)
|
74
|
-
cmodel
|
75
|
-
else
|
76
|
-
JsonExporter.export(cmodel, @opts)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
# add property to exporter
|
81
|
-
def property name, data=:_undefined
|
82
|
-
if block_given?
|
83
|
-
data = yield
|
84
|
-
elsif data == :_undefined
|
85
|
-
data = @model.send(name)
|
86
|
-
end
|
87
|
-
|
88
|
-
@response[name] = data unless data.nil?
|
89
|
-
end
|
90
|
-
alias :prop :property
|
91
|
-
|
92
|
-
# copy calls from lesser version of the same exporter
|
93
|
-
def copy version=nil
|
94
|
-
version ||= @opts[:version] - 1
|
95
|
-
exporter = _find_exporter version
|
96
|
-
instance_exec &exporter
|
97
|
-
end
|
98
|
-
|
99
|
-
# finds versioned exporter
|
100
|
-
def _find_exporter version=nil
|
101
|
-
version ||= @version
|
102
|
-
exporter = @opts.delete(:exporter) || model.class
|
103
|
-
@exporter = exporter.to_s.classify
|
104
|
-
|
105
|
-
for num in version.downto(1).to_a
|
106
|
-
if block = EXPORTERS.dig(num, @exporter)
|
107
|
-
return block
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
raise('Exporter "%s" (:%s) not found' % [exporter, exporter.to_s.underscore])
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
3
|
+
require_relative './json-exporter/base'
|
@@ -0,0 +1,124 @@
|
|
1
|
+
class JsonExporter
|
2
|
+
EXPORTERS ||= {}
|
3
|
+
FILTERS ||= {}
|
4
|
+
|
5
|
+
attr_accessor :response, :user, :model, :meta
|
6
|
+
|
7
|
+
class << self
|
8
|
+
def define *args, &block
|
9
|
+
if args.first.is_a?(Hash)
|
10
|
+
name, opts = nil, args[0]
|
11
|
+
else
|
12
|
+
name, opts = args[0], args[1]
|
13
|
+
end
|
14
|
+
|
15
|
+
name = name ? name.to_s.classify : to_s
|
16
|
+
opts ||= {}
|
17
|
+
|
18
|
+
EXPORTERS[name] = block
|
19
|
+
end
|
20
|
+
|
21
|
+
def export name, opts={}
|
22
|
+
new(name, opts).render
|
23
|
+
end
|
24
|
+
|
25
|
+
def filter &block
|
26
|
+
FILTERS[to_s] = block
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
###
|
31
|
+
|
32
|
+
def initialize model, opts={}
|
33
|
+
if model.is_a?(String) || model.is_a?(Symbol)
|
34
|
+
raise ArgumentError, 'model argument is not model instance (it is %s)' % model.class
|
35
|
+
end
|
36
|
+
|
37
|
+
opts[:version] ||= opts.delete(:v) || 1
|
38
|
+
|
39
|
+
if opts.class == Hash
|
40
|
+
opts = opts.to_hwia :version, :user, :depth, :current_depth, :exporter, :meta, :wia, :compact
|
41
|
+
end
|
42
|
+
|
43
|
+
opts.meta ||= {}
|
44
|
+
opts.depth ||= 2 # 2 is default depth
|
45
|
+
opts.current_depth ||= 0
|
46
|
+
opts.current_depth += 1
|
47
|
+
|
48
|
+
@model = model
|
49
|
+
@user = opts[:user]
|
50
|
+
@opts = opts
|
51
|
+
@meta = opts.wia ? opts.meta.to_hwia : opts.meta
|
52
|
+
@block = exporter_find_class
|
53
|
+
@response = opts.wia ? {}.to_hwia : {}
|
54
|
+
end
|
55
|
+
|
56
|
+
def render
|
57
|
+
instance_exec &@block
|
58
|
+
exporter_apply_filters
|
59
|
+
@opts.compact ? @response.compact : @response
|
60
|
+
end
|
61
|
+
|
62
|
+
def version version_num=nil, &block
|
63
|
+
return @opts.version unless version_num
|
64
|
+
|
65
|
+
if block && @opts.version >= version_num
|
66
|
+
instance_exec &block
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
# export object
|
73
|
+
def export name
|
74
|
+
return if @opts[:current_depth] > @opts[:depth]
|
75
|
+
|
76
|
+
if name.is_a?(Symbol)
|
77
|
+
name, cmodel = name, @model.send(name)
|
78
|
+
else
|
79
|
+
name, cmodel = name.class.to_s.underscore.to_sym, name
|
80
|
+
end
|
81
|
+
|
82
|
+
@response[name] =
|
83
|
+
if [Array].include?(cmodel.class)
|
84
|
+
cmodel
|
85
|
+
else
|
86
|
+
JsonExporter.export(cmodel, @opts)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# add property to exporter
|
91
|
+
def property name, data=:_undefined
|
92
|
+
if block_given?
|
93
|
+
data = yield
|
94
|
+
elsif data == :_undefined
|
95
|
+
data = @model.send(name)
|
96
|
+
end
|
97
|
+
|
98
|
+
@response[name] = data unless data.nil?
|
99
|
+
end
|
100
|
+
alias :prop :property
|
101
|
+
|
102
|
+
# finds versioned exporter
|
103
|
+
def exporter_find_class version=nil
|
104
|
+
exporter =
|
105
|
+
if self.class == JsonExporter
|
106
|
+
# JsonExporter.define User do
|
107
|
+
@opts.exporter ? @opts.exporter.to_s.classify : model.class
|
108
|
+
else
|
109
|
+
# class FooExporter< JsonExporter
|
110
|
+
self.class
|
111
|
+
end
|
112
|
+
|
113
|
+
EXPORTERS[exporter.to_s] || raise('Exporter "%s" (:%s) not found' % [exporter, exporter.to_s.underscore])
|
114
|
+
end
|
115
|
+
|
116
|
+
def exporter_apply_filters
|
117
|
+
for klass in self.class.ancestors.reverse.map(&:to_s)
|
118
|
+
if filter = FILTERS[klass]
|
119
|
+
instance_exec(&filter) if filter
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
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.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dino Reic
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hash_wia
|
@@ -32,11 +32,12 @@ extra_rdoc_files: []
|
|
32
32
|
files:
|
33
33
|
- "./.version"
|
34
34
|
- "./lib/json-exporter.rb"
|
35
|
+
- "./lib/json-exporter/base.rb"
|
35
36
|
homepage: https://github.com/dux/json-exporter
|
36
37
|
licenses:
|
37
38
|
- MIT
|
38
39
|
metadata: {}
|
39
|
-
post_install_message:
|
40
|
+
post_install_message:
|
40
41
|
rdoc_options: []
|
41
42
|
require_paths:
|
42
43
|
- lib
|
@@ -52,7 +53,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
52
53
|
version: '0'
|
53
54
|
requirements: []
|
54
55
|
rubygems_version: 3.0.6
|
55
|
-
signing_key:
|
56
|
+
signing_key:
|
56
57
|
specification_version: 4
|
57
58
|
summary: Fast, simple & powerful object exporter
|
58
59
|
test_files: []
|