json-exporter 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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: []