ree_lib 1.0.39 → 1.0.41

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +4 -1
  3. data/lib/ree_lib/.vscode-ree/templates/spec_template.rb +1 -1
  4. data/lib/ree_lib/Packages.schema.json +4 -0
  5. data/lib/ree_lib/packages/.vscode-ree/templates/spec_template.rb +1 -1
  6. data/lib/ree_lib/packages/ree_actions/package/ree_actions/dsl.rb +28 -70
  7. data/lib/ree_lib/packages/ree_actions/package/ree_actions.rb +1 -2
  8. data/lib/ree_lib/packages/ree_actions/spec/ree_actions/dsl_spec.rb +34 -65
  9. data/lib/ree_lib/packages/ree_array/spec/ree_array/functions/group_by_spec.rb +1 -1
  10. data/lib/ree_lib/packages/ree_array/spec/ree_array/functions/index_by_spec.rb +1 -1
  11. data/lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_array.rb +57 -0
  12. data/lib/ree_lib/packages/ree_dao/package/ree_dao/wrappers/pg_jsonb.rb +73 -0
  13. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/build_sqlite_connection_spec.rb +1 -1
  14. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/one_to_many_spec.rb +2 -2
  15. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/one_to_one_spec.rb +2 -2
  16. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/functions/persist_assoc_spec.rb +2 -2
  17. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/wrappers/pg_array_spec.rb +72 -0
  18. data/lib/ree_lib/packages/ree_dao/spec/ree_dao/wrappers/pg_jsonb_spec.rb +94 -0
  19. data/lib/ree_lib/packages/ree_datetime/spec/ree_datetime/functions/in_default_time_zone_spec.rb +1 -1
  20. data/lib/ree_lib/packages/ree_dto/spec/ree_dto/entity_dsl_spec.rb +1 -1
  21. data/lib/ree_lib/packages/ree_hash/spec/ree_hash/functions/transform_values_spec.rb +1 -1
  22. data/lib/ree_lib/packages/ree_json/spec/ree_json/functions/from_json_spec.rb +1 -1
  23. data/lib/ree_lib/packages/ree_json/spec/ree_json/functions/to_json_spec.rb +1 -1
  24. data/lib/ree_lib/packages/ree_logger/spec/ree_logger/appenders/appender_spec.rb +1 -1
  25. data/lib/ree_lib/packages/ree_logger/spec/ree_logger/appenders/file_appender_spec.rb +3 -3
  26. data/lib/ree_lib/packages/ree_logger/spec/ree_logger/appenders/rollbar_appender_spec.rb +1 -1
  27. data/lib/ree_lib/packages/ree_logger/spec/ree_logger/appenders/stdout_appender_spec.rb +1 -1
  28. data/lib/ree_lib/packages/ree_logger/spec/ree_logger/beans/logger_spec.rb +2 -2
  29. data/lib/ree_lib/packages/ree_logger/spec/ree_logger/formatters/colorized_formatter_spec.rb +10 -7
  30. data/lib/ree_lib/packages/ree_logger/spec/ree_logger/formatters/default_formatter_spec.rb +1 -1
  31. data/lib/ree_lib/packages/ree_logger/spec/ree_logger/formatters/formatter_spec.rb +1 -1
  32. data/lib/ree_lib/packages/ree_logger/spec/ree_logger/multi_logger_spec.rb +1 -1
  33. data/lib/ree_lib/packages/ree_migrator/spec/ree_migrator/functions/apply_migration_spec.rb +1 -1
  34. data/lib/ree_lib/packages/ree_migrator/spec/ree_migrator/functions/apply_migrations_spec.rb +1 -1
  35. data/lib/ree_lib/packages/ree_migrator/spec/ree_migrator/functions/migrate_db_spec.rb +1 -1
  36. data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/deep_dup_spec.rb +2 -2
  37. data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/deep_freeze_spec.rb +1 -1
  38. data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/dump_as_json_spec.rb +1 -1
  39. data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/is_blank_spec.rb +1 -1
  40. data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/not_blank_spec.rb +1 -1
  41. data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/to_hash_spec.rb +1 -1
  42. data/lib/ree_lib/packages/ree_object/spec/ree_object/functions/to_obj_spec.rb +8 -8
  43. data/lib/ree_lib/packages/ree_roda/Package.schema.json +14 -7
  44. data/lib/ree_lib/packages/ree_roda/package/ree_roda/plugins/ree_routes.rb +231 -0
  45. data/lib/ree_lib/packages/ree_roda/package/ree_roda/services/{build_action_errors.rb → build_route_errors.rb} +5 -5
  46. data/lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_routing_tree.rb +144 -0
  47. data/lib/ree_lib/packages/ree_roda/package/ree_roda/services/build_swagger_from_routes.rb +54 -0
  48. data/lib/ree_lib/packages/ree_roda/package/ree_roda.rb +2 -2
  49. data/lib/ree_lib/packages/ree_roda/schemas/ree_roda/services/{build_action_errors.schema.json → build_route_errors.schema.json} +5 -5
  50. data/lib/ree_lib/packages/ree_roda/schemas/ree_roda/services/build_routing_tree.schema.json +28 -0
  51. 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
  52. data/lib/ree_lib/packages/ree_roda/spec/ree_roda/app_spec.rb +141 -7
  53. data/lib/ree_lib/packages/ree_roda/spec/ree_roda/services/build_routing_tree_spec.rb +261 -0
  54. data/lib/ree_lib/packages/ree_routes/.gitignore +0 -0
  55. data/lib/ree_lib/packages/ree_routes/.rspec +2 -0
  56. data/lib/ree_lib/packages/ree_routes/Package.schema.json +20 -0
  57. data/lib/ree_lib/packages/ree_routes/bin/console +5 -0
  58. data/lib/ree_lib/packages/ree_routes/package/ree_routes/dsl.rb +102 -0
  59. data/lib/ree_lib/packages/ree_routes/package/ree_routes/route.rb +10 -0
  60. data/lib/ree_lib/packages/{ree_actions/package/ree_actions/action_builder.rb → ree_routes/package/ree_routes/route_builder.rb} +15 -15
  61. data/lib/ree_lib/packages/ree_routes/package/ree_routes.rb +9 -0
  62. data/lib/ree_lib/packages/ree_routes/spec/package_schema_spec.rb +14 -0
  63. data/lib/ree_lib/packages/ree_routes/spec/ree_routes/dsl_spec.rb +93 -0
  64. data/lib/ree_lib/packages/ree_routes/spec/spec_helper.rb +3 -0
  65. data/lib/ree_lib/packages/ree_text/spec/ree_text/functions/safe_join_spec.rb +1 -1
  66. data/lib/ree_lib/packages/ree_text/spec/ree_text/functions/to_sentence_spec.rb +1 -1
  67. data/lib/ree_lib/packages/ree_validator/spec/ree_validator/functions/validate_password_spec.rb +1 -1
  68. data/lib/ree_lib/version.rb +1 -1
  69. metadata +39 -11
  70. data/lib/ree_lib/packages/ree_actions/package/ree_actions/action.rb +0 -10
  71. data/lib/ree_lib/packages/ree_actions/package/ree_actions/action_dsl.rb +0 -60
  72. data/lib/ree_lib/packages/ree_actions/spec/ree_actions/action_dsl_spec.rb +0 -62
  73. data/lib/ree_lib/packages/ree_roda/package/ree_roda/plugins/ree_actions.rb +0 -150
  74. 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,2 @@
1
+ --color
2
+ --require spec_helper
@@ -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,5 @@
1
+ #!/usr/bin/env ruby
2
+ require "bundler/setup"
3
+ require "ree"
4
+
5
+ Ree.init(__dir__, irb: true)
@@ -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
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ReeRoutes::Route
4
+ attr_accessor :summary, :request_method, :serializer, :respond_to,
5
+ :sections, :action, :route, :warden_scope, :path
6
+
7
+ def valid?
8
+ !action.nil? && !summary.nil? && !warden_scope.nil?
9
+ end
10
+ end
@@ -1,65 +1,65 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "action"
3
+ require_relative "route"
4
4
 
5
- class ReeActions::ActionBuilder
5
+ class ReeRoutes::RouteBuilder
6
6
  Redirect = Struct.new(:path, :code)
7
7
 
8
8
  def initialize
9
- @action = ReeActions::Action.new
10
- @action.respond_to = :json
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
- @action.warden_scope = scope
15
+ @route.warden_scope = scope
16
16
  end
17
17
 
18
18
  contract Symbol => Symbol
19
19
  def respond_to(v)
20
- @action.respond_to = v
20
+ @route.respond_to = v
21
21
  end
22
22
 
23
- contract None => ReeActions::Action
24
- def get_action
25
- @action
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
- @action.before = proc
30
+ @route.before = proc
31
31
  nil
32
32
  end
33
33
 
34
34
  contract String => String
35
35
  def summary(str)
36
- @action.summary = str
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
- @action.serializer = object
42
+ @route.serializer = object
43
43
  nil
44
44
  end
45
45
 
46
46
  contract SplatOf[String] => nil
47
47
  def sections(*names)
48
- @action.sections = names
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
- @action.action = object
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
- @action.redirect = Redirect.new(path, code)
62
+ @route.redirect = Redirect.new(path, code)
63
63
  nil
64
64
  end
65
65
  end
@@ -0,0 +1,9 @@
1
+ module ReeRoutes
2
+ include Ree::PackageDSL
3
+
4
+ package do
5
+ depends_on :ree_mapper
6
+ end
7
+ end
8
+
9
+ require_relative "ree_routes/dsl"
@@ -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
@@ -0,0 +1,3 @@
1
+ RSpec.configure do |config|
2
+ config.extend Ree::RSpecLinkDSL
3
+ end
@@ -1,4 +1,4 @@
1
- # frozen_string_literal = true
1
+ # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe :safe_join do
4
4
  link :safe_join, from: :ree_text
@@ -1,4 +1,4 @@
1
- # frozen_string_literal = true
1
+ # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe :to_sentence do
4
4
  link :to_sentence, from: :ree_text
@@ -1,4 +1,4 @@
1
- # frozen_string_literal = true
1
+ # frozen_string_literal: true
2
2
 
3
3
  package_require('ree_validator/functions/validate_password')
4
4
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReeLib
4
- VERSION = "1.0.39"
4
+ VERSION = "1.0.41"
5
5
  end