ree_lib 1.0.39 → 1.0.40
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -1
- data/lib/ree_lib/.vscode-ree/templates/spec_template.rb +1 -1
- data/lib/ree_lib/Packages.schema.json +4 -0
- data/lib/ree_lib/packages/.vscode-ree/templates/spec_template.rb +1 -1
- data/lib/ree_lib/packages/ree_actions/package/ree_actions/dsl.rb +28 -70
- data/lib/ree_lib/packages/ree_actions/package/ree_actions.rb +1 -2
- data/lib/ree_lib/packages/ree_actions/spec/ree_actions/dsl_spec.rb +34 -65
- data/lib/ree_lib/packages/ree_array/spec/ree_array/functions/group_by_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_array/spec/ree_array/functions/index_by_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_array.rb +53 -0
- data/lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_jsonb.rb +73 -0
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_sqlite_connection_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/one_to_many_spec.rb +2 -2
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/one_to_one_spec.rb +2 -2
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/persist_assoc_spec.rb +2 -2
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/wrappers/pg_array_spec.rb +64 -0
- data/lib/ree_lib/packages/ree_dao/spec/ree_dao/wrappers/pg_jsonb_spec.rb +94 -0
- data/lib/ree_lib/packages/ree_datetime/spec/ree_datetime/functions/in_default_time_zone_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_dto/spec/ree_dto/entity_dsl_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_hash/spec/ree_hash/functions/transform_values_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_json/spec/ree_json/functions/from_json_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_json/spec/ree_json/functions/to_json_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_logger/spec/ree_logger/appenders/appender_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_logger/spec/ree_logger/appenders/file_appender_spec.rb +3 -3
- data/lib/ree_lib/packages/ree_logger/spec/ree_logger/appenders/rollbar_appender_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_logger/spec/ree_logger/appenders/stdout_appender_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_logger/spec/ree_logger/beans/logger_spec.rb +2 -2
- data/lib/ree_lib/packages/ree_logger/spec/ree_logger/formatters/colorized_formatter_spec.rb +10 -7
- data/lib/ree_lib/packages/ree_logger/spec/ree_logger/formatters/default_formatter_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_logger/spec/ree_logger/formatters/formatter_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_logger/spec/ree_logger/multi_logger_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_migrator/spec/ree_migrator/functions/apply_migration_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_migrator/spec/ree_migrator/functions/apply_migrations_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_migrator/spec/ree_migrator/functions/migrate_db_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/deep_dup_spec.rb +2 -2
- data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/deep_freeze_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/dump_as_json_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/is_blank_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/not_blank_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/to_hash_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/to_obj_spec.rb +8 -8
- data/lib/ree_lib/packages/ree_roda/Package.schema.json +14 -7
- data/lib/ree_lib/packages/ree_roda/package/ree_roda/plugins/ree_routes.rb +231 -0
- data/lib/ree_lib/packages/ree_roda/package/ree_roda/services/{build_action_errors.rb → build_route_errors.rb} +5 -5
- data/lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_routing_tree.rb +144 -0
- data/lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_swagger_from_routes.rb +54 -0
- data/lib/ree_lib/packages/ree_roda/package/ree_roda.rb +2 -2
- data/lib/ree_lib/packages/ree_roda/schemas/ree_roda/services/{build_action_errors.schema.json → build_route_errors.schema.json} +5 -5
- data/lib/ree_lib/packages/ree_roda/schemas/ree_roda/services/build_routing_tree.schema.json +28 -0
- data/lib/ree_lib/packages/ree_roda/schemas/ree_roda/services/{build_swagger_from_actions.schema.json → build_swagger_from_routes.schema.json} +7 -7
- data/lib/ree_lib/packages/ree_roda/spec/ree_roda/app_spec.rb +141 -7
- data/lib/ree_lib/packages/ree_roda/spec/ree_roda/services/build_routing_tree_spec.rb +261 -0
- data/lib/ree_lib/packages/ree_routes/.gitignore +0 -0
- data/lib/ree_lib/packages/ree_routes/.rspec +2 -0
- data/lib/ree_lib/packages/ree_routes/Package.schema.json +20 -0
- data/lib/ree_lib/packages/ree_routes/bin/console +5 -0
- data/lib/ree_lib/packages/ree_routes/package/ree_routes/dsl.rb +102 -0
- data/lib/ree_lib/packages/ree_routes/package/ree_routes/route.rb +10 -0
- data/lib/ree_lib/packages/{ree_actions/package/ree_actions/action_builder.rb → ree_routes/package/ree_routes/route_builder.rb} +15 -15
- data/lib/ree_lib/packages/ree_routes/package/ree_routes.rb +9 -0
- data/lib/ree_lib/packages/ree_routes/spec/package_schema_spec.rb +14 -0
- data/lib/ree_lib/packages/ree_routes/spec/ree_routes/dsl_spec.rb +93 -0
- data/lib/ree_lib/packages/ree_routes/spec/spec_helper.rb +3 -0
- data/lib/ree_lib/packages/ree_text/spec/ree_text/functions/safe_join_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_text/spec/ree_text/functions/to_sentence_spec.rb +1 -1
- data/lib/ree_lib/packages/ree_validator/spec/ree_validator/functions/validate_password_spec.rb +1 -1
- data/lib/ree_lib/version.rb +1 -1
- metadata +39 -11
- data/lib/ree_lib/packages/ree_actions/package/ree_actions/action.rb +0 -10
- data/lib/ree_lib/packages/ree_actions/package/ree_actions/action_dsl.rb +0 -60
- data/lib/ree_lib/packages/ree_actions/spec/ree_actions/action_dsl_spec.rb +0 -62
- data/lib/ree_lib/packages/ree_roda/package/ree_roda/plugins/ree_actions.rb +0 -150
- data/lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_swagger_from_actions.rb +0 -55
@@ -0,0 +1,261 @@
|
|
1
|
+
# frozen_string_literal = true
|
2
|
+
|
3
|
+
RSpec.describe :build_routing_tree do
|
4
|
+
link :build_routing_tree, from: :ree_roda
|
5
|
+
link :except, from: :ree_hash
|
6
|
+
link :is_blank, from: :ree_object
|
7
|
+
link :not_blank, from: :ree_object
|
8
|
+
link :to_hash, from: :ree_object
|
9
|
+
|
10
|
+
before :all do
|
11
|
+
Ree.enable_irb_mode
|
12
|
+
|
13
|
+
module ReeRodaTestTree
|
14
|
+
include Ree::PackageDSL
|
15
|
+
|
16
|
+
package
|
17
|
+
end
|
18
|
+
|
19
|
+
class ReeRodaTestTree::Cmd
|
20
|
+
include ReeActions::DSL
|
21
|
+
|
22
|
+
action :cmd
|
23
|
+
|
24
|
+
ActionCaster = build_mapper.use(:cast) do
|
25
|
+
integer :id
|
26
|
+
integer? :task_id
|
27
|
+
end
|
28
|
+
|
29
|
+
def call(access, attrs)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class ReeRodaTestTree::TestRoutes
|
34
|
+
include ReeRoutes::DSL
|
35
|
+
|
36
|
+
routes :test_routes do
|
37
|
+
default_warden_scope :identity
|
38
|
+
opts = { from: :ree_roda_test_tree }
|
39
|
+
|
40
|
+
get "api/actions/:id" do
|
41
|
+
summary "Some action"
|
42
|
+
warden_scope :visitor
|
43
|
+
sections "some_action"
|
44
|
+
action :cmd, **opts
|
45
|
+
end
|
46
|
+
|
47
|
+
post "api/actions" do
|
48
|
+
summary "Some action"
|
49
|
+
action :cmd, **opts
|
50
|
+
end
|
51
|
+
|
52
|
+
delete "api/actions/:id" do
|
53
|
+
summary "Some action"
|
54
|
+
action :cmd, **opts
|
55
|
+
end
|
56
|
+
|
57
|
+
get "api/actions/:id/types" do
|
58
|
+
summary "Some action"
|
59
|
+
action :cmd, **opts
|
60
|
+
end
|
61
|
+
|
62
|
+
post "api/actions/:id/types" do
|
63
|
+
summary "Some action"
|
64
|
+
action :cmd, **opts
|
65
|
+
end
|
66
|
+
|
67
|
+
get "api/tasks" do
|
68
|
+
summary "Some action"
|
69
|
+
action :cmd, **opts
|
70
|
+
end
|
71
|
+
|
72
|
+
get "api/tasks/:id" do
|
73
|
+
summary "Some action"
|
74
|
+
action :cmd, **opts
|
75
|
+
end
|
76
|
+
|
77
|
+
delete "api/tasks/:task_id" do
|
78
|
+
summary "Some action"
|
79
|
+
action :cmd, **opts
|
80
|
+
end
|
81
|
+
|
82
|
+
get "api/tasks/:id/types" do
|
83
|
+
summary "Some action"
|
84
|
+
action :cmd, **opts
|
85
|
+
end
|
86
|
+
|
87
|
+
get "api/users/:id" do
|
88
|
+
summary "Some action"
|
89
|
+
action :cmd, **opts
|
90
|
+
end
|
91
|
+
|
92
|
+
get "api/users/collection/:id" do
|
93
|
+
summary "Some action"
|
94
|
+
action :cmd, **opts
|
95
|
+
end
|
96
|
+
|
97
|
+
get "api/users/collection/:id/info" do
|
98
|
+
summary "Some action"
|
99
|
+
action :cmd, **opts
|
100
|
+
end
|
101
|
+
|
102
|
+
get "api/accounts" do
|
103
|
+
summary "Some action"
|
104
|
+
action :cmd, **opts
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
class TestTreeApp < ReeRoda::App
|
110
|
+
plugin :ree_routes
|
111
|
+
|
112
|
+
ree_routes ReeRodaTestTree::TestRoutes.new
|
113
|
+
|
114
|
+
route do |r|
|
115
|
+
r.get "health" do
|
116
|
+
"success"
|
117
|
+
end
|
118
|
+
|
119
|
+
r.ree_routes
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
after :all do
|
125
|
+
Ree.disable_irb_mode
|
126
|
+
end
|
127
|
+
|
128
|
+
let(:routes) { TestTreeApp.instance_variable_get(:@ree_routes) }
|
129
|
+
|
130
|
+
let(:hsh_tree) {
|
131
|
+
{
|
132
|
+
value: "api",
|
133
|
+
depth: 0,
|
134
|
+
parent: nil,
|
135
|
+
type: :string,
|
136
|
+
children: [
|
137
|
+
{
|
138
|
+
value: "actions",
|
139
|
+
depth: 1,
|
140
|
+
parent: "api",
|
141
|
+
type: :string,
|
142
|
+
children: [
|
143
|
+
{
|
144
|
+
value: ":id",
|
145
|
+
depth: 2,
|
146
|
+
parent: "actions",
|
147
|
+
type: :param,
|
148
|
+
children: [
|
149
|
+
{
|
150
|
+
value: "types",
|
151
|
+
depth: 3,
|
152
|
+
parent: ":id",
|
153
|
+
type: :string,
|
154
|
+
children: []
|
155
|
+
}
|
156
|
+
]
|
157
|
+
}
|
158
|
+
]
|
159
|
+
},
|
160
|
+
{
|
161
|
+
value: "tasks",
|
162
|
+
depth: 1,
|
163
|
+
parent: "api",
|
164
|
+
type: :string,
|
165
|
+
children: [
|
166
|
+
{
|
167
|
+
value: ":id",
|
168
|
+
depth: 2,
|
169
|
+
parent: "tasks",
|
170
|
+
type: :param,
|
171
|
+
children: [
|
172
|
+
{
|
173
|
+
value: "types",
|
174
|
+
depth: 3,
|
175
|
+
parent: ":id",
|
176
|
+
type: :string,
|
177
|
+
children: []
|
178
|
+
}
|
179
|
+
]
|
180
|
+
}
|
181
|
+
]
|
182
|
+
},
|
183
|
+
{
|
184
|
+
value: "users",
|
185
|
+
depth: 1,
|
186
|
+
parent: "api",
|
187
|
+
type: :string,
|
188
|
+
children: [
|
189
|
+
{
|
190
|
+
value: "collection",
|
191
|
+
depth: 2,
|
192
|
+
parent: "users",
|
193
|
+
type: :string,
|
194
|
+
children: [
|
195
|
+
{
|
196
|
+
value: ":id",
|
197
|
+
depth: 3,
|
198
|
+
parent: "collection",
|
199
|
+
type: :param,
|
200
|
+
children: [
|
201
|
+
{
|
202
|
+
value: "info",
|
203
|
+
depth: 4,
|
204
|
+
parent: ":id",
|
205
|
+
type: :string,
|
206
|
+
children: []
|
207
|
+
}
|
208
|
+
]
|
209
|
+
}
|
210
|
+
]
|
211
|
+
},
|
212
|
+
{
|
213
|
+
value: ":id",
|
214
|
+
depth: 2,
|
215
|
+
parent: "users",
|
216
|
+
type: :param,
|
217
|
+
children: []
|
218
|
+
}
|
219
|
+
]
|
220
|
+
},
|
221
|
+
{
|
222
|
+
value: "accounts",
|
223
|
+
depth: 1,
|
224
|
+
parent: "api",
|
225
|
+
type: :string,
|
226
|
+
children: []
|
227
|
+
}
|
228
|
+
]
|
229
|
+
}
|
230
|
+
}
|
231
|
+
|
232
|
+
it {
|
233
|
+
tree = build_routing_tree(routes)
|
234
|
+
|
235
|
+
# check that all end nodes have routes
|
236
|
+
# and that not end nodes don't have route
|
237
|
+
id_nodes = [*tree.find_by_value(value: ":id", depth: 2), *tree.find_by_value(value: ":id", depth: 4)]
|
238
|
+
types_node = tree.find_by_value(value: "types", depth: 3)
|
239
|
+
actions_node = tree.find_by_value(value: "actions", depth: 1)
|
240
|
+
tasks_node = tree.find_by_value(value: "tasks", depth: 1)
|
241
|
+
|
242
|
+
def count_tree_routes(tree, count = 0)
|
243
|
+
count += tree.routes.count
|
244
|
+
if tree.children.length > 0
|
245
|
+
return tree.children.map do |children|
|
246
|
+
count_tree_routes(children, count)
|
247
|
+
end.sum
|
248
|
+
end
|
249
|
+
return count
|
250
|
+
end
|
251
|
+
|
252
|
+
expect(is_blank(tree.routes)).to eq(true)
|
253
|
+
expect(not_blank(actions_node.routes)).to eq(true)
|
254
|
+
expect(not_blank(tasks_node.routes)).to eq(true)
|
255
|
+
expect(id_nodes.all? { not_blank(_1.routes) }).to eq(true)
|
256
|
+
expect(count_tree_routes(tree)).to eq(13)
|
257
|
+
|
258
|
+
hsh = to_hash(tree)
|
259
|
+
expect(except(hsh, global_except: [:routes])).to eq(hsh_tree)
|
260
|
+
}
|
261
|
+
end
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
{
|
2
|
+
"schema_type": "package",
|
3
|
+
"schema_version": "1.1",
|
4
|
+
"name": "ree_routes",
|
5
|
+
"entry_path": "packages/ree_routes/package/ree_routes.rb",
|
6
|
+
"tags": [
|
7
|
+
"ree_routes"
|
8
|
+
],
|
9
|
+
"depends_on": [
|
10
|
+
{
|
11
|
+
"name": "ree_mapper"
|
12
|
+
}
|
13
|
+
],
|
14
|
+
"env_vars": [
|
15
|
+
|
16
|
+
],
|
17
|
+
"objects": [
|
18
|
+
|
19
|
+
]
|
20
|
+
}
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "route_builder"
|
4
|
+
require "uri"
|
5
|
+
|
6
|
+
module ReeRoutes
|
7
|
+
module DSL
|
8
|
+
def self.included(base)
|
9
|
+
base.extend(ClassMethods)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.extended(base)
|
13
|
+
base.extend(ClassMethods)
|
14
|
+
end
|
15
|
+
|
16
|
+
module FactoryMethod
|
17
|
+
def build
|
18
|
+
self.class.instance_variable_get(:@routes) || []
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module ClassMethods
|
23
|
+
include Ree::Contracts::Core
|
24
|
+
include Ree::Contracts::ArgContracts
|
25
|
+
|
26
|
+
def routes(name, &proc)
|
27
|
+
raise ArgumentError.new("block is required") if !block_given?
|
28
|
+
|
29
|
+
@dsl = Ree::ObjectDsl.new(
|
30
|
+
Ree.container.packages_facade, name, self, :object
|
31
|
+
)
|
32
|
+
|
33
|
+
@dsl.singleton
|
34
|
+
@dsl.factory(:build)
|
35
|
+
@dsl.tags(["routes"])
|
36
|
+
|
37
|
+
instance_exec(&proc)
|
38
|
+
|
39
|
+
klass = @dsl.object.klass
|
40
|
+
klass.send(:include, FactoryMethod)
|
41
|
+
|
42
|
+
|
43
|
+
Ree.container.compile(@dsl.package, name)
|
44
|
+
end
|
45
|
+
|
46
|
+
def default_warden_scope(method_name)
|
47
|
+
@default_warden_scope = method_name
|
48
|
+
end
|
49
|
+
|
50
|
+
[:get, :post, :put, :delete, :patch, :head, :options].each do |request_method|
|
51
|
+
define_method request_method do |path, &proc|
|
52
|
+
define_route(request_method, path, &proc)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
contract Symbol, String, Block => ReeRoutes::Route
|
59
|
+
def define_route(request_method, path, &proc)
|
60
|
+
raise ArgumentError.new("routes should be called") if !@dsl
|
61
|
+
raise ArgumentError.new("block is required") if !block_given?
|
62
|
+
|
63
|
+
@routes ||= []
|
64
|
+
|
65
|
+
builder = ReeRoutes::RouteBuilder.new
|
66
|
+
builder.instance_exec(&proc)
|
67
|
+
|
68
|
+
if @default_warden_scope && !builder.get_route.warden_scope
|
69
|
+
builder.warden_scope(@default_warden_scope)
|
70
|
+
end
|
71
|
+
|
72
|
+
uri = URI.parse(path) rescue nil
|
73
|
+
|
74
|
+
if uri.nil? || uri.path != path
|
75
|
+
raise ArgumentError.new("invalid path provided #{path}")
|
76
|
+
end
|
77
|
+
|
78
|
+
if uri.query && !uri.query.empty?
|
79
|
+
raise ArgumentError.new("route path should not include query params: #{path}")
|
80
|
+
end
|
81
|
+
|
82
|
+
builder.get_route.path = path
|
83
|
+
builder.get_route.request_method = request_method
|
84
|
+
|
85
|
+
if !builder.get_route.valid?
|
86
|
+
raise ArgumentError.new("action, summary and auth scope should be provided for #{builder.get_route.inspect}")
|
87
|
+
end
|
88
|
+
|
89
|
+
route = builder.get_route
|
90
|
+
|
91
|
+
@dsl.link(route.action.name, from: route.action.package_name)
|
92
|
+
|
93
|
+
if route.serializer
|
94
|
+
@dsl.link(route.serializer.name, from: route.serializer.package_name)
|
95
|
+
end
|
96
|
+
|
97
|
+
@routes << route
|
98
|
+
route
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -1,65 +1,65 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "
|
3
|
+
require_relative "route"
|
4
4
|
|
5
|
-
class
|
5
|
+
class ReeRoutes::RouteBuilder
|
6
6
|
Redirect = Struct.new(:path, :code)
|
7
7
|
|
8
8
|
def initialize
|
9
|
-
@
|
10
|
-
@
|
9
|
+
@route = ReeRoutes::Route.new
|
10
|
+
@route.respond_to = :json
|
11
11
|
end
|
12
12
|
|
13
13
|
contract Symbol => Symbol
|
14
14
|
def warden_scope(scope)
|
15
|
-
@
|
15
|
+
@route.warden_scope = scope
|
16
16
|
end
|
17
17
|
|
18
18
|
contract Symbol => Symbol
|
19
19
|
def respond_to(v)
|
20
|
-
@
|
20
|
+
@route.respond_to = v
|
21
21
|
end
|
22
22
|
|
23
|
-
contract None =>
|
24
|
-
def
|
25
|
-
@
|
23
|
+
contract None => ReeRoutes::Route
|
24
|
+
def get_route
|
25
|
+
@route
|
26
26
|
end
|
27
27
|
|
28
28
|
contract Block => nil
|
29
29
|
def before(&proc)
|
30
|
-
@
|
30
|
+
@route.before = proc
|
31
31
|
nil
|
32
32
|
end
|
33
33
|
|
34
34
|
contract String => String
|
35
35
|
def summary(str)
|
36
|
-
@
|
36
|
+
@route.summary = str
|
37
37
|
end
|
38
38
|
|
39
39
|
contract Symbol, Symbol => nil
|
40
40
|
def serializer(name, from:)
|
41
41
|
object = Ree.container.packages_facade.get_object(from, name)
|
42
|
-
@
|
42
|
+
@route.serializer = object
|
43
43
|
nil
|
44
44
|
end
|
45
45
|
|
46
46
|
contract SplatOf[String] => nil
|
47
47
|
def sections(*names)
|
48
|
-
@
|
48
|
+
@route.sections = names
|
49
49
|
nil
|
50
50
|
end
|
51
51
|
|
52
52
|
contract Symbol, Symbol => nil
|
53
53
|
def action(name, from:)
|
54
54
|
object = Ree.container.packages_facade.get_object(from, name)
|
55
|
-
@
|
55
|
+
@route.action = object
|
56
56
|
nil
|
57
57
|
end
|
58
58
|
|
59
59
|
contract String, Kwargs[code: Integer] => nil
|
60
60
|
def redirect(path, code: 301)
|
61
61
|
raise ArgumentError if ![301, 302, 303, 307, 308].include?(code)
|
62
|
-
@
|
62
|
+
@route.redirect = Redirect.new(path, code)
|
63
63
|
nil
|
64
64
|
end
|
65
65
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
RSpec.describe "ReeRoutes" do
|
2
|
+
it "generates package schema" do
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
packages_schema_path = Ree.locate_packages_schema(__dir__)
|
6
|
+
packages_schema_dir = Pathname.new(packages_schema_path).dirname.to_s
|
7
|
+
|
8
|
+
FileUtils.cd packages_schema_dir do
|
9
|
+
expect(
|
10
|
+
system("bundle exec ree gen.package_json ree_routes --silence")
|
11
|
+
).to eq(true)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
package_require("ree_routes/dsl")
|
2
|
+
|
3
|
+
RSpec.describe ReeRoutes::DSL, type: [:autoclean] do
|
4
|
+
before :all do
|
5
|
+
Ree.enable_irb_mode
|
6
|
+
|
7
|
+
module ReeRoutesTest
|
8
|
+
include Ree::PackageDSL
|
9
|
+
|
10
|
+
package
|
11
|
+
end
|
12
|
+
|
13
|
+
class ReeRoutesTest::EmptyRoutes
|
14
|
+
include ReeRoutes::DSL
|
15
|
+
|
16
|
+
routes :empty_routes do
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class ReeRoutesTest::Cmd
|
21
|
+
include Ree::FnDSL
|
22
|
+
|
23
|
+
fn :cmd
|
24
|
+
|
25
|
+
def call
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class ReeRoutesTest::Serializer
|
30
|
+
include ReeMapper::DSL
|
31
|
+
|
32
|
+
mapper :serializer
|
33
|
+
|
34
|
+
build_mapper.use(:serialize) do
|
35
|
+
integer :id
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class ReeRoutesTest::Caster
|
40
|
+
include ReeMapper::DSL
|
41
|
+
|
42
|
+
mapper :caster
|
43
|
+
|
44
|
+
build_mapper.use(:cast) do
|
45
|
+
integer :id
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class ReeRoutesTest::Routes
|
50
|
+
include ReeRoutes::DSL
|
51
|
+
|
52
|
+
routes :routes do
|
53
|
+
default_warden_scope :user
|
54
|
+
|
55
|
+
post "users" do
|
56
|
+
summary "Test route"
|
57
|
+
action :cmd, from: :ree_routes_test
|
58
|
+
serializer :serializer, from: :ree_routes_test
|
59
|
+
respond_to :json
|
60
|
+
end
|
61
|
+
|
62
|
+
get "files.csv" do
|
63
|
+
summary "Test route"
|
64
|
+
action :cmd, from: :ree_routes_test
|
65
|
+
respond_to :csv
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
after :all do
|
72
|
+
Ree.disable_irb_mode
|
73
|
+
end
|
74
|
+
|
75
|
+
it {
|
76
|
+
expect(ReeRoutesTest::EmptyRoutes.new).to eq([])
|
77
|
+
}
|
78
|
+
|
79
|
+
it {
|
80
|
+
routes = ReeRoutesTest::Routes.new
|
81
|
+
|
82
|
+
expect(routes.size).to eq(2)
|
83
|
+
|
84
|
+
post_route = routes.first
|
85
|
+
csv_route = routes.last
|
86
|
+
|
87
|
+
expect(post_route.serializer.name).to eq(:serializer)
|
88
|
+
expect(post_route.action.name).to eq(:cmd)
|
89
|
+
expect(post_route.respond_to).to eq(:json)
|
90
|
+
|
91
|
+
expect(csv_route.respond_to).to eq(:csv)
|
92
|
+
}
|
93
|
+
end
|
data/lib/ree_lib/version.rb
CHANGED