api-exporter 0.2.0

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