api-exporter 0.2.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.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/.version +1 -0
  3. data/lib/api-exporter.rb +109 -0
  4. metadata +58 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ede5eb3bb7c20ed8a8f56154fd68ab9a8ab41be64db10f5a0ea6a3f2294bb5fb
4
+ data.tar.gz: e72bd6bf2688a14b25168ac21bb2a60cafe81869d3a7af6eb7816b7c41e710b3
5
+ SHA512:
6
+ metadata.gz: e5a8e4ce1dc6a321a5768f6a74ca79d4c45b134e0ba8dbd19b7950d401e44a27d7d046e6be1de5c010320d8efa145f6291458c9fa95acd70e1939c5b864fed06
7
+ data.tar.gz: b42766d8ac1c372115e70419e82016822f2e8fa39af17336a6e7361de3e0c31ffa709cefdfa519f3d58a696076ba279ae4155cc1ae12a7e22965e1698cfc927b
@@ -0,0 +1 @@
1
+ 0.2.0
@@ -0,0 +1,109 @@
1
+ require 'hash_wia'
2
+
3
+ class ApiExporter
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, 'ApiExporter 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 ApiExporter 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] = ApiExporter.export(cmodel, @opts)
73
+ end
74
+
75
+ # add property to exporter
76
+ def property name, data=:_undefined
77
+ if block_given?
78
+ data = yield
79
+ elsif data == :_undefined
80
+ data = @model.send(name)
81
+ end
82
+
83
+ @response[name] = data unless data.nil?
84
+ end
85
+ alias :prop :property
86
+
87
+ # copy calls from lesser version of the same exporter
88
+ def copy version=nil
89
+ version ||= @opts[:version] - 1
90
+ exporter = _find_exporter version
91
+ instance_exec &exporter
92
+ end
93
+
94
+ # finds versioned exporter
95
+ def _find_exporter version=nil
96
+ version ||= @version
97
+ exporter = @opts.delete(:exporter) || model.class
98
+ @exporter = exporter.to_s.classify
99
+
100
+ for num in version.downto(1).to_a
101
+ if block = EXPORTERS.dig(num, @exporter)
102
+ return block
103
+ end
104
+ end
105
+
106
+ raise('Exporter "%s" (:%s) not found' % [exporter, exporter.underscore])
107
+ end
108
+ end
109
+
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: api-exporter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Dino Reic
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-08-02 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: API exporter that is easy to understand, extend and use.
28
+ email: reic.dino@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - "./.version"
34
+ - "./lib/api-exporter.rb"
35
+ homepage: https://github.com/dux/api-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 and intuitive api exporter
58
+ test_files: []