json-exporter 0.4.1 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b9d5609810d1ae2f487ae88abfa877d3e8d7869c70d0df5b19789c2bd07dace4
4
- data.tar.gz: 50a8f7a7021218443f09678f99d3f55a07603289e6883f981d4fa1b34a306275
3
+ metadata.gz: d75515317d6672ad95a84990587e55f75a5253d3afe8e507ee858a4dd3608c78
4
+ data.tar.gz: 39989ef8d940c0677bf5c0478e0b1cdaa29cd863b7d002ad1dfb12f778eb046e
5
5
  SHA512:
6
- metadata.gz: b1cbc0d34915c213aadd3b8eda4ab6544ff52fc582c2fa99aa912ef42dd74e1e4140081b7266db0d4b64421fbda642363eb8965bc6f4ca49af7af61321f99fd4
7
- data.tar.gz: 92d35bea26dae2efd052bbd65b8697e0f75ba76234f6fd109ceaa2a06927d50a982f81dad9744802e58ef09c0e0918c9900ba5bd43f47d3731adc075016629d5
6
+ metadata.gz: d3db4944bc96fdde608ac516bca887760d83da88479f7080b7a65e0bf23a97565773940b19febce7186dd0725901b3d3acd7b936bf15488e838e2a1119dd700d
7
+ data.tar.gz: 9c8a8e4896cf16309c5ca967be8d7201514ce2ab4f6547ea10e28f98769ebaca0a3cd2d48bfc4a3774070fc8784bb10959809d4c2bec5194afc7559f05cb518b
data/.version CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.4.3
@@ -1,44 +1,42 @@
1
1
  class JsonExporter
2
2
  EXPORTERS ||= {}
3
- FILTERS ||= {b:{}, a:{}}
4
- OPTS ||= {}
3
+ FILTERS ||= {before:{}, after:{}}
4
+ INFLECTOR ||= Dry::Inflector.new
5
5
 
6
6
  class << self
7
- def define *args, &block
8
- if args.first.is_a?(Hash)
9
- name, opts = nil, args[0]
10
- else
11
- name, opts = args[0], args[1]
12
- end
13
-
14
- name = name ? name.to_s.classify : to_s
15
- opts ||= {}
7
+ def define name = nil, &block
8
+ name = name ? "#{INFLECTOR.classify(name)}#{to_s}" : to_s
16
9
 
17
10
  EXPORTERS[name] = block
18
11
  end
19
12
 
20
- def export name, opts={}
21
- new(name, opts).render
13
+ def export name, opts = nil
14
+ new(name, opts || {}).render
22
15
  end
23
16
 
24
17
  def before &block
25
- FILTERS[:b][to_s] = block
18
+ __define_filter :before, &block
26
19
  end
27
20
 
28
21
  def after &block
29
- FILTERS[:a][to_s] = block
22
+ __define_filter :after, &block
30
23
  end
31
24
 
32
- def disable_wia!
33
- OPTS[:wia] = false
25
+ def __define_filter name, &block
26
+ define_method name do
27
+ super() if self.class != JsonExporter
28
+ instance_exec &block
29
+ end
34
30
  end
35
31
  end
36
32
 
37
33
  ###
38
34
 
39
- attr_accessor :response, :model, :opts, :user
35
+ attr_accessor :json, :model, :opts
36
+
37
+ alias :response :json
40
38
 
41
- def initialize model, opts={}
39
+ def initialize model, opts = {}
42
40
  if model.is_a?(String) || model.is_a?(Symbol)
43
41
  raise ArgumentError, 'model argument is not model instance (it is %s)' % model.class
44
42
  end
@@ -47,26 +45,29 @@ class JsonExporter
47
45
  opts[:current_depth] ||= 0
48
46
  opts[:current_depth] += 1
49
47
 
50
- @user = opts[:user]
51
- @model = model
52
- @opts = opts.to_hwia
53
- @block = exporter_find_class
54
- @response = OPTS[:wia] == false ? {} : {}.to_hwia
48
+ @model = model
49
+ @opts = opts.to_hwia
50
+ @block = __find_exporter
51
+ @json = {}
55
52
  end
56
53
 
57
54
  def render
58
- exporter_apply_filters :b
55
+ before
59
56
  instance_exec &@block
60
- exporter_apply_filters :a
57
+ after
61
58
 
62
- @response
59
+ @json
63
60
  end
64
61
 
62
+ def before; end
63
+
64
+ def after; end
65
+
65
66
  private
66
67
 
67
68
  # export object
68
69
  # export :org_users, key: :users
69
- def export name, opts = {}
70
+ def export name, local_opts = {}
70
71
  return if @opts[:current_depth] > @opts[:export_depth]
71
72
 
72
73
  if name.is_a?(Symbol)
@@ -76,61 +77,44 @@ class JsonExporter
76
77
  cmodel = cmodel.all.map { |el| JsonExporter.export(el, @opts.dup) }
77
78
  end
78
79
  else
79
- name, cmodel = name.class.to_s.underscore.to_sym, name
80
+ underscored = INFLECTOR.underscore(name.class.to_s).to_sym
81
+ name, cmodel = underscored, name
80
82
  end
81
83
 
82
- @response[opts[:key] || name] =
83
- if [Array].include?(cmodel.class)
84
- cmodel
85
- elsif cmodel.nil?
86
- nil
87
- else
88
- JsonExporter.export(cmodel, @opts)
89
- end
84
+ @json[name] = if [Array].include?(cmodel.class)
85
+ cmodel
86
+ elsif cmodel.nil?
87
+ nil
88
+ else
89
+ new_opts = local_opts.merge(export_depth: @opts[:export_depth], current_depth: @opts[:current_depth])
90
+ self.class.new(cmodel, new_opts).render
91
+ end
90
92
  end
91
93
 
92
94
  # add property to exporter
93
- def property name, data=:_undefined
95
+ def property name, data = :_undefined, &block
94
96
  if block_given?
95
97
  hash_data = {}
96
- data = yield hash_data
98
+ data = instance_exec hash_data, &block
97
99
  data = hash_data if hash_data.keys.first
98
100
  elsif data == :_undefined
99
101
  data = @model.send(name)
100
102
  end
101
103
 
102
- @response[name] = data unless data.nil?
104
+ @json[name] = data unless data.nil?
103
105
  end
104
106
  alias :prop :property
105
107
 
106
- # finds versioned exporter
107
- def exporter_find_class version=nil
108
- exporter =
109
- if @opts[:exporter]
110
- @opts[:exporter].to_s.classify
111
- elsif self.class == JsonExporter
112
- # JsonExporter.define User do
113
- @opts[:exporter] ? @opts[:exporter].to_s.classify : model.class
114
- else
115
- # class FooExporter< JsonExporter
116
- self.class
117
- end
118
-
119
- EXPORTERS[exporter.to_s] || EXPORTERS[model.class.to_s] || raise('Exporter "%s" (:%s) not found' % [exporter, exporter.to_s.underscore])
120
- end
108
+ def __find_exporter version = nil
109
+ base = INFLECTOR.classify @opts[:exporter] || model.class.to_s
110
+ exporter = self.class.to_s
121
111
 
122
- def exporter_apply_filters kind
123
- for klass in self.class.ancestors.reverse.map(&:to_s)
124
- if filter = FILTERS[kind][klass]
125
- instance_exec(&filter) if filter
126
- end
112
+ self.class.ancestors.map(&:to_s).each do |klass|
113
+ block = EXPORTERS[[base, klass].join] || EXPORTERS[klass]
114
+ return block if block
127
115
  end
128
- end
129
116
 
130
- def merge object
131
- object.each do |k, v|
132
- prop k.to_sym, v
133
- end
117
+ raise(%[Exporter for class "#{base}" not found.])
134
118
  end
135
119
  end
136
120
 
data/lib/json-exporter.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'hash_wia'
2
+ require 'dry-inflector'
2
3
 
3
4
  require_relative './json-exporter/base'
4
5
  require_relative './json-exporter/klass_func'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json-exporter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dino Reic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-16 00:00:00.000000000 Z
11
+ date: 2022-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hash_wia
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-inflector
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: Fast ruby object JSON exporter, easy to use and extend
28
42
  email: reic.dino@gmail.com
29
43
  executables: []
@@ -56,5 +70,5 @@ requirements: []
56
70
  rubygems_version: 3.2.3
57
71
  signing_key:
58
72
  specification_version: 4
59
- summary: Fast, simple & powerful object exporter
73
+ summary: Fast, simple & powerful object exporter to json
60
74
  test_files: []