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.
- checksums.yaml +7 -0
- data/.version +1 -0
- data/lib/api-exporter.rb +109 -0
- metadata +58 -0
checksums.yaml
ADDED
|
@@ -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
|
data/.version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.2.0
|
data/lib/api-exporter.rb
ADDED
|
@@ -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: []
|