jat 0.0.8 → 0.0.9

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: c266d5784440b62adbb20bb09902f0134ad5e6a06245974f9b15a0557733528d
4
- data.tar.gz: 989344e5918b193a2db72a863337c7209aa34ee9e1b28b7bf68f8bd9a9749b9d
3
+ metadata.gz: 0b59dbef3044d5b23c7b8178e23f931458b3acb5ced78b3750c5f1d7bb8ea01e
4
+ data.tar.gz: 7ebf0b1ec19a10872b8e659bd3ab9cd45a5859ace34f87c65070a83af713a2fd
5
5
  SHA512:
6
- metadata.gz: eba6f92cd51c734ef0583447b2300971fd4707e0e79cece169858d6551e75fba688ce6155dae9317184d423b519e1398d8f583b643174cf4d4450700d73bf3c9
7
- data.tar.gz: bf14496368b37ec614f0f79b76c217df8c60a8401a54d48e30925fad6c7501fdba7533758b9b5bde24035b645aae2c204b9fc05740282a4ff23ce5e80968e529
6
+ metadata.gz: e7e4b943c4b6452937d2c025f47bc1e3e4484151748139682ad03724fa3bc5138f02c23400426ceb3fb6c948112dd91015c1beddfd4da2ee3a1cd3187e0a5d5c
7
+ data.tar.gz: de404f4d77ca9b68a50834b4e435f303f1ace3f66bb976ffa154e4159b01888fa27301795192c967a7cc3b2577c35a10012135521f7e91e9037833d7098f7816
@@ -103,11 +103,10 @@ class Jat
103
103
  end
104
104
 
105
105
  def attribute_exposed?(attribute)
106
- case exposed
107
- when :all then true
108
- when :none then false
109
- else attribute.exposed?
110
- end
106
+ return true if exposed == :all
107
+ return false if exposed == :none
108
+
109
+ attribute.exposed?
111
110
  end
112
111
  end
113
112
 
@@ -22,9 +22,7 @@ class Jat
22
22
  allowed_relationships = jat_class.attributes.each_value.select(&:relation?).map!(&:name)
23
23
  allowed_relationships = "'#{allowed_relationships.join("', '")}'"
24
24
 
25
- raise JsonApiParamsError,
26
- "Type '#{type}' has no included '#{name}' relationship. " \
27
- "Existing relationships are: #{allowed_relationships}"
25
+ raise JsonApiParamsError, "Type '#{type}' has no included '#{name}' relationship. Existing relationships are: #{allowed_relationships}"
28
26
  end
29
27
  end
30
28
  end
@@ -18,7 +18,7 @@ class Jat
18
18
  def parse(fields)
19
19
  return FROZEN_EMPTY_HASH unless fields
20
20
 
21
- new(fields).parse
21
+ new.parse(fields)
22
22
  end
23
23
  end
24
24
 
@@ -27,65 +27,49 @@ class Jat
27
27
  OPEN_BRACKET = "("
28
28
  CLOSE_BRACKET = ")"
29
29
 
30
- def initialize(fields)
31
- @fields = fields
32
- end
33
-
34
30
  # user => { user: {} }
35
31
  # user(id) => { user: { id: {} } }
36
32
  # user(id,name) => { user: { id: {}, name: {} } }
37
33
  # user,comments => { user: {}, comments: {} }
38
34
  # user(comments(text)) => { user: { comments: { text: {} } } }
39
- def parse
40
- current_attr = nil
35
+ def parse(fields)
36
+ res = {}
37
+ attribute = +""
38
+ path_stack = nil
41
39
 
42
40
  fields.each_char do |char|
43
41
  case char
44
42
  when COMMA
45
- next unless current_attr
46
-
47
- add_attribute(current_attr)
48
- current_attr = nil
43
+ add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
49
44
  when CLOSE_BRACKET
50
- if current_attr
51
- add_attribute(current_attr)
52
- current_attr = nil
53
- end
54
-
55
- route.pop
45
+ add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
46
+ path_stack&.pop
56
47
  when OPEN_BRACKET
57
- next unless current_attr
58
-
59
- attribute_name = add_attribute(current_attr, {})
60
- route << attribute_name
61
- current_attr = nil
48
+ name = add_attribute(res, path_stack, attribute, {})
49
+ (path_stack ||= []).push(name) if name
62
50
  else
63
- current_attr = current_attr ? current_attr.insert(-1, char) : char
51
+ attribute.insert(-1, char)
64
52
  end
65
53
  end
66
54
 
67
- add_attribute(current_attr) if current_attr
55
+ add_attribute(res, path_stack, attribute, FROZEN_EMPTY_HASH)
68
56
 
69
57
  res
70
58
  end
71
59
 
72
60
  private
73
61
 
74
- attr_reader :fields
62
+ def add_attribute(res, path_stack, attribute, nested_attributes = FROZEN_EMPTY_HASH)
63
+ attribute.strip!
64
+ return if attribute.empty?
75
65
 
76
- def add_attribute(current_attr, nested_attrs = FROZEN_EMPTY_HASH)
77
- current_resource = route.empty? ? res : res.dig(*route)
78
- attribute_name = current_attr.strip.to_sym
79
- current_resource[attribute_name] = nested_attrs
80
- attribute_name
81
- end
66
+ name = attribute.to_sym
67
+ attribute.clear
82
68
 
83
- def res
84
- @res ||= {}
85
- end
69
+ current_attrs = !path_stack || path_stack.empty? ? res : res.dig(*path_stack)
70
+ current_attrs[name] = nested_attributes
86
71
 
87
- def route
88
- @route ||= []
72
+ name
89
73
  end
90
74
  end
91
75
 
@@ -74,11 +74,10 @@ class Jat
74
74
  private
75
75
 
76
76
  def expose?(attribute, fields)
77
- case exposed
78
- when :all then true
79
- when :none then manually_exposed?(attribute, fields)
80
- else attribute.exposed? || manually_exposed?(attribute, fields)
81
- end
77
+ return true if exposed == :all
78
+ return manually_exposed?(attribute, fields) if exposed == :none
79
+
80
+ attribute.exposed? || manually_exposed?(attribute, fields)
82
81
  end
83
82
 
84
83
  def manually_exposed?(attribute, fields)
@@ -38,7 +38,7 @@ class Jat
38
38
  end
39
39
 
40
40
  module FieldsParamParserMethods
41
- def parse
41
+ def parse(*)
42
42
  super.tap { |result| ValidateFieldsParam.call(self.class.jat_class, result) }
43
43
  end
44
44
  end
@@ -40,9 +40,10 @@ class Jat
40
40
  value = original_block.call(object, context)
41
41
 
42
42
  # Type conversion
43
- case type
44
- when Symbol then self.class.jat_class.config.fetch(:types).fetch(type).call(value)
45
- else type.call(value)
43
+ if type.is_a?(Symbol)
44
+ self.class.jat_class.config.fetch(:types).fetch(type).call(value)
45
+ else
46
+ type.call(value)
46
47
  end
47
48
  end
48
49
  end
data/lib/jat/plugins.rb CHANGED
@@ -25,11 +25,12 @@ class Jat
25
25
  begin
26
26
  require_plugin(name)
27
27
  rescue PluginLoadError
28
- if name.start_with?("json_api")
28
+ name_str = name.to_s
29
+ if name_str.start_with?("json_api")
29
30
  require_plugin(name, "/json_api/plugins")
30
- elsif name.start_with?("simple_api")
31
+ elsif name_str.start_with?("simple_api")
31
32
  require_plugin(name, "/simple_api/plugins")
32
- elsif name.start_with?("base")
33
+ elsif name_str.start_with?("base")
33
34
  require_plugin(name, "/base")
34
35
  else
35
36
  raise
@@ -3,8 +3,6 @@
3
3
  require "test_helper"
4
4
 
5
5
  describe "Jat::Plugins::JsonApi::Params::Include" do
6
- before { Jat::Plugins.find_plugin(:json_api) }
7
-
8
6
  let(:base_class) { Class.new(Jat) { plugin :json_api } }
9
7
  let(:a_serializer) { Class.new(base_class) }
10
8
  let(:b_serializer) { Class.new(base_class) }
@@ -76,7 +76,6 @@ describe "Jat::Plugins::JsonApi::Response" do
76
76
  it "does not return has-one relationship when not exposed" do
77
77
  int_serializer = Class.new(base_class) do
78
78
  type "int"
79
- id { |obj| obj }
80
79
  end
81
80
 
82
81
  str_serializer = Class.new(base_class) do
@@ -15,9 +15,6 @@ describe "Jat::Plugins::JsonApiPreloads::Preloads" do
15
15
  let(:email_serializer) { Class.new(base) { type(:email) } }
16
16
 
17
17
  let(:jat_user) { user_serializer.allocate }
18
- let(:jat_profile) { profile_serializer.allocate }
19
- let(:jat_email) { email_serializer.allocate }
20
-
21
18
  let(:described_class) { Jat::Plugins::JsonApiPreloads::Preloads }
22
19
 
23
20
  def define_map(map)
@@ -50,6 +50,10 @@ describe "Jat::Plugins::SimpleApi::FieldsParamParser" do
50
50
  assert_equal({users: {id: {}}}, parse("(users(id))"))
51
51
  end
52
52
 
53
+ it "parses fields started with extra close PAREN" do
54
+ assert_equal({users: {}}, parse(")users)"))
55
+ end
56
+
53
57
  it "parses single resource with multiple fields" do
54
58
  assert_equal({users: {id: {}, name: {}}}, parse("users(id,name)"))
55
59
  end
@@ -132,13 +132,11 @@ describe "Jat::Plugins::SimpleApi::Response" do
132
132
  end
133
133
 
134
134
  it "does not return has-one relationship when not exposed" do
135
- int_serializer = Class.new(base_class) do
136
- attribute(:id) { |obj| obj }
137
- end
135
+ nested_serializer = Class.new(base_class)
138
136
 
139
137
  str_serializer = Class.new(base_class) do
140
138
  attribute(:id) { |obj| obj[0] }
141
- attribute :length, serializer: int_serializer, exposed: false
139
+ attribute :length, serializer: nested_serializer, exposed: false
142
140
  end
143
141
 
144
142
  assert_equal({id: "S"}, str_serializer.to_h("STRING"))
@@ -243,12 +241,12 @@ describe "Jat::Plugins::SimpleApi::Response" do
243
241
  # All fields are not exposed in this serializers,
244
242
  # We will show only attributes provided in `fields` param
245
243
  chr_serializer = Class.new(base_class) do
246
- attribute(:id, exposed: false) { |obj| obj }
244
+ attribute(:id, exposed: false)
247
245
  attribute :next, exposed: false
248
246
  end
249
247
 
250
248
  str_serializer = Class.new(base_class) do
251
- attribute(:id, exposed: false) { |obj| obj }
249
+ attribute(:id, exposed: false)
252
250
  attribute :chars, serializer: chr_serializer, many: true, exposed: false
253
251
  end
254
252
 
@@ -308,14 +306,14 @@ describe "Jat::Plugins::SimpleApi::Response" do
308
306
  it "does not overwrite manually added meta" do
309
307
  str_serializer = Class.new(base_class) do
310
308
  root(:root)
311
- meta(:version) { "1.2.3" }
309
+ meta(:length)
312
310
 
313
311
  attribute(:id) { |obj| obj }
314
312
  end
315
313
 
316
314
  assert_equal(
317
- {root: {id: "1"}, meta: {version: "2.0.0"}},
318
- str_serializer.to_h("1", meta: {version: "2.0.0"})
315
+ {root: {id: "1"}, meta: {length: "33"}},
316
+ str_serializer.to_h("1", meta: {length: "33"})
319
317
  )
320
318
  end
321
319
 
@@ -10,15 +10,10 @@ describe "Jat::Plugins::SimpleApiPreloads::Preloads" do
10
10
  end
11
11
  end
12
12
 
13
+ let(:described_class) { Jat::Plugins::SimpleApiPreloads::Preloads }
13
14
  let(:user_serializer) { Class.new(base) }
14
15
  let(:profile_serializer) { Class.new(base) }
15
- let(:email_serializer) { Class.new(base) }
16
-
17
16
  let(:jat_user) { user_serializer.new }
18
- let(:jat_profile) { profile_serializer.new }
19
- let(:jat_email) { email_serializer.new }
20
-
21
- let(:described_class) { Jat::Plugins::SimpleApiPreloads::Preloads }
22
17
 
23
18
  def define_map(map)
24
19
  user_serializer::Map.expects(:call).returns(map)
@@ -4,7 +4,6 @@ require "test_helper"
4
4
 
5
5
  describe "Jat::Plugins::Types" do
6
6
  let(:struct) { Struct.new(:attr) }
7
- let(:obj) { struct.new(nil) }
8
7
 
9
8
  let(:jat_class) do
10
9
  new_class = Class.new(Jat)
data/test/test_helper.rb CHANGED
@@ -4,7 +4,8 @@
4
4
  # ARGV is not populated when running `ruby -Itest {file}`
5
5
  # ARGV is not populated when running test by `m` gem - `m {file}`
6
6
  # ARGV is not populated when running tests by `m` gem with line number - `m {file}:{line_number}`
7
- if ARGV.any?
7
+ # jruby and truffleruby have bad simplecov support
8
+ if RUBY_ENGINE == "ruby" && ARGV.any?
8
9
  require "simplecov"
9
10
  SimpleCov.start
10
11
  end
@@ -12,6 +13,5 @@ end
12
13
  require "bundler/setup"
13
14
  require "minitest/autorun"
14
15
  require "mocha/minitest"
15
- require "pry-byebug"
16
16
 
17
17
  require_relative "../lib/jat"
metadata CHANGED
@@ -1,113 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Glushkov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-09 00:00:00.000000000 Z
11
+ date: 2022-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '5.14'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '5.14'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: mocha
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.12'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.12'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '13.0'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '13.0'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: simplecov
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '0.21'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '0.21'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: standard
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '1.0'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '1.0'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: activerecord
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '7.0'
89
+ version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '7.0'
97
- - !ruby/object:Gem::Dependency
98
- name: sqlite3
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '1.4'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '1.4'
96
+ version: '0'
111
97
  description: |
112
98
  JAT serializer allows you to generate a JSON response based on the fields requested by the client.
113
99
  Besides, it helps to preload relations to avoid N+1 when used with activerecord.
@@ -239,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
239
225
  - !ruby/object:Gem::Version
240
226
  version: '0'
241
227
  requirements: []
242
- rubygems_version: 3.2.22
228
+ rubygems_version: 3.3.3
243
229
  signing_key:
244
230
  specification_version: 4
245
231
  summary: JSON API TOOLKIT