praxis 2.0.pre.2 → 2.0.pre.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +6 -0
- data/lib/praxis/extensions/field_selection/active_record_query_selector.rb +27 -31
- data/lib/praxis/extensions/field_selection/sequel_query_selector.rb +35 -39
- data/lib/praxis/mapper/active_model_compat.rb +38 -3
- data/lib/praxis/mapper/resource.rb +3 -3
- data/lib/praxis/mapper/selector_generator.rb +98 -75
- data/lib/praxis/mapper/sequel_compat.rb +42 -3
- data/lib/praxis/plugins/mapper_plugin.rb +16 -2
- data/lib/praxis/version.rb +1 -1
- data/praxis.gemspec +3 -0
- data/spec/praxis/extensions/field_selection/active_record_query_selector_spec.rb +106 -0
- data/spec/praxis/extensions/field_selection/sequel_query_selector_spec.rb +147 -0
- data/spec/praxis/extensions/field_selection/support/spec_resources_active_model.rb +130 -0
- data/spec/praxis/extensions/field_selection/support/spec_resources_sequel.rb +106 -0
- data/spec/praxis/mapper/selector_generator_spec.rb +275 -283
- data/spec/spec_helper.rb +11 -0
- data/spec/support/be_deep_equal_matcher.rb +39 -0
- data/spec/support/spec_resources.rb +42 -49
- metadata +37 -4
- data/spec/spec_app/app/models/person.rb +0 -3
data/spec/spec_helper.rb
CHANGED
@@ -23,10 +23,21 @@ Dir["#{File.dirname(__FILE__)}/../lib/praxis/plugins/*.rb"].each do |file|
|
|
23
23
|
require file
|
24
24
|
end
|
25
25
|
|
26
|
+
|
26
27
|
Dir["#{File.dirname(__FILE__)}/support/*.rb"].each do |file|
|
27
28
|
require file
|
28
29
|
end
|
29
30
|
|
31
|
+
def suppress_output
|
32
|
+
original_stdout, original_stderr = $stdout.clone, $stderr.clone
|
33
|
+
$stderr.reopen File.new('/dev/null', 'w')
|
34
|
+
$stdout.reopen File.new('/dev/null', 'w')
|
35
|
+
yield
|
36
|
+
ensure
|
37
|
+
$stdout.reopen original_stdout
|
38
|
+
$stderr.reopen original_stderr
|
39
|
+
end
|
40
|
+
|
30
41
|
RSpec.configure do |config|
|
31
42
|
config.include Rack::Test::Methods
|
32
43
|
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# Copied verbatim from: https://github.com/amogil/rspec-deep-ignore-order-matcher
|
2
|
+
|
3
|
+
RSpec::Matchers.define :be_deep_equal do |expected|
|
4
|
+
match { |actual| match? actual, expected }
|
5
|
+
|
6
|
+
failure_message do |actual|
|
7
|
+
"expected that #{actual} would be deep equal with #{expected}"
|
8
|
+
end
|
9
|
+
|
10
|
+
failure_message_when_negated do |actual|
|
11
|
+
"expected that #{actual} would not be deep equal with #{expected}"
|
12
|
+
end
|
13
|
+
|
14
|
+
description do
|
15
|
+
"be deep equal with #{expected}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def match?(actual, expected)
|
19
|
+
return arrays_match?(actual, expected) if expected.is_a?(Array) && actual.is_a?(Array)
|
20
|
+
return hashes_match?(actual, expected) if expected.is_a?(Hash) && actual.is_a?(Hash)
|
21
|
+
expected == actual
|
22
|
+
end
|
23
|
+
|
24
|
+
def arrays_match?(actual, expected)
|
25
|
+
exp = expected.clone
|
26
|
+
actual.each do |a|
|
27
|
+
index = exp.find_index { |e| match? a, e }
|
28
|
+
return false if index.nil?
|
29
|
+
exp.delete_at(index)
|
30
|
+
end
|
31
|
+
exp.empty?
|
32
|
+
end
|
33
|
+
|
34
|
+
def hashes_match?(actual, expected)
|
35
|
+
return false unless actual.keys.sort == expected.keys.sort
|
36
|
+
actual.each { |key, value| return false unless match? value, expected[key] }
|
37
|
+
true
|
38
|
+
end
|
39
|
+
end
|
@@ -8,12 +8,16 @@ class SimpleModel < OpenStruct
|
|
8
8
|
parent: {
|
9
9
|
model: ParentModel,
|
10
10
|
primary_key: :id,
|
11
|
-
type: :many_to_one
|
11
|
+
type: :many_to_one,
|
12
|
+
local_key_columns: [:parent_id],
|
13
|
+
remote_key_columns: [:id]
|
12
14
|
},
|
13
15
|
other_model: {
|
14
16
|
model: OtherModel,
|
15
17
|
primary_key: :id,
|
16
|
-
type: :many_to_one
|
18
|
+
type: :many_to_one,
|
19
|
+
local_key_columns: [:other_model_id],
|
20
|
+
remote_key_columns: [:id]
|
17
21
|
}
|
18
22
|
}
|
19
23
|
end
|
@@ -23,14 +27,20 @@ class OtherModel < OpenStruct
|
|
23
27
|
include Praxis::Mapper::ActiveModelCompat
|
24
28
|
def self._praxis_associations
|
25
29
|
{
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
parent: {
|
31
|
+
model: ParentModel,
|
32
|
+
primary_key: :id,
|
33
|
+
type: :many_to_one,
|
34
|
+
local_key_columns: [:parent_id],
|
35
|
+
remote_key_columns: [:id]
|
36
|
+
},
|
37
|
+
simple_models: {
|
38
|
+
model: SimpleModel,
|
39
|
+
primary_key: :id,
|
40
|
+
type: :many_to_many,
|
41
|
+
local_key_columns: [:id],
|
42
|
+
remote_key_columns: [:id] # The through table is in the middle where the FKs are...
|
43
|
+
}
|
34
44
|
}
|
35
45
|
end
|
36
46
|
end
|
@@ -39,6 +49,13 @@ class ParentModel < OpenStruct
|
|
39
49
|
include Praxis::Mapper::ActiveModelCompat
|
40
50
|
def self._praxis_associations
|
41
51
|
{
|
52
|
+
simple_children: {
|
53
|
+
model: SimpleModel,
|
54
|
+
primary_key: :id,
|
55
|
+
type: :one_to_many,
|
56
|
+
local_key_columns: [:id],
|
57
|
+
remote_key_columns: [:parent_id]
|
58
|
+
}
|
42
59
|
}
|
43
60
|
end
|
44
61
|
end
|
@@ -50,7 +67,9 @@ class YamlArrayModel < OpenStruct
|
|
50
67
|
parents: {
|
51
68
|
model: ParentModel,
|
52
69
|
primary_key: :id,
|
53
|
-
type: :one_to_many
|
70
|
+
type: :one_to_many,
|
71
|
+
local_key_columns: [:id],
|
72
|
+
remote_key_columns: [:parent_id]
|
54
73
|
}
|
55
74
|
}
|
56
75
|
end
|
@@ -66,12 +85,10 @@ class BaseResource < Praxis::Mapper::Resource
|
|
66
85
|
property :href, dependencies: [:id]
|
67
86
|
end
|
68
87
|
|
69
|
-
# class CompositeIdResource < BaseResource
|
70
|
-
# model CompositeIdModel
|
71
|
-
# end
|
72
|
-
|
73
88
|
class OtherResource < BaseResource
|
74
89
|
model OtherModel
|
90
|
+
|
91
|
+
property :display_name, dependencies: [:name]
|
75
92
|
end
|
76
93
|
|
77
94
|
class ParentResource < BaseResource
|
@@ -87,45 +104,21 @@ class SimpleResource < BaseResource
|
|
87
104
|
self.other_model
|
88
105
|
end
|
89
106
|
|
107
|
+
property :aliased_method, dependencies: [:column1, :other_model]
|
90
108
|
property :other_resource, dependencies: [:other_model]
|
91
109
|
|
110
|
+
property :parent, dependencies: [:parent, :added_column]
|
111
|
+
|
92
112
|
property :name, dependencies: [:simple_name]
|
93
|
-
|
113
|
+
property :direct_other_name, dependencies: [ 'other_model.name' ]
|
114
|
+
property :aliased_other_name, dependencies: [ 'other_model.display_name' ]
|
94
115
|
|
95
|
-
|
96
|
-
|
97
|
-
|
116
|
+
property :everything, dependencies: [:*]
|
117
|
+
property :everything_from_parent, dependencies: ['parent.*']
|
118
|
+
property :circular_dep, dependencies: [ :circular_dep, :column1 ]
|
119
|
+
property :no_deps, dependencies: []
|
120
|
+
end
|
98
121
|
|
99
122
|
class YamlArrayResource < BaseResource
|
100
123
|
model YamlArrayModel
|
101
124
|
end
|
102
|
-
|
103
|
-
class PersonResource < BaseResource
|
104
|
-
model PersonModel
|
105
|
-
|
106
|
-
def href
|
107
|
-
"/people/#{self.id}"
|
108
|
-
end
|
109
|
-
|
110
|
-
end
|
111
|
-
|
112
|
-
# class AddressResource < BaseResource
|
113
|
-
# model AddressModel
|
114
|
-
|
115
|
-
|
116
|
-
# def href
|
117
|
-
# "/addresses/#{self.id}"
|
118
|
-
# end
|
119
|
-
# property :href, dependencies: [:id]
|
120
|
-
|
121
|
-
# def owner_name
|
122
|
-
# self.owner.name
|
123
|
-
# end
|
124
|
-
# property :owner_name, dependencies: ['owner.name']
|
125
|
-
|
126
|
-
# def resident_count
|
127
|
-
# self.residents.size
|
128
|
-
# end
|
129
|
-
# property :resident_count, dependencies: [:residents]
|
130
|
-
|
131
|
-
# end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: praxis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.pre.
|
4
|
+
version: 2.0.pre.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josep M. Blanquer
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-
|
12
|
+
date: 2020-07-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -381,6 +381,34 @@ dependencies:
|
|
381
381
|
- - ">="
|
382
382
|
- !ruby/object:Gem::Version
|
383
383
|
version: '0'
|
384
|
+
- !ruby/object:Gem::Dependency
|
385
|
+
name: sequel
|
386
|
+
requirement: !ruby/object:Gem::Requirement
|
387
|
+
requirements:
|
388
|
+
- - "~>"
|
389
|
+
- !ruby/object:Gem::Version
|
390
|
+
version: '5'
|
391
|
+
type: :development
|
392
|
+
prerelease: false
|
393
|
+
version_requirements: !ruby/object:Gem::Requirement
|
394
|
+
requirements:
|
395
|
+
- - "~>"
|
396
|
+
- !ruby/object:Gem::Version
|
397
|
+
version: '5'
|
398
|
+
- !ruby/object:Gem::Dependency
|
399
|
+
name: activerecord
|
400
|
+
requirement: !ruby/object:Gem::Requirement
|
401
|
+
requirements:
|
402
|
+
- - ">"
|
403
|
+
- !ruby/object:Gem::Version
|
404
|
+
version: '4'
|
405
|
+
type: :development
|
406
|
+
prerelease: false
|
407
|
+
version_requirements: !ruby/object:Gem::Requirement
|
408
|
+
requirements:
|
409
|
+
- - ">"
|
410
|
+
- !ruby/object:Gem::Version
|
411
|
+
version: '4'
|
384
412
|
description:
|
385
413
|
email:
|
386
414
|
- blanquer@gmail.com
|
@@ -610,7 +638,11 @@ files:
|
|
610
638
|
- spec/praxis/controller_spec.rb
|
611
639
|
- spec/praxis/dispatcher_spec.rb
|
612
640
|
- spec/praxis/extensions/field_expansion_spec.rb
|
641
|
+
- spec/praxis/extensions/field_selection/active_record_query_selector_spec.rb
|
613
642
|
- spec/praxis/extensions/field_selection/field_selector_spec.rb
|
643
|
+
- spec/praxis/extensions/field_selection/sequel_query_selector_spec.rb
|
644
|
+
- spec/praxis/extensions/field_selection/support/spec_resources_active_model.rb
|
645
|
+
- spec/praxis/extensions/field_selection/support/spec_resources_sequel.rb
|
614
646
|
- spec/praxis/extensions/rendering_spec.rb
|
615
647
|
- spec/praxis/file_group_spec.rb
|
616
648
|
- spec/praxis/handlers/json_spec.rb
|
@@ -648,7 +680,6 @@ files:
|
|
648
680
|
- spec/spec_app/app/controllers/base_class.rb
|
649
681
|
- spec/spec_app/app/controllers/instances.rb
|
650
682
|
- spec/spec_app/app/controllers/volumes.rb
|
651
|
-
- spec/spec_app/app/models/person.rb
|
652
683
|
- spec/spec_app/app/responses/bulk_response.rb
|
653
684
|
- spec/spec_app/app/responses/multipart.rb
|
654
685
|
- spec/spec_app/app/responses/other_response.rb
|
@@ -670,6 +701,7 @@ files:
|
|
670
701
|
- spec/spec_app/design/resources/volume_snapshots.rb
|
671
702
|
- spec/spec_app/design/resources/volumes.rb
|
672
703
|
- spec/spec_helper.rb
|
704
|
+
- spec/support/be_deep_equal_matcher.rb
|
673
705
|
- spec/support/spec_authorization_plugin.rb
|
674
706
|
- spec/support/spec_complex_authentication_plugin.rb
|
675
707
|
- spec/support/spec_media_types.rb
|
@@ -723,7 +755,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
723
755
|
- !ruby/object:Gem::Version
|
724
756
|
version: 1.3.1
|
725
757
|
requirements: []
|
726
|
-
|
758
|
+
rubyforge_project:
|
759
|
+
rubygems_version: 2.6.14
|
727
760
|
signing_key:
|
728
761
|
specification_version: 4
|
729
762
|
summary: Building APIs the way you want it.
|