json-exporter 0.2.1
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 +7 -0
- data/.version +1 -0
- data/lib/json-exporter.rb +114 -0
- metadata +58 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 5a70e5a7d517a7206c4eb0b82c004ee44a15b3439aa4cd08e90fd54e9520513c
|
4
|
+
data.tar.gz: 4ffb3b63175ae577ea981d80cfb3b2307895f1483e9f11061b09263385c79b7e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4fdcd23d3974377ff752b7a4b7406ff3f4b1c65b3f1f0f57dc0c0067bda08620ecab0e37aed7aef9632ab633ddeff60e290a56bb7f17bb04cef32a030ad2c4b6
|
7
|
+
data.tar.gz: 92c4df477e3bc5ae99938582f9a6ae187bde291c827d7d16d1469dd6b0628f650432b00e101a61eab457a40fce562a228b43a242845e9c9de7eb6836a21267d9
|
data/.version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.1
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require 'hash_wia'
|
2
|
+
|
3
|
+
class JsonExporter
|
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
|
+
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: json-exporter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dino Reic
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-08-31 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: hash_wia
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: Fast ruby object JSON exporter, easy to use and extend
|
28
|
+
email: reic.dino@gmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- "./.version"
|
34
|
+
- "./lib/json-exporter.rb"
|
35
|
+
homepage: https://github.com/dux/json-exporter
|
36
|
+
licenses:
|
37
|
+
- MIT
|
38
|
+
metadata: {}
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubygems_version: 3.0.6
|
55
|
+
signing_key:
|
56
|
+
specification_version: 4
|
57
|
+
summary: Fast, simple & powerful object exporter
|
58
|
+
test_files: []
|