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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5a70e5a7d517a7206c4eb0b82c004ee44a15b3439aa4cd08e90fd54e9520513c
4
- data.tar.gz: 4ffb3b63175ae577ea981d80cfb3b2307895f1483e9f11061b09263385c79b7e
3
+ metadata.gz: ea8fbcdeb00712d423e781894943e2a6e2b5eaad29bb227e7e014bd7eb84dbab
4
+ data.tar.gz: 4217c182ae80640257d5db886bfdaa75583f47ed9de842f4ffe742c7efe63634
5
5
  SHA512:
6
- metadata.gz: 4fdcd23d3974377ff752b7a4b7406ff3f4b1c65b3f1f0f57dc0c0067bda08620ecab0e37aed7aef9632ab633ddeff60e290a56bb7f17bb04cef32a030ad2c4b6
7
- data.tar.gz: 92c4df477e3bc5ae99938582f9a6ae187bde291c827d7d16d1469dd6b0628f650432b00e101a61eab457a40fce562a228b43a242845e9c9de7eb6836a21267d9
6
+ metadata.gz: 55629be4525d1bc676e6e7f29c09d1f94d10aa91a8845bdcbe00505d8e6613cbe2b10baccc358fecbfc2c4262eaf5ed56bda081e93b088829d945ba4b41194e6
7
+ data.tar.gz: 9aa6843b5440a0948ecb971dbc3a21dbaabebf6d0296fca20fb01b1858e1ffc21f75f992800924d31157d8b79612b4cf67c514e6802a43729bd6c3fed5f4db3c
data/.version CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.3.0
@@ -1,114 +1,3 @@
1
1
  require 'hash_wia'
2
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
-
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.2.1
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-08-31 00:00:00.000000000 Z
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: []