json-exporter 0.2.1 → 0.3.0

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