ru.Bee 1.3.2 → 1.4.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 (205) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rubee +114 -88
  3. data/lib/app/views/app.tsx +27 -0
  4. data/lib/app/views/index.html +47 -0
  5. data/lib/app/views/layout.erb +3 -3
  6. data/lib/app/views/utils/redirectToBackend.tsx +9 -0
  7. data/lib/app/views/welcome_show.erb +1 -1
  8. data/lib/config/base_configuration.rb +15 -6
  9. data/lib/config/routes.rb +2 -1
  10. data/lib/db/create_accounts.rb +8 -8
  11. data/lib/db/create_comments.rb +7 -7
  12. data/lib/db/create_posts.rb +8 -8
  13. data/lib/db/create_users.rb +8 -8
  14. data/lib/db/structure.rb +42 -42
  15. data/lib/esbuild.config.js +33 -0
  16. data/lib/inits/print_colors.rb +1 -1
  17. data/lib/js/app.js +13 -0
  18. data/lib/js/app.js.map +7 -0
  19. data/lib/js/bundle.js +26157 -0
  20. data/lib/js/bundle.js.map +7 -0
  21. data/lib/node_modules/@types/cookie/LICENSE +21 -0
  22. data/lib/node_modules/@types/cookie/README.md +15 -0
  23. data/lib/node_modules/@types/cookie/index.d.ts +154 -0
  24. data/lib/node_modules/@types/cookie/package.json +30 -0
  25. data/lib/node_modules/cookie/LICENSE +24 -0
  26. data/lib/node_modules/cookie/README.md +248 -0
  27. data/lib/node_modules/cookie/dist/index.d.ts +114 -0
  28. data/lib/node_modules/cookie/dist/index.js +239 -0
  29. data/lib/node_modules/cookie/dist/index.js.map +1 -0
  30. data/lib/node_modules/cookie/package.json +42 -0
  31. data/lib/node_modules/js-tokens/CHANGELOG.md +151 -0
  32. data/lib/node_modules/js-tokens/LICENSE +21 -0
  33. data/lib/node_modules/js-tokens/README.md +240 -0
  34. data/lib/node_modules/js-tokens/index.js +23 -0
  35. data/lib/node_modules/js-tokens/package.json +30 -0
  36. data/lib/node_modules/loose-envify/LICENSE +21 -0
  37. data/lib/node_modules/loose-envify/README.md +45 -0
  38. data/lib/node_modules/loose-envify/cli.js +16 -0
  39. data/lib/node_modules/loose-envify/custom.js +4 -0
  40. data/lib/node_modules/loose-envify/index.js +3 -0
  41. data/lib/node_modules/loose-envify/loose-envify.js +36 -0
  42. data/lib/node_modules/loose-envify/package.json +36 -0
  43. data/lib/node_modules/loose-envify/replace.js +65 -0
  44. data/lib/node_modules/react/LICENSE +21 -0
  45. data/lib/node_modules/react/README.md +37 -0
  46. data/lib/node_modules/react/cjs/react-jsx-dev-runtime.development.js +1315 -0
  47. data/lib/node_modules/react/cjs/react-jsx-dev-runtime.production.min.js +10 -0
  48. data/lib/node_modules/react/cjs/react-jsx-dev-runtime.profiling.min.js +10 -0
  49. data/lib/node_modules/react/cjs/react-jsx-runtime.development.js +1333 -0
  50. data/lib/node_modules/react/cjs/react-jsx-runtime.production.min.js +11 -0
  51. data/lib/node_modules/react/cjs/react-jsx-runtime.profiling.min.js +11 -0
  52. data/lib/node_modules/react/cjs/react.development.js +2740 -0
  53. data/lib/node_modules/react/cjs/react.production.min.js +26 -0
  54. data/lib/node_modules/react/cjs/react.shared-subset.development.js +20 -0
  55. data/lib/node_modules/react/cjs/react.shared-subset.production.min.js +10 -0
  56. data/lib/node_modules/react/index.js +7 -0
  57. data/lib/node_modules/react/jsx-dev-runtime.js +7 -0
  58. data/lib/node_modules/react/jsx-runtime.js +7 -0
  59. data/lib/node_modules/react/package.json +47 -0
  60. data/lib/node_modules/react/react.shared-subset.js +7 -0
  61. data/lib/node_modules/react/umd/react.development.js +3343 -0
  62. data/lib/node_modules/react/umd/react.production.min.js +31 -0
  63. data/lib/node_modules/react/umd/react.profiling.min.js +31 -0
  64. data/lib/node_modules/react-dom/LICENSE +21 -0
  65. data/lib/node_modules/react-dom/README.md +60 -0
  66. data/lib/node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js +7029 -0
  67. data/lib/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js +93 -0
  68. data/lib/node_modules/react-dom/cjs/react-dom-server-legacy.node.development.js +7093 -0
  69. data/lib/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.min.js +101 -0
  70. data/lib/node_modules/react-dom/cjs/react-dom-server.browser.development.js +7014 -0
  71. data/lib/node_modules/react-dom/cjs/react-dom-server.browser.production.min.js +96 -0
  72. data/lib/node_modules/react-dom/cjs/react-dom-server.node.development.js +7070 -0
  73. data/lib/node_modules/react-dom/cjs/react-dom-server.node.production.min.js +102 -0
  74. data/lib/node_modules/react-dom/cjs/react-dom-test-utils.development.js +1763 -0
  75. data/lib/node_modules/react-dom/cjs/react-dom-test-utils.production.min.js +40 -0
  76. data/lib/node_modules/react-dom/cjs/react-dom.development.js +29923 -0
  77. data/lib/node_modules/react-dom/cjs/react-dom.production.min.js +322 -0
  78. data/lib/node_modules/react-dom/cjs/react-dom.profiling.min.js +366 -0
  79. data/lib/node_modules/react-dom/client.js +25 -0
  80. data/lib/node_modules/react-dom/index.js +38 -0
  81. data/lib/node_modules/react-dom/package.json +62 -0
  82. data/lib/node_modules/react-dom/profiling.js +38 -0
  83. data/lib/node_modules/react-dom/server.browser.js +17 -0
  84. data/lib/node_modules/react-dom/server.js +3 -0
  85. data/lib/node_modules/react-dom/server.node.js +17 -0
  86. data/lib/node_modules/react-dom/test-utils.js +7 -0
  87. data/lib/node_modules/react-dom/umd/react-dom-server-legacy.browser.development.js +7026 -0
  88. data/lib/node_modules/react-dom/umd/react-dom-server-legacy.browser.production.min.js +75 -0
  89. data/lib/node_modules/react-dom/umd/react-dom-server.browser.development.js +7011 -0
  90. data/lib/node_modules/react-dom/umd/react-dom-server.browser.production.min.js +76 -0
  91. data/lib/node_modules/react-dom/umd/react-dom-test-utils.development.js +1759 -0
  92. data/lib/node_modules/react-dom/umd/react-dom-test-utils.production.min.js +33 -0
  93. data/lib/node_modules/react-dom/umd/react-dom.development.js +29924 -0
  94. data/lib/node_modules/react-dom/umd/react-dom.production.min.js +267 -0
  95. data/lib/node_modules/react-dom/umd/react-dom.profiling.min.js +285 -0
  96. data/lib/node_modules/react-router/CHANGELOG.md +1526 -0
  97. data/lib/node_modules/react-router/LICENSE.md +23 -0
  98. data/lib/node_modules/react-router/README.md +7 -0
  99. data/lib/node_modules/react-router/dist/development/chunk-KNED5TY2.mjs +10476 -0
  100. data/lib/node_modules/react-router/dist/development/dom-export.d.mts +23 -0
  101. data/lib/node_modules/react-router/dist/development/dom-export.d.ts +23 -0
  102. data/lib/node_modules/react-router/dist/development/dom-export.js +6111 -0
  103. data/lib/node_modules/react-router/dist/development/dom-export.mjs +234 -0
  104. data/lib/node_modules/react-router/dist/development/fog-of-war-1hWhK5ey.d.mts +1690 -0
  105. data/lib/node_modules/react-router/dist/development/fog-of-war-oa9CGk10.d.ts +1690 -0
  106. data/lib/node_modules/react-router/dist/development/future-ldDp5FKH.d.mts +21 -0
  107. data/lib/node_modules/react-router/dist/development/future-ldDp5FKH.d.ts +21 -0
  108. data/lib/node_modules/react-router/dist/development/index.d.mts +841 -0
  109. data/lib/node_modules/react-router/dist/development/index.d.ts +841 -0
  110. data/lib/node_modules/react-router/dist/development/index.js +10624 -0
  111. data/lib/node_modules/react-router/dist/development/index.mjs +242 -0
  112. data/lib/node_modules/react-router/dist/development/lib/types/route-module.d.mts +209 -0
  113. data/lib/node_modules/react-router/dist/development/lib/types/route-module.d.ts +209 -0
  114. data/lib/node_modules/react-router/dist/development/lib/types/route-module.js +28 -0
  115. data/lib/node_modules/react-router/dist/development/lib/types/route-module.mjs +10 -0
  116. data/lib/node_modules/react-router/dist/development/route-data-5OzAzQtT.d.mts +1716 -0
  117. data/lib/node_modules/react-router/dist/development/route-data-5OzAzQtT.d.ts +1716 -0
  118. data/lib/node_modules/react-router/dist/production/chunk-ZIM7OIE3.mjs +10476 -0
  119. data/lib/node_modules/react-router/dist/production/dom-export.d.mts +23 -0
  120. data/lib/node_modules/react-router/dist/production/dom-export.d.ts +23 -0
  121. data/lib/node_modules/react-router/dist/production/dom-export.js +6111 -0
  122. data/lib/node_modules/react-router/dist/production/dom-export.mjs +234 -0
  123. data/lib/node_modules/react-router/dist/production/fog-of-war-1hWhK5ey.d.mts +1690 -0
  124. data/lib/node_modules/react-router/dist/production/fog-of-war-oa9CGk10.d.ts +1690 -0
  125. data/lib/node_modules/react-router/dist/production/future-ldDp5FKH.d.mts +21 -0
  126. data/lib/node_modules/react-router/dist/production/future-ldDp5FKH.d.ts +21 -0
  127. data/lib/node_modules/react-router/dist/production/index.d.mts +841 -0
  128. data/lib/node_modules/react-router/dist/production/index.d.ts +841 -0
  129. data/lib/node_modules/react-router/dist/production/index.js +10624 -0
  130. data/lib/node_modules/react-router/dist/production/index.mjs +242 -0
  131. data/lib/node_modules/react-router/dist/production/lib/types/route-module.d.mts +209 -0
  132. data/lib/node_modules/react-router/dist/production/lib/types/route-module.d.ts +209 -0
  133. data/lib/node_modules/react-router/dist/production/lib/types/route-module.js +28 -0
  134. data/lib/node_modules/react-router/dist/production/lib/types/route-module.mjs +10 -0
  135. data/lib/node_modules/react-router/dist/production/route-data-5OzAzQtT.d.mts +1716 -0
  136. data/lib/node_modules/react-router/dist/production/route-data-5OzAzQtT.d.ts +1716 -0
  137. data/lib/node_modules/react-router/package.json +116 -0
  138. data/lib/node_modules/react-router-dom/LICENSE.md +23 -0
  139. data/lib/node_modules/react-router-dom/README.md +6 -0
  140. data/lib/node_modules/react-router-dom/dist/index.d.mts +2 -0
  141. data/lib/node_modules/react-router-dom/dist/index.d.ts +2 -0
  142. data/lib/node_modules/react-router-dom/dist/index.js +45 -0
  143. data/lib/node_modules/react-router-dom/dist/index.mjs +18 -0
  144. data/lib/node_modules/react-router-dom/package.json +82 -0
  145. data/lib/node_modules/scheduler/LICENSE +21 -0
  146. data/lib/node_modules/scheduler/README.md +9 -0
  147. data/lib/node_modules/scheduler/cjs/scheduler-unstable_mock.development.js +700 -0
  148. data/lib/node_modules/scheduler/cjs/scheduler-unstable_mock.production.min.js +20 -0
  149. data/lib/node_modules/scheduler/cjs/scheduler-unstable_post_task.development.js +207 -0
  150. data/lib/node_modules/scheduler/cjs/scheduler-unstable_post_task.production.min.js +14 -0
  151. data/lib/node_modules/scheduler/cjs/scheduler.development.js +634 -0
  152. data/lib/node_modules/scheduler/cjs/scheduler.production.min.js +19 -0
  153. data/lib/node_modules/scheduler/index.js +7 -0
  154. data/lib/node_modules/scheduler/package.json +36 -0
  155. data/lib/node_modules/scheduler/umd/scheduler-unstable_mock.development.js +699 -0
  156. data/lib/node_modules/scheduler/umd/scheduler-unstable_mock.production.min.js +19 -0
  157. data/lib/node_modules/scheduler/umd/scheduler.development.js +152 -0
  158. data/lib/node_modules/scheduler/umd/scheduler.production.min.js +146 -0
  159. data/lib/node_modules/scheduler/umd/scheduler.profiling.min.js +146 -0
  160. data/lib/node_modules/scheduler/unstable_mock.js +7 -0
  161. data/lib/node_modules/scheduler/unstable_post_task.js +7 -0
  162. data/lib/node_modules/set-cookie-parser/LICENSE +21 -0
  163. data/lib/node_modules/set-cookie-parser/README.md +202 -0
  164. data/lib/node_modules/set-cookie-parser/lib/set-cookie.js +224 -0
  165. data/lib/node_modules/set-cookie-parser/package.json +45 -0
  166. data/lib/node_modules/turbo-stream/LICENSE +7 -0
  167. data/lib/node_modules/turbo-stream/README.md +31 -0
  168. data/lib/node_modules/turbo-stream/dist/flatten.d.ts +2 -0
  169. data/lib/node_modules/turbo-stream/dist/flatten.js +203 -0
  170. data/lib/node_modules/turbo-stream/dist/turbo-stream.d.ts +13 -0
  171. data/lib/node_modules/turbo-stream/dist/turbo-stream.js +207 -0
  172. data/lib/node_modules/turbo-stream/dist/turbo-stream.mjs +673 -0
  173. data/lib/node_modules/turbo-stream/dist/unflatten.d.ts +2 -0
  174. data/lib/node_modules/turbo-stream/dist/unflatten.js +243 -0
  175. data/lib/node_modules/turbo-stream/dist/utils.d.ts +44 -0
  176. data/lib/node_modules/turbo-stream/dist/utils.js +55 -0
  177. data/lib/node_modules/turbo-stream/package.json +50 -0
  178. data/lib/package-lock.json +133 -0
  179. data/lib/package.json +12 -0
  180. data/lib/rubee/async/asyncable.rb +2 -2
  181. data/lib/rubee/async/sidekiq_async.rb +11 -11
  182. data/lib/rubee/async/thread_async.rb +1 -1
  183. data/lib/rubee/async/thread_pool.rb +2 -2
  184. data/lib/rubee/controllers/base_controller.rb +44 -21
  185. data/lib/rubee/controllers/extensions/auth_tokenable.rb +10 -8
  186. data/lib/rubee/controllers/extensions/middlewarable.rb +1 -1
  187. data/lib/rubee/controllers/middlewares/auth_token_middleware.rb +12 -8
  188. data/lib/rubee/extensions/hookable.rb +3 -6
  189. data/lib/rubee/extensions/serializable.rb +3 -3
  190. data/lib/rubee/models/database_objectable.rb +11 -12
  191. data/lib/rubee/models/sequel_object.rb +23 -24
  192. data/lib/rubee.rb +106 -55
  193. data/lib/tests/account_model_test.rb +4 -4
  194. data/lib/tests/auth_tokenable_test.rb +6 -6
  195. data/lib/tests/comment_model_test.rb +7 -7
  196. data/lib/tests/example_models/account.rb +1 -0
  197. data/lib/tests/example_models/comment.rb +1 -0
  198. data/lib/tests/example_models/post.rb +1 -0
  199. data/lib/tests/example_models/user.rb +1 -0
  200. data/lib/tests/rubeeapp_test.rb +21 -6
  201. data/lib/tests/test.db +0 -0
  202. data/lib/tests/test_helper.rb +3 -5
  203. data/lib/tests/user_model_test.rb +71 -54
  204. data/readme.md +104 -2
  205. metadata +170 -3
data/lib/rubee.rb CHANGED
@@ -1,14 +1,20 @@
1
- require "singleton"
2
- require "bundler/setup"
1
+ require 'singleton'
2
+ require 'bundler/setup'
3
3
  require 'bundler'
4
4
 
5
- Bundler.require(:default) rescue nil
5
+ begin
6
+ Bundler.require(:default)
7
+ rescue StandardError
8
+ nil
9
+ end
6
10
 
7
11
  module Rubee
8
12
  APP_ROOT = File.expand_path(Dir.pwd) unless defined?(APP_ROOT)
9
- IMAGE_DIR = File.join(APP_ROOT, 'images') unless defined?(IMAGE_DIR)
10
13
  PROJECT_NAME = File.basename(APP_ROOT) unless defined?(PROJECT_NAME)
11
- VERSION = '1.3.1'
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'
12
18
 
13
19
  class Application
14
20
  include Singleton
@@ -19,16 +25,25 @@ module Rubee
19
25
  # register images paths
20
26
  request = Rack::Request.new(env)
21
27
  # Add default path for images
22
- 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
23
33
  # define route
24
34
  route = Router.route_for(request)
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
41
+ return [404, { 'content-type' => 'text/plain' }, ['Route not found']] unless route
25
42
  # init controller class
26
- return [404, { "content-type" => "text/plain" }, ["Route not found"]] unless route
27
-
28
- if route[:namespace]
29
- controller_class = "#{route[:namespace]}::#{route[:controller].capitalize}Controller"
43
+ controller_class = if route[:namespace]
44
+ "#{route[:namespace]}::#{route[:controller].capitalize}Controller"
30
45
  else
31
- controller_class = "#{route[:controller].capitalize}Controller"
46
+ "#{route[:controller].capitalize}Controller"
32
47
  end
33
48
  # instantiate controller
34
49
  controller = Object.const_get(controller_class).new(request, route)
@@ -44,15 +59,15 @@ module Rubee
44
59
 
45
60
  @configuraiton = {
46
61
  development: {
47
- database_url: "",
48
- port: 7000
62
+ database_url: '',
63
+ port: 7000,
49
64
  },
50
65
  production: {},
51
- test: {}
66
+ test: {},
52
67
  }
53
68
 
54
69
  class << self
55
- def setup(env)
70
+ def setup(_env)
56
71
  yield(self)
57
72
  end
58
73
 
@@ -64,10 +79,19 @@ module Rubee
64
79
  @configuraiton[args[:env].to_sym][:async_adapter] = args[:async_adapter]
65
80
  end
66
81
 
67
- def method_missing(method_name, *args, &block)
68
- if method_name.to_s.start_with?("get_")
69
- @configuraiton[ENV['RACK_ENV']&.to_sym || :development]&.[](method_name.to_s.delete_prefix("get_").to_sym)
70
- end
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
+
91
+ def method_missing(method_name, *_args)
92
+ return unless method_name.to_s.start_with?('get_')
93
+
94
+ @configuraiton[ENV['RACK_ENV']&.to_sym || :development]&.[](method_name.to_s.delete_prefix('get_').to_sym)
71
95
  end
72
96
 
73
97
  def envs
@@ -79,7 +103,7 @@ module Rubee
79
103
  class Router
80
104
  include Singleton
81
105
 
82
- HTTP_METHODS = [:get, :post, :put, :patch, :delete, :head, :connect, :options, :trace].freeze
106
+ HTTP_METHODS = %i[get post put patch delete head connect options trace].freeze
83
107
 
84
108
  attr_reader :request, :routes
85
109
 
@@ -92,19 +116,19 @@ module Rubee
92
116
 
93
117
  def route_for(request)
94
118
  puts request.request_method
95
- method = (request.params["_method"] || request.request_method).downcase.to_sym
119
+ method = (request.params['_method'] || request.request_method).downcase.to_sym
96
120
  @routes.find do |route|
97
121
  return route if request.path == route[:path] && request.request_method&.downcase&.to_sym == route[:method]
98
122
 
99
123
  pattern = route[:path].gsub(/{.*?}/, '([^/]+)')
100
- regex = %r{^#{pattern}$}
124
+ regex = /^#{pattern}$/
101
125
  regex.match?(request.path) && method.to_s == route[:method].to_s
102
126
  end
103
127
  end
104
128
 
105
129
  def set_route(path, to:, method: __method__, **args)
106
- controller, action = to.split("#")
107
- @routes.delete_if { |route| route[:path] == path && route[:method] == method }
130
+ controller, action = to.split('#')
131
+ @routes.delete_if { |route| route[:path] == path && route[:method] == method }
108
132
  @routes << { path:, controller:, action:, method:, **args }
109
133
  end
110
134
 
@@ -116,10 +140,9 @@ module Rubee
116
140
  end
117
141
  end
118
142
 
119
-
120
143
  class Autoload
121
144
  class << self
122
- def call(black_list=[])
145
+ def call(black_list = [])
123
146
  # autoload all rbs
124
147
  root_directory = File.dirname(__FILE__)
125
148
  priority_order_require(root_directory, black_list)
@@ -149,20 +172,20 @@ module Rubee
149
172
  require_relative file unless black_list.include?("#{file}.rb")
150
173
  end
151
174
  # app config and routes
152
- lib = PROJECT_NAME == 'rubee' ? 'lib/' : ''
153
- require_relative File.join(APP_ROOT, lib, "config/base_configuration") unless black_list.include?('base_configuration.rb')
175
+ unless black_list.include?('base_configuration.rb')
176
+ require_relative File.join(APP_ROOT, LIB,
177
+ 'config/base_configuration')
178
+ end
154
179
  # This is necessary prerequisitedb init step
155
- unless defined?(Rubee::SequelObject::DB)
156
- if PROJECT_NAME == 'rubee'
157
- Rubee::Configuration.setup(env=:test) do |config|
158
- config.database_url = { url: "sqlite://lib/tests/test.db", env: }
159
- end
180
+ if !defined?(Rubee::SequelObject::DB) && (PROJECT_NAME == 'rubee')
181
+ Rubee::Configuration.setup(env = :test) do |config|
182
+ config.database_url = { url: 'sqlite://lib/tests/test.db', env: }
160
183
  end
161
184
  end
162
185
 
163
- 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')
164
187
  # rubee extensions
165
- Dir[File.join(root_directory, "rubee/extensions/**", '*.rb')].each do |file|
188
+ Dir[File.join(root_directory, 'rubee/extensions/**', '*.rb')].each do |file|
166
189
  require_relative file unless black_list.include?("#{file}.rb")
167
190
  end
168
191
  # rubee controllers
@@ -172,21 +195,31 @@ module Rubee
172
195
  Dir[File.join(root_directory, 'rubee/controllers/extensions/**', '*.rb')].each do |file|
173
196
  require_relative file unless black_list.include?("#{file}.rb")
174
197
  end
175
- require_relative File.join(root_directory, "rubee/controllers/base_controller") unless black_list.include?('base_controller.rb')
198
+ unless black_list.include?('base_controller.rb')
199
+ require_relative File.join(root_directory,
200
+ 'rubee/controllers/base_controller')
201
+ end
176
202
  # rubee models
177
- require_relative File.join(root_directory, "rubee/models/database_objectable") unless black_list.include?('database_objectable.rb')
178
- require_relative File.join(root_directory, "rubee/models/sequel_object") unless black_list.include?('sequel_object.rb')
203
+ unless black_list.include?('database_objectable.rb')
204
+ require_relative File.join(root_directory,
205
+ 'rubee/models/database_objectable')
206
+ end
207
+ return if black_list.include?('sequel_object.rb')
208
+
209
+ require_relative File.join(root_directory,
210
+ 'rubee/models/sequel_object')
179
211
  end
180
212
  end
181
213
  end
182
214
 
183
215
  class Generator
184
- def initialize(model_name, attributes, controller_name, action_name)
216
+ def initialize(model_name, attributes, controller_name, action_name, **options)
185
217
  @model_name = model_name&.downcase
186
218
  @attributes = attributes
187
- @plural_name = "#{controller_name.to_s.gsub("Controller", "").downcase}"
219
+ @plural_name = controller_name.to_s.gsub('Controller', '').downcase.to_s
188
220
  @action_name = action_name
189
221
  @controller_name = controller_name
222
+ @react = options[:react] || {}
190
223
  end
191
224
 
192
225
  def call
@@ -199,7 +232,7 @@ module Rubee
199
232
  private
200
233
 
201
234
  def generate_model
202
- model_file = File.join("app/models/#{@model_name}.rb")
235
+ model_file = File.join(Rubee::APP_ROOT, Rubee::LIB, "app/models/#{@model_name}.rb")
203
236
  if File.exist?(model_file)
204
237
  puts "Model #{@model_name} already exists. Remove it if you want to regenerate"
205
238
  return
@@ -207,16 +240,16 @@ module Rubee
207
240
 
208
241
  content = <<~RUBY
209
242
  class #{@model_name.capitalize} < Rubee::SequelObject
210
- attr_accessor #{@attributes.map { |hash| ":#{hash[:name]}" }.join(", ")}
243
+ attr_accessor #{@attributes.map { |hash| ":#{hash[:name]}" }.join(', ')}
211
244
  end
212
245
  RUBY
213
246
 
214
247
  File.open(model_file, 'w') { |file| file.write(content) }
215
- color_puts "Model #{@model_name} created", color: :green
248
+ color_puts("Model #{@model_name} created", color: :green)
216
249
  end
217
250
 
218
251
  def generate_controller
219
- 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")
220
253
  if File.exist?(controller_file)
221
254
  puts "Controller #{@plural_name} already exists. Remove it if you want to regenerate"
222
255
  return
@@ -231,26 +264,45 @@ module Rubee
231
264
  RUBY
232
265
 
233
266
  File.open(controller_file, 'w') { |file| file.write(content) }
234
- color_puts "Controller #{@plural_name} created", color: :green
267
+ color_puts("Controller #{@plural_name} created", color: :green)
235
268
  end
236
269
 
237
270
  def generate_view
238
- 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
+
239
295
  if File.exist?(view_file)
240
- 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"
241
297
  return
242
298
  end
243
299
 
244
- content = <<~ERB
245
- <h1>#{@plural_name}_#{@action_name} View</h1>
246
- ERB
247
-
248
300
  File.open(view_file, 'w') { |file| file.write(content) }
249
- color_puts "View #{@plural_name}_#{@action_name} created", color: :green
301
+ color_puts("View #{name} created", color: :green)
250
302
  end
251
303
 
252
304
  def generate_db_file
253
- db_file = File.join("db/create_#{@plural_name}.rb")
305
+ db_file = File.join(Rubee::APP_ROOT, Rubee::LIB, "db/create_#{@plural_name}.rb")
254
306
  if File.exist?(db_file)
255
307
  puts "DB file for #{@plural_name} already exists. Remove it if you want to regenerate"
256
308
  return
@@ -264,8 +316,7 @@ module Rubee
264
316
  RUBY
265
317
 
266
318
  File.open(db_file, 'w') { |file| file.write(content) }
267
- color_puts "DB file for #{@plural_name} created", color: :green
319
+ color_puts("DB file for #{@plural_name} created", color: :green)
268
320
  end
269
321
  end
270
322
  end
271
-
@@ -3,16 +3,16 @@ require_relative 'test_helper'
3
3
  describe 'Account model' do
4
4
  describe 'holds :user' do
5
5
  after do
6
- Account.destroy_all cascade: true
6
+ Account.destroy_all(cascade: true)
7
7
  end
8
8
 
9
9
  describe 'when it holds user_id' do
10
10
  it 'returns associated User record' do
11
- user = User.new(email: "ok-test@test.com", password: "123")
11
+ user = User.new(email: 'ok-test@test.com', password: '123')
12
12
  user.save
13
- account = Account.new(user_id: user.id, addres: "test")
13
+ account = Account.new(user_id: user.id, addres: 'test')
14
14
  account.save
15
- _(account.user.id).must_equal user.id
15
+ _(account.user.id).must_equal(user.id)
16
16
  end
17
17
  end
18
18
  end
@@ -13,17 +13,17 @@ class RubeeAppTest < Minitest::Test
13
13
 
14
14
  def teardown
15
15
  # detach auth methods
16
- if WelcomeController.instance_variable_defined?(:@auth_methods)
17
- WelcomeController.send(:remove_instance_variable, :@auth_methods)
18
- end
16
+ return unless WelcomeController.instance_variable_defined?(:@auth_methods)
17
+
18
+ WelcomeController.send(:remove_instance_variable, :@auth_methods)
19
19
  end
20
20
 
21
21
  def test_welcome_controller_included_auth_tokenable
22
22
  WelcomeController.include(Rubee::AuthTokenable)
23
- WelcomeController.auth_methods :show
23
+ WelcomeController.auth_methods(:show)
24
24
 
25
- get '/'
25
+ get('/')
26
26
 
27
- assert_equal last_response.status, 401
27
+ assert_equal(last_response.status, 401)
28
28
  end
29
29
  end
@@ -3,32 +3,32 @@ require_relative 'test_helper'
3
3
  describe 'Comment model' do
4
4
  describe 'owns_many :users, over: :posts' do
5
5
  before do
6
- comment = Comment.new(text: "test")
6
+ comment = Comment.new(text: 'test')
7
7
  comment.save
8
- user = User.new(email: "ok-test@test.com", password: "123")
8
+ user = User.new(email: 'ok-test@test.com', password: '123')
9
9
  user.save
10
10
  post = Post.new(user_id: user.id, comment_id: comment.id)
11
11
  post.save
12
12
  end
13
13
 
14
14
  after do
15
- Comment.destroy_all cascade: true
15
+ Comment.destroy_all(cascade: true)
16
16
  end
17
17
 
18
18
  describe 'when there are associated comment records' do
19
19
  it 'returns all records' do
20
- _(Comment.where(text: "test").last.users.count).must_equal 1
21
- _(Comment.where(text: "test").last.users.first.email).must_equal "ok-test@test.com"
20
+ _(Comment.where(text: 'test').last.users.count).must_equal(1)
21
+ _(Comment.where(text: 'test').last.users.first.email).must_equal('ok-test@test.com')
22
22
  end
23
23
  end
24
24
 
25
25
  describe 'sequel dataset query' do
26
26
  it 'returns all records' do
27
27
  result = Comment.dataset.join(:posts, comment_id: :id)
28
- .where(comment_id: Comment.where(text: "test").last.id)
28
+ .where(comment_id: Comment.where(text: 'test').last.id)
29
29
  .then { |dataset| Comment.serialize(dataset) }
30
30
 
31
- _(result.first.text).must_equal "test"
31
+ _(result.first.text).must_equal('test')
32
32
  end
33
33
  end
34
34
  end
@@ -1,4 +1,5 @@
1
1
  class Account < Rubee::SequelObject
2
2
  attr_accessor :id, :addres, :user_id
3
+
3
4
  holds :user
4
5
  end
@@ -1,4 +1,5 @@
1
1
  class Comment < Rubee::SequelObject
2
2
  attr_accessor :id, :text, :user_id
3
+
3
4
  owns_many :users, over: :posts
4
5
  end
@@ -1,5 +1,6 @@
1
1
  class Post < Rubee::SequelObject
2
2
  attr_accessor :id, :user_id, :comment_id
3
+
3
4
  holds :comment
4
5
  holds :user
5
6
  end
@@ -1,4 +1,5 @@
1
1
  class User < Rubee::SequelObject
2
2
  attr_accessor :id, :email, :password
3
+
3
4
  owns_many :accounts, cascade: true
4
5
  end
@@ -7,18 +7,33 @@ class RubeeAppTest < Minitest::Test
7
7
  Rubee::Application.instance
8
8
  end
9
9
 
10
+ def setup
11
+ Rubee::Configuration.setup(env = :test) { _1.react = { on: false, env: } }
12
+ end
13
+
14
+ def teardown
15
+ Rubee::Configuration.setup(env = :test) { _1.react = { on: false, env: } }
16
+ end
10
17
 
11
18
  def test_welcome_route
12
- get '/'
19
+ get('/')
13
20
 
14
- assert_equal 200, last_response.status, "Unexpected response: #{last_response.body}"
15
- assert_includes last_response.body, 'All set up and running!'
21
+ assert_equal(200, last_response.status, "Unexpected response: #{last_response.body}")
22
+ assert_includes(last_response.body, 'All set up and running!')
16
23
  end
17
24
 
18
-
19
25
  def test_not_found_route
20
- get '/random'
26
+ get('/random')
27
+
28
+ assert_equal(404, last_response.status)
29
+ end
30
+
31
+ def test_react_home
32
+ Rubee::Configuration.setup(env = :test) { _1.react = { on: true, env: } }
33
+ get('/home')
21
34
 
22
- assert_equal 404, last_response.status
35
+ assert_equal(200, last_response.status)
36
+ assert_includes(last_response.body, '<div id="app">')
37
+ assert_includes(last_response.body, 'bundle.js')
23
38
  end
24
39
  end
data/lib/tests/test.db CHANGED
Binary file
@@ -1,4 +1,4 @@
1
- require "bundler/setup"
1
+ require 'bundler/setup'
2
2
  Bundler.require(:test)
3
3
 
4
4
  require 'minitest/autorun'
@@ -6,9 +6,7 @@ require 'rack/test'
6
6
  require_relative '../../lib/rubee'
7
7
 
8
8
  Rubee::Autoload.call
9
- Rubee::Configuration.setup(env=:test) do |config|
10
- config.database_url = { url: "sqlite://lib/tests/test.db", env: }
9
+ Rubee::Configuration.setup(env = :test) do |config|
10
+ config.database_url = { url: 'sqlite://lib/tests/test.db', env: }
11
11
  end
12
12
  Rubee::SequelObject.reconnect!
13
-
14
-