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.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/.version +1 -0
  3. data/lib/json-exporter.rb +114 -0
  4. metadata +58 -0
@@ -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
@@ -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: []