praxis 2.0.pre.2 → 2.0.pre.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 +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.
|