ru.Bee 1.3.3 → 1.5.0

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.
Files changed (182) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rubee +36 -4
  3. data/lib/app/views/app.tsx +27 -0
  4. data/lib/app/views/apples_.erb +1 -0
  5. data/lib/app/views/index.html +47 -0
  6. data/lib/app/views/layout.erb +3 -3
  7. data/lib/app/views/utils/redirectToBackend.tsx +9 -0
  8. data/lib/app/views/welcome_show.erb +1 -1
  9. data/lib/config/base_configuration.rb +9 -0
  10. data/lib/config/routes.rb +1 -0
  11. data/lib/esbuild.config.js +33 -0
  12. data/lib/js/app.js +13 -0
  13. data/lib/js/app.js.map +7 -0
  14. data/lib/js/bundle.js +26157 -0
  15. data/lib/js/bundle.js.map +7 -0
  16. data/lib/node_modules/@types/cookie/LICENSE +21 -0
  17. data/lib/node_modules/@types/cookie/README.md +15 -0
  18. data/lib/node_modules/@types/cookie/index.d.ts +154 -0
  19. data/lib/node_modules/@types/cookie/package.json +30 -0
  20. data/lib/node_modules/cookie/LICENSE +24 -0
  21. data/lib/node_modules/cookie/README.md +248 -0
  22. data/lib/node_modules/cookie/dist/index.d.ts +114 -0
  23. data/lib/node_modules/cookie/dist/index.js +239 -0
  24. data/lib/node_modules/cookie/dist/index.js.map +1 -0
  25. data/lib/node_modules/cookie/package.json +42 -0
  26. data/lib/node_modules/js-tokens/CHANGELOG.md +151 -0
  27. data/lib/node_modules/js-tokens/LICENSE +21 -0
  28. data/lib/node_modules/js-tokens/README.md +240 -0
  29. data/lib/node_modules/js-tokens/index.js +23 -0
  30. data/lib/node_modules/js-tokens/package.json +30 -0
  31. data/lib/node_modules/loose-envify/LICENSE +21 -0
  32. data/lib/node_modules/loose-envify/README.md +45 -0
  33. data/lib/node_modules/loose-envify/cli.js +16 -0
  34. data/lib/node_modules/loose-envify/custom.js +4 -0
  35. data/lib/node_modules/loose-envify/index.js +3 -0
  36. data/lib/node_modules/loose-envify/loose-envify.js +36 -0
  37. data/lib/node_modules/loose-envify/package.json +36 -0
  38. data/lib/node_modules/loose-envify/replace.js +65 -0
  39. data/lib/node_modules/react/LICENSE +21 -0
  40. data/lib/node_modules/react/README.md +37 -0
  41. data/lib/node_modules/react/cjs/react-jsx-dev-runtime.development.js +1315 -0
  42. data/lib/node_modules/react/cjs/react-jsx-dev-runtime.production.min.js +10 -0
  43. data/lib/node_modules/react/cjs/react-jsx-dev-runtime.profiling.min.js +10 -0
  44. data/lib/node_modules/react/cjs/react-jsx-runtime.development.js +1333 -0
  45. data/lib/node_modules/react/cjs/react-jsx-runtime.production.min.js +11 -0
  46. data/lib/node_modules/react/cjs/react-jsx-runtime.profiling.min.js +11 -0
  47. data/lib/node_modules/react/cjs/react.development.js +2740 -0
  48. data/lib/node_modules/react/cjs/react.production.min.js +26 -0
  49. data/lib/node_modules/react/cjs/react.shared-subset.development.js +20 -0
  50. data/lib/node_modules/react/cjs/react.shared-subset.production.min.js +10 -0
  51. data/lib/node_modules/react/index.js +7 -0
  52. data/lib/node_modules/react/jsx-dev-runtime.js +7 -0
  53. data/lib/node_modules/react/jsx-runtime.js +7 -0
  54. data/lib/node_modules/react/package.json +47 -0
  55. data/lib/node_modules/react/react.shared-subset.js +7 -0
  56. data/lib/node_modules/react/umd/react.development.js +3343 -0
  57. data/lib/node_modules/react/umd/react.production.min.js +31 -0
  58. data/lib/node_modules/react/umd/react.profiling.min.js +31 -0
  59. data/lib/node_modules/react-dom/LICENSE +21 -0
  60. data/lib/node_modules/react-dom/README.md +60 -0
  61. data/lib/node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js +7029 -0
  62. data/lib/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js +93 -0
  63. data/lib/node_modules/react-dom/cjs/react-dom-server-legacy.node.development.js +7093 -0
  64. data/lib/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.min.js +101 -0
  65. data/lib/node_modules/react-dom/cjs/react-dom-server.browser.development.js +7014 -0
  66. data/lib/node_modules/react-dom/cjs/react-dom-server.browser.production.min.js +96 -0
  67. data/lib/node_modules/react-dom/cjs/react-dom-server.node.development.js +7070 -0
  68. data/lib/node_modules/react-dom/cjs/react-dom-server.node.production.min.js +102 -0
  69. data/lib/node_modules/react-dom/cjs/react-dom-test-utils.development.js +1763 -0
  70. data/lib/node_modules/react-dom/cjs/react-dom-test-utils.production.min.js +40 -0
  71. data/lib/node_modules/react-dom/cjs/react-dom.development.js +29923 -0
  72. data/lib/node_modules/react-dom/cjs/react-dom.production.min.js +322 -0
  73. data/lib/node_modules/react-dom/cjs/react-dom.profiling.min.js +366 -0
  74. data/lib/node_modules/react-dom/client.js +25 -0
  75. data/lib/node_modules/react-dom/index.js +38 -0
  76. data/lib/node_modules/react-dom/package.json +62 -0
  77. data/lib/node_modules/react-dom/profiling.js +38 -0
  78. data/lib/node_modules/react-dom/server.browser.js +17 -0
  79. data/lib/node_modules/react-dom/server.js +3 -0
  80. data/lib/node_modules/react-dom/server.node.js +17 -0
  81. data/lib/node_modules/react-dom/test-utils.js +7 -0
  82. data/lib/node_modules/react-dom/umd/react-dom-server-legacy.browser.development.js +7026 -0
  83. data/lib/node_modules/react-dom/umd/react-dom-server-legacy.browser.production.min.js +75 -0
  84. data/lib/node_modules/react-dom/umd/react-dom-server.browser.development.js +7011 -0
  85. data/lib/node_modules/react-dom/umd/react-dom-server.browser.production.min.js +76 -0
  86. data/lib/node_modules/react-dom/umd/react-dom-test-utils.development.js +1759 -0
  87. data/lib/node_modules/react-dom/umd/react-dom-test-utils.production.min.js +33 -0
  88. data/lib/node_modules/react-dom/umd/react-dom.development.js +29924 -0
  89. data/lib/node_modules/react-dom/umd/react-dom.production.min.js +267 -0
  90. data/lib/node_modules/react-dom/umd/react-dom.profiling.min.js +285 -0
  91. data/lib/node_modules/react-router/CHANGELOG.md +1526 -0
  92. data/lib/node_modules/react-router/LICENSE.md +23 -0
  93. data/lib/node_modules/react-router/README.md +7 -0
  94. data/lib/node_modules/react-router/dist/development/chunk-KNED5TY2.mjs +10476 -0
  95. data/lib/node_modules/react-router/dist/development/dom-export.d.mts +23 -0
  96. data/lib/node_modules/react-router/dist/development/dom-export.d.ts +23 -0
  97. data/lib/node_modules/react-router/dist/development/dom-export.js +6111 -0
  98. data/lib/node_modules/react-router/dist/development/dom-export.mjs +234 -0
  99. data/lib/node_modules/react-router/dist/development/fog-of-war-1hWhK5ey.d.mts +1690 -0
  100. data/lib/node_modules/react-router/dist/development/fog-of-war-oa9CGk10.d.ts +1690 -0
  101. data/lib/node_modules/react-router/dist/development/future-ldDp5FKH.d.mts +21 -0
  102. data/lib/node_modules/react-router/dist/development/future-ldDp5FKH.d.ts +21 -0
  103. data/lib/node_modules/react-router/dist/development/index.d.mts +841 -0
  104. data/lib/node_modules/react-router/dist/development/index.d.ts +841 -0
  105. data/lib/node_modules/react-router/dist/development/index.js +10624 -0
  106. data/lib/node_modules/react-router/dist/development/index.mjs +242 -0
  107. data/lib/node_modules/react-router/dist/development/lib/types/route-module.d.mts +209 -0
  108. data/lib/node_modules/react-router/dist/development/lib/types/route-module.d.ts +209 -0
  109. data/lib/node_modules/react-router/dist/development/lib/types/route-module.js +28 -0
  110. data/lib/node_modules/react-router/dist/development/lib/types/route-module.mjs +10 -0
  111. data/lib/node_modules/react-router/dist/development/route-data-5OzAzQtT.d.mts +1716 -0
  112. data/lib/node_modules/react-router/dist/development/route-data-5OzAzQtT.d.ts +1716 -0
  113. data/lib/node_modules/react-router/dist/production/chunk-ZIM7OIE3.mjs +10476 -0
  114. data/lib/node_modules/react-router/dist/production/dom-export.d.mts +23 -0
  115. data/lib/node_modules/react-router/dist/production/dom-export.d.ts +23 -0
  116. data/lib/node_modules/react-router/dist/production/dom-export.js +6111 -0
  117. data/lib/node_modules/react-router/dist/production/dom-export.mjs +234 -0
  118. data/lib/node_modules/react-router/dist/production/fog-of-war-1hWhK5ey.d.mts +1690 -0
  119. data/lib/node_modules/react-router/dist/production/fog-of-war-oa9CGk10.d.ts +1690 -0
  120. data/lib/node_modules/react-router/dist/production/future-ldDp5FKH.d.mts +21 -0
  121. data/lib/node_modules/react-router/dist/production/future-ldDp5FKH.d.ts +21 -0
  122. data/lib/node_modules/react-router/dist/production/index.d.mts +841 -0
  123. data/lib/node_modules/react-router/dist/production/index.d.ts +841 -0
  124. data/lib/node_modules/react-router/dist/production/index.js +10624 -0
  125. data/lib/node_modules/react-router/dist/production/index.mjs +242 -0
  126. data/lib/node_modules/react-router/dist/production/lib/types/route-module.d.mts +209 -0
  127. data/lib/node_modules/react-router/dist/production/lib/types/route-module.d.ts +209 -0
  128. data/lib/node_modules/react-router/dist/production/lib/types/route-module.js +28 -0
  129. data/lib/node_modules/react-router/dist/production/lib/types/route-module.mjs +10 -0
  130. data/lib/node_modules/react-router/dist/production/route-data-5OzAzQtT.d.mts +1716 -0
  131. data/lib/node_modules/react-router/dist/production/route-data-5OzAzQtT.d.ts +1716 -0
  132. data/lib/node_modules/react-router/package.json +116 -0
  133. data/lib/node_modules/react-router-dom/LICENSE.md +23 -0
  134. data/lib/node_modules/react-router-dom/README.md +6 -0
  135. data/lib/node_modules/react-router-dom/dist/index.d.mts +2 -0
  136. data/lib/node_modules/react-router-dom/dist/index.d.ts +2 -0
  137. data/lib/node_modules/react-router-dom/dist/index.js +45 -0
  138. data/lib/node_modules/react-router-dom/dist/index.mjs +18 -0
  139. data/lib/node_modules/react-router-dom/package.json +82 -0
  140. data/lib/node_modules/scheduler/LICENSE +21 -0
  141. data/lib/node_modules/scheduler/README.md +9 -0
  142. data/lib/node_modules/scheduler/cjs/scheduler-unstable_mock.development.js +700 -0
  143. data/lib/node_modules/scheduler/cjs/scheduler-unstable_mock.production.min.js +20 -0
  144. data/lib/node_modules/scheduler/cjs/scheduler-unstable_post_task.development.js +207 -0
  145. data/lib/node_modules/scheduler/cjs/scheduler-unstable_post_task.production.min.js +14 -0
  146. data/lib/node_modules/scheduler/cjs/scheduler.development.js +634 -0
  147. data/lib/node_modules/scheduler/cjs/scheduler.production.min.js +19 -0
  148. data/lib/node_modules/scheduler/index.js +7 -0
  149. data/lib/node_modules/scheduler/package.json +36 -0
  150. data/lib/node_modules/scheduler/umd/scheduler-unstable_mock.development.js +699 -0
  151. data/lib/node_modules/scheduler/umd/scheduler-unstable_mock.production.min.js +19 -0
  152. data/lib/node_modules/scheduler/umd/scheduler.development.js +152 -0
  153. data/lib/node_modules/scheduler/umd/scheduler.production.min.js +146 -0
  154. data/lib/node_modules/scheduler/umd/scheduler.profiling.min.js +146 -0
  155. data/lib/node_modules/scheduler/unstable_mock.js +7 -0
  156. data/lib/node_modules/scheduler/unstable_post_task.js +7 -0
  157. data/lib/node_modules/set-cookie-parser/LICENSE +21 -0
  158. data/lib/node_modules/set-cookie-parser/README.md +202 -0
  159. data/lib/node_modules/set-cookie-parser/lib/set-cookie.js +224 -0
  160. data/lib/node_modules/set-cookie-parser/package.json +45 -0
  161. data/lib/node_modules/turbo-stream/LICENSE +7 -0
  162. data/lib/node_modules/turbo-stream/README.md +31 -0
  163. data/lib/node_modules/turbo-stream/dist/flatten.d.ts +2 -0
  164. data/lib/node_modules/turbo-stream/dist/flatten.js +203 -0
  165. data/lib/node_modules/turbo-stream/dist/turbo-stream.d.ts +13 -0
  166. data/lib/node_modules/turbo-stream/dist/turbo-stream.js +207 -0
  167. data/lib/node_modules/turbo-stream/dist/turbo-stream.mjs +673 -0
  168. data/lib/node_modules/turbo-stream/dist/unflatten.d.ts +2 -0
  169. data/lib/node_modules/turbo-stream/dist/unflatten.js +243 -0
  170. data/lib/node_modules/turbo-stream/dist/utils.d.ts +44 -0
  171. data/lib/node_modules/turbo-stream/dist/utils.js +55 -0
  172. data/lib/node_modules/turbo-stream/package.json +50 -0
  173. data/lib/package-lock.json +133 -0
  174. data/lib/package.json +12 -0
  175. data/lib/rubee/controllers/base_controller.rb +14 -0
  176. data/lib/rubee.rb +100 -21
  177. data/lib/tests/rubee_generator_test.rb +190 -0
  178. data/lib/tests/rubeeapp_test.rb +12 -0
  179. data/lib/tests/test.db +0 -0
  180. data/lib/tests/user_model_test.rb +5 -0
  181. data/readme.md +288 -64
  182. metadata +172 -3
data/lib/rubee.rb CHANGED
@@ -10,9 +10,11 @@ end
10
10
 
11
11
  module Rubee
12
12
  APP_ROOT = File.expand_path(Dir.pwd) unless defined?(APP_ROOT)
13
- IMAGE_DIR = File.join(APP_ROOT, 'images') unless defined?(IMAGE_DIR)
14
13
  PROJECT_NAME = File.basename(APP_ROOT) unless defined?(PROJECT_NAME)
15
- VERSION = '1.3.3'
14
+ LIB = PROJECT_NAME == 'rubee' ? 'lib/' : '' unless defined?(LIB)
15
+ IMAGE_DIR = File.join(APP_ROOT, LIB, 'images') unless defined?(IMAGE_DIR)
16
+ JS_DIR = File.join(APP_ROOT, LIB, 'js') unless defined?(JS_DIR)
17
+ VERSION = '1.4.0'
16
18
 
17
19
  class Application
18
20
  include Singleton
@@ -23,12 +25,21 @@ module Rubee
23
25
  # register images paths
24
26
  request = Rack::Request.new(env)
25
27
  # Add default path for images
26
- Router.draw { |route| route.get('/images/{path}', to: 'base#image', namespace: 'Rubee') }
28
+ Router.draw do |route|
29
+ route.get('/images/{path}', to: 'base#image', namespace: 'Rubee')
30
+ route.get('/js/{path}', to: 'base#js', namespace: 'Rubee')
31
+ route.get('/css/{path}', to: 'base#css', namespace: 'Rubee')
32
+ end
27
33
  # define route
28
34
  route = Router.route_for(request)
29
- # init controller class
35
+ # if react is the view so we would like to delegate not cauth by rubee routes to it.
36
+ if Rubee::Configuration.react[:on] && !route
37
+ index = File.read(File.join(Rubee::APP_ROOT, Rubee::LIB, 'app/views', 'index.html'))
38
+ return [200, { 'content-type' => 'text/html' }, [index]]
39
+ end
40
+ # if not found return 404
30
41
  return [404, { 'content-type' => 'text/plain' }, ['Route not found']] unless route
31
-
42
+ # init controller class
32
43
  controller_class = if route[:namespace]
33
44
  "#{route[:namespace]}::#{route[:controller].capitalize}Controller"
34
45
  else
@@ -68,6 +79,15 @@ module Rubee
68
79
  @configuraiton[args[:env].to_sym][:async_adapter] = args[:async_adapter]
69
80
  end
70
81
 
82
+ def react=(args)
83
+ @configuraiton[args[:env].to_sym][:react] ||= { on: false }
84
+ @configuraiton[args[:env].to_sym][:react].merge!(on: args[:on])
85
+ end
86
+
87
+ def react
88
+ @configuraiton[ENV['RACK_ENV']&.to_sym || :development][:react] || {}
89
+ end
90
+
71
91
  def method_missing(method_name, *_args)
72
92
  return unless method_name.to_s.start_with?('get_')
73
93
 
@@ -152,9 +172,8 @@ module Rubee
152
172
  require_relative file unless black_list.include?("#{file}.rb")
153
173
  end
154
174
  # app config and routes
155
- lib = PROJECT_NAME == 'rubee' ? 'lib/' : ''
156
175
  unless black_list.include?('base_configuration.rb')
157
- require_relative File.join(APP_ROOT, lib,
176
+ require_relative File.join(APP_ROOT, LIB,
158
177
  'config/base_configuration')
159
178
  end
160
179
  # This is necessary prerequisitedb init step
@@ -164,7 +183,7 @@ module Rubee
164
183
  end
165
184
  end
166
185
 
167
- require_relative File.join(APP_ROOT, lib, 'config/routes') unless black_list.include?('routes.rb')
186
+ require_relative File.join(APP_ROOT, LIB, 'config/routes') unless black_list.include?('routes.rb')
168
187
  # rubee extensions
169
188
  Dir[File.join(root_directory, 'rubee/extensions/**', '*.rb')].each do |file|
170
189
  require_relative file unless black_list.include?("#{file}.rb")
@@ -194,12 +213,13 @@ module Rubee
194
213
  end
195
214
 
196
215
  class Generator
197
- def initialize(model_name, attributes, controller_name, action_name)
216
+ def initialize(model_name, model_attributes, controller_name, action_name, **options)
198
217
  @model_name = model_name&.downcase
199
- @attributes = attributes
218
+ @model_attributes = model_attributes || []
200
219
  @plural_name = controller_name.to_s.gsub('Controller', '').downcase.to_s
201
220
  @action_name = action_name
202
221
  @controller_name = controller_name
222
+ @react = options[:react] || {}
203
223
  end
204
224
 
205
225
  def call
@@ -212,7 +232,7 @@ module Rubee
212
232
  private
213
233
 
214
234
  def generate_model
215
- model_file = File.join("app/models/#{@model_name}.rb")
235
+ model_file = File.join(Rubee::APP_ROOT, Rubee::LIB, "app/models/#{@model_name}.rb")
216
236
  if File.exist?(model_file)
217
237
  puts "Model #{@model_name} already exists. Remove it if you want to regenerate"
218
238
  return
@@ -220,7 +240,7 @@ module Rubee
220
240
 
221
241
  content = <<~RUBY
222
242
  class #{@model_name.capitalize} < Rubee::SequelObject
223
- attr_accessor #{@attributes.map { |hash| ":#{hash[:name]}" }.join(', ')}
243
+ #{'attr_accessor' + @model_attributes.map { |hash| ":#{hash[:name]}" }.join(', ') unless @model_attributes.empty?}
224
244
  end
225
245
  RUBY
226
246
 
@@ -229,7 +249,7 @@ module Rubee
229
249
  end
230
250
 
231
251
  def generate_controller
232
- controller_file = File.join("app/controllers/#{@plural_name}_controller.rb")
252
+ controller_file = File.join(Rubee::APP_ROOT, Rubee::LIB, "app/controllers/#{@plural_name}_controller.rb")
233
253
  if File.exist?(controller_file)
234
254
  puts "Controller #{@plural_name} already exists. Remove it if you want to regenerate"
235
255
  return
@@ -248,22 +268,41 @@ module Rubee
248
268
  end
249
269
 
250
270
  def generate_view
251
- view_file = File.join("app/views/#{@plural_name}_#{@action_name}.erb")
271
+ if @react[:view_name]
272
+ view_file = File.join(Rubee::APP_ROOT, Rubee::LIB, "app/views/#{@react[:view_name]}")
273
+ content = <<~JS
274
+ import React, { useEffect, useState } from "react";
275
+ // 1. Add your logic that fetches data
276
+ // 2. Do not forget to add respective react route
277
+ export function User() {
278
+
279
+ return (
280
+ <div>
281
+ <h2>#{@react[:view_name]} view</h2>
282
+ </div>
283
+ );
284
+ }
285
+ JS
286
+ else
287
+ view_file = File.join(Rubee::APP_ROOT, Rubee::LIB, "app/views/#{@plural_name}_#{@action_name}.erb")
288
+ content = <<~ERB
289
+ <h1>#{@plural_name}_#{@action_name} View</h1>
290
+ ERB
291
+ end
292
+
293
+ name = @react[:view_name] || "#{@plural_name}_#{@action_name}"
294
+
252
295
  if File.exist?(view_file)
253
- puts "View #{@plural_name}_#{@action_name} already exists. Remove it if you want to regenerate"
296
+ puts "View #{name} already exists. Remove it if you want to regenerate"
254
297
  return
255
298
  end
256
299
 
257
- content = <<~ERB
258
- <h1>#{@plural_name}_#{@action_name} View</h1>
259
- ERB
260
-
261
300
  File.open(view_file, 'w') { |file| file.write(content) }
262
- color_puts("View #{@plural_name}_#{@action_name} created", color: :green)
301
+ color_puts("View #{name} created", color: :green)
263
302
  end
264
303
 
265
304
  def generate_db_file
266
- db_file = File.join("db/create_#{@plural_name}.rb")
305
+ db_file = File.join(Rubee::APP_ROOT, Rubee::LIB, "db/create_#{@plural_name}.rb")
267
306
  if File.exist?(db_file)
268
307
  puts "DB file for #{@plural_name} already exists. Remove it if you want to regenerate"
269
308
  return
@@ -272,6 +311,11 @@ module Rubee
272
311
  content = <<~RUBY
273
312
  class Create#{@plural_name.capitalize}
274
313
  def call
314
+ return if Rubee::SequelObject::DB.tables.include?(:#{@plural_name})
315
+
316
+ Rubee::SequelObject::DB.create_table(:#{@plural_name}) do
317
+ #{@model_attributes.map { |attribute| generate_sequel_schema(attribute) }.join("\n\t\t\t")}
318
+ end
275
319
  end
276
320
  end
277
321
  RUBY
@@ -279,5 +323,40 @@ module Rubee
279
323
  File.open(db_file, 'w') { |file| file.write(content) }
280
324
  color_puts("DB file for #{@plural_name} created", color: :green)
281
325
  end
326
+
327
+ def generate_sequel_schema(attribute)
328
+ type = attribute[:type]
329
+ name = if attribute[:name].is_a?(Array)
330
+ attribute[:name].map { |nom| ":#{nom}" }.join(", ").prepend('[') + ']'
331
+ else
332
+ ":#{attribute[:name]}"
333
+ end
334
+ table = attribute[:table] || 'replace_with_table_name'
335
+ options = attribute[:options] || {}
336
+
337
+ lookup_hash = {
338
+ primary: "primary_key #{name}",
339
+ string: "String #{name}",
340
+ text: "String #{name}, text: true",
341
+ integer: "Integer #{name}",
342
+ date: "Date #{name}",
343
+ datetime: "DateTime #{name}",
344
+ time: "Time #{name}",
345
+ boolean: "TrueClass #{name}",
346
+ bigint: "Bignum #{name}",
347
+ decimal: "BigDecimal #{name}",
348
+ foreign_key: "foreign_key #{name}, :#{table}",
349
+ index: "index #{name}",
350
+ unique: "unique #",
351
+ }
352
+
353
+ statement = lookup_hash[type.to_sym]
354
+
355
+ options.keys.each do |key|
356
+ statement += ", #{key}: '#{options[key]}'"
357
+ end
358
+
359
+ statement
360
+ end
282
361
  end
283
362
  end
@@ -0,0 +1,190 @@
1
+ require_relative 'test_helper'
2
+
3
+ describe 'Rubee::Generator' do
4
+ describe 'generates Sequel schema lines' do
5
+ after do
6
+ File.delete('lib/app/models/apple.rb') if File.exist?('lib/app/models/apple.rb')
7
+ File.delete('lib/db/create_apples.rb') if File.exist?('lib/db/create_apples.rb')
8
+ end
9
+ it 'for string with just name' do
10
+ generator = Rubee::Generator.new(nil, nil, nil, nil)
11
+
12
+ attribute = { name: 'something', type: :string }
13
+
14
+ text = generator.send(:generate_sequel_schema, attribute)
15
+
16
+ _(text).must_equal('String :something')
17
+ end
18
+
19
+ it 'for string name and options' do
20
+ generator = Rubee::Generator.new(nil, nil, nil, nil)
21
+
22
+ attribute = { name: 'something', type: :string, options: { curse: 'squirrel' } }
23
+
24
+ text = generator.send(:generate_sequel_schema, attribute)
25
+
26
+ _(text).must_equal("String :something, curse: 'squirrel'")
27
+ end
28
+ end
29
+
30
+ describe 'generates Sequel file' do
31
+ after do
32
+ File.delete('lib/app/models/apple.rb') if File.exist?('lib/app/models/apple.rb')
33
+ File.delete('lib/db/create_apples.rb') if File.exist?('lib/db/create_apples.rb')
34
+ end
35
+
36
+ it 'not without a model' do
37
+ generator = Rubee::Generator.new(nil, nil, nil, nil)
38
+ generator.call
39
+
40
+ _(File.exist?('lib/db/create_apples.rb')).must_equal false
41
+ end
42
+
43
+ it 'with a model only' do
44
+ generator = Rubee::Generator.new('apple', nil, 'apples', nil)
45
+ generator.call
46
+
47
+ _(File.exist?('lib/db/create_apples.rb')).must_equal true
48
+
49
+ lines = File.readlines('lib/db/create_apples.rb').map(&:chomp).join("\n")
50
+
51
+ _(lines.include?('class CreateApples')).must_equal true
52
+ _(lines.include?('def call')).must_equal true
53
+ _(lines.include?('return if Rubee::SequelObject::DB.tables.include?(:apples)')).must_equal true
54
+ _(lines.include?('Rubee::SequelObject::DB.create_table(:apples) do')).must_equal true
55
+ _(lines.include?('String')).must_equal false
56
+ _(lines.include?('end')).must_equal true
57
+ end
58
+
59
+ it 'with a model with attributes' do
60
+ generator = Rubee::Generator.new('apple', [{ name: 'title', type: :string }, {name: 'content', type: :text }], 'apples', nil)
61
+ generator.call
62
+
63
+ _(File.exist?('lib/db/create_apples.rb')).must_equal true
64
+
65
+ lines = File.readlines('lib/db/create_apples.rb').map(&:chomp).join("\n")
66
+
67
+ _(lines.include?('class CreateApples')).must_equal true
68
+ _(lines.include?('def call')).must_equal true
69
+ _(lines.include?('return if Rubee::SequelObject::DB.tables.include?(:apples)')).must_equal true
70
+ _(lines.include?('Rubee::SequelObject::DB.create_table(:apples) do')).must_equal true
71
+ _(lines.include?('String :title')).must_equal true
72
+ _(lines.include?('String :content, text: true')).must_equal true
73
+ _(lines.include?('end')).must_equal true
74
+ end
75
+
76
+ it 'with a model with different attributes' do
77
+ generator = Rubee::Generator.new('apple', [{name: 'id', type: :bigint}, {name: 'colour', type: :string }, {name: 'weight', type: :integer }], 'apples', nil)
78
+ generator.call
79
+
80
+ _(File.exist?('lib/db/create_apples.rb')).must_equal true
81
+
82
+ lines = File.readlines('lib/db/create_apples.rb').map(&:chomp).join("\n")
83
+
84
+ _(lines.include?('class CreateApples')).must_equal true
85
+ _(lines.include?('def call')).must_equal true
86
+ _(lines.include?('return if Rubee::SequelObject::DB.tables.include?(:apples)')).must_equal true
87
+ _(lines.include?('Rubee::SequelObject::DB.create_table(:apples) do')).must_equal true
88
+ _(lines.include?('Bignum :id')).must_equal true
89
+ _(lines.include?('String :colour')).must_equal true
90
+ _(lines.include?('Integer :weight')).must_equal true
91
+ _(lines.include?('end')).must_equal true
92
+ end
93
+
94
+ it 'with a model with an attribute with multiple names' do
95
+ generator = Rubee::Generator.new('apple', [{ name: ['blue_id', 'shoe_id'], type: :foreign_key, table: 'blue_and_shoe_join_tb' }], 'apples', nil)
96
+ generator.call
97
+
98
+ _(File.exist?('lib/db/create_apples.rb')).must_equal true
99
+
100
+ lines = File.readlines('lib/db/create_apples.rb').map(&:chomp).join("\n")
101
+
102
+ _(lines.include?('class CreateApples')).must_equal true
103
+ _(lines.include?('def call')).must_equal true
104
+ _(lines.include?('return if Rubee::SequelObject::DB.tables.include?(:apples)')).must_equal true
105
+ _(lines.include?('Rubee::SequelObject::DB.create_table(:apples) do')).must_equal true
106
+ _(lines.include?('foreign_key [:blue_id, :shoe_id]')).must_equal true
107
+ _(lines.include?(':blue_and_shoe_join_tb')).must_equal true
108
+ _(lines.include?('end')).must_equal true
109
+ end
110
+
111
+ it 'with a model with a foreign_key without table' do
112
+ generator = Rubee::Generator.new('apple', [{ name: 'blue_id', type: :foreign_key }], 'apples', nil)
113
+ generator.call
114
+
115
+ _(File.exist?('lib/db/create_apples.rb')).must_equal true
116
+
117
+ lines = File.readlines('lib/db/create_apples.rb').map(&:chomp).join("\n")
118
+
119
+ _(lines.include?('class CreateApples')).must_equal true
120
+ _(lines.include?('def call')).must_equal true
121
+ _(lines.include?('return if Rubee::SequelObject::DB.tables.include?(:apples)')).must_equal true
122
+ _(lines.include?('Rubee::SequelObject::DB.create_table(:apples) do')).must_equal true
123
+ _(lines.include?('foreign_key :blue_id')).must_equal true
124
+ _(lines.include?(':replace_with_table_name')).must_equal true
125
+ _(lines.include?('end')).must_equal true
126
+ end
127
+ end
128
+
129
+ describe 'generates Model file' do
130
+ after do
131
+ File.delete('lib/app/models/apple.rb') if File.exist?('lib/app/models/apple.rb')
132
+ File.delete('lib/db/create_apples.rb') if File.exist?('lib/db/create_apples.rb')
133
+ end
134
+
135
+ it 'not without a model' do
136
+ generator = Rubee::Generator.new(nil, nil, nil, nil)
137
+ generator.call
138
+
139
+ _(File.exist?('lib/app/models/apple.rb')).must_equal false
140
+ end
141
+
142
+ it 'with a model only' do
143
+ generator = Rubee::Generator.new('apple', nil, 'apples', nil)
144
+ generator.call
145
+
146
+ _(File.exist?('lib/app/models/apple.rb')).must_equal true
147
+
148
+ lines = File.readlines('lib/app/models/apple.rb').map(&:chomp).join("\n")
149
+
150
+ _(lines.include?('class Apple < Rubee::SequelObject')).must_equal true
151
+ _(lines.include?('attr_accessor')).must_equal false
152
+ _(lines.include?('end')).must_equal true
153
+ end
154
+
155
+ it 'with a model with attributes' do
156
+ generator = Rubee::Generator.new('apple', [{ name: 'title', type: :string }, {name: 'content', type: :text }], 'apples', nil)
157
+ generator.call
158
+
159
+ _(File.exist?('lib/app/models/apple.rb')).must_equal true
160
+
161
+ lines = File.readlines('lib/app/models/apple.rb').map(&:chomp).join("\n")
162
+
163
+ _(lines.include?('class Apple < Rubee::SequelObject')).must_equal true
164
+ _(lines.include?('attr_accessor')).must_equal true
165
+ _(lines.include?(':title, :content')).must_equal true
166
+ _(lines.include?('end')).must_equal true
167
+ end
168
+
169
+ it 'with a model with different attributes' do
170
+ generator = Rubee::Generator.new('apple', [{name: 'id', type: :bigInt}, {name: 'colour', type: :string }, {name: 'weight', type: :integer }], 'apples', nil)
171
+ generator.call
172
+
173
+ _(File.exist?('lib/app/models/apple.rb')).must_equal true
174
+
175
+ lines = File.readlines('lib/app/models/apple.rb').map(&:chomp).join("\n")
176
+
177
+ _(lines.include?('class Apple < Rubee::SequelObject')).must_equal true
178
+ _(lines.include?('attr_accessor')).must_equal true
179
+ _(lines.include?(':id, :colour, :weight')).must_equal true
180
+ _(lines.include?('end')).must_equal true
181
+ end
182
+ end
183
+
184
+ describe 'generates View file' do
185
+
186
+ end
187
+
188
+ describe 'generates Controller file' do
189
+ end
190
+ end
@@ -19,4 +19,16 @@ class RubeeAppTest < Minitest::Test
19
19
 
20
20
  assert_equal(404, last_response.status)
21
21
  end
22
+
23
+ def test_react_home
24
+ Rubee::Configuration.setup(env = :test) { _1.react = { on: true, env: } }
25
+
26
+ get('/home')
27
+
28
+ assert_equal(200, last_response.status)
29
+ assert_includes(last_response.body, '<div id="app">')
30
+ assert_includes(last_response.body, 'bundle.js')
31
+
32
+ Rubee::Configuration.setup(env = :test) { _1.react = { on: false, env: } }
33
+ end
22
34
  end
data/lib/tests/test.db CHANGED
Binary file
@@ -153,8 +153,13 @@ describe 'User model' do
153
153
  User.destroy_all(cascade: true)
154
154
  end
155
155
 
156
+ before do
157
+ User.destroy_all(cascade: true)
158
+ end
159
+
156
160
  describe 'when there are records' do
157
161
  it 'returns all records' do
162
+ # skip "This is Flaky test that blcoks dev, need to be fixed"
158
163
  user = User.new(email: 'ok-test@test.com', password: '123')
159
164
  user2 = User.new(email: 'ok-test2@test.com', password: '123')
160
165
  user.save