json-exporter 0.4.1 → 0.4.3

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