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/readme.md CHANGED
@@ -24,13 +24,13 @@ All greaet features are yet to come!
24
24
  - **Contract driven**: Define your API contracts in a simple, declarative manner. And generate the files for you.
25
25
  - **Fast**: Optimized for speed, providing a quick response to requests. Everything is relative, I know!
26
26
  - **Rack**: Rack backed. All Rack api is available for integration.
27
- - **Router**: Router driven - generates all required files from the routes.
28
27
  - **Databases**: Sqlite3, Postgres, Mysql and many more supported by sequel gem.
29
- - **Views**: Json, ERB and plain HTML
28
+ - **Views**: Json, ERB and plain HTML and ..
29
+ - **React** is supported out of the box as a rubee view
30
30
  - **Bundlable** Charge your ruBee with any gem you need and update your project with bundle.
31
31
  - **ORM** All models are natively ORM objects, however you can use it as a blueurpint for any datasources.
32
32
  - **Authentificatable** Add JWT authentification easily to any controller action.
33
- - **Hooks** Add logic before, after and around any action.
33
+ - **Hooks** Addlogic before, after and around any action.
34
34
  - **Test** Run all or selected tests witin minitest.
35
35
  - **Asyncable** Add async adapter and pick any popular background job queue enginee
36
36
 
@@ -50,8 +50,7 @@ cd my_project
50
50
  3. Install dependencies
51
51
 
52
52
  ***Prerequisites***<br />
53
- **ruBee** is using **Sqlite** as a default database. However you can pick up any other database supported by sequel gem.
54
- Aside that, make sure:
53
+ Make sure:
55
54
  **Ruby** language (3+) is installed
56
55
  **Bundler** is installed
57
56
 
@@ -66,35 +65,46 @@ rubee start
66
65
 
67
66
  5. Open your browser and go to http://localhost:7000
68
67
 
69
- ## Create API contract and generate files from the routes
70
- 1. Add the routes to the routes.rb
71
- ```bash
72
- Rubee::Router.draw do |router|
73
- ...
74
- # draw the contract
75
- router.get "/apples", to: "apples#index",
76
- model: {
77
- name: "apple",
78
- attributes: [
79
- { name: 'id', type: :integer },
80
- { name: 'colour', type: :string },
81
- { name: 'weight', type: :integer }
82
- ]
83
- }
84
- end
85
- ```
86
- 2. genrate the files
87
- ```bash
88
- rubee generate get /apples
89
- ```
90
- 3. This will generate the following files
68
+ ## Run the tests
91
69
  ```bash
92
- ./app/controllers/apples_controller.rb # Controller with respective action
93
- ./app/models/apple.rb # Model that acts as ORM
94
- ./app/views/apples_index.erb # ERB view that is rendered by the controller right away
95
- ./db/create_items.rb # Database migration file needed for creating repsective table
70
+ rubee test
96
71
  ```
97
- 4. Fill those files with the logic you need and run the server again!
72
+
73
+ ## Create API contract and generate files from the routes
74
+ 1. Add the routes to the routes.rb
75
+ ```ruby
76
+ Rubee::Router.draw do |router|
77
+ ...
78
+ # draw the contract
79
+ router.get "/apples", to: "apples#index",
80
+ model: {
81
+ name: "apple",
82
+ attributes: [
83
+ { name: 'id', type: :primary },
84
+ { name: 'colour', type: :string },
85
+ { name: 'weight', type: :integer }
86
+ ]
87
+ }
88
+ end
89
+ ```
90
+ 2. generate the files
91
+ ```bash
92
+ rubee generate get /apples
93
+ ```
94
+ - This will generate the following files
95
+ ```bash
96
+ ./app/controllers/apples_controller.rb # Controller with respective action
97
+ ./app/views/apples_index.erb # ERB view that is rendered by the controller right away
98
+ ./app/models/apple.rb # Model that acts as ORM
99
+ ./db/create_apples.rb # Database migration file needed for creating repsective table
100
+ ```
101
+
102
+ 3. Run the initial db migration
103
+ ```bash
104
+ rubee db run:all
105
+ ```
106
+
107
+ 5. Fill the generated files with the logic you need and run the server again!
98
108
 
99
109
  ## Model
100
110
  Model in ruBee is just simple ruby object that can be serilalized in the view
@@ -106,8 +116,8 @@ Here below is a simple example on how it can be used by rendering json from in m
106
116
  #ApplesController
107
117
 
108
118
  def show
109
- # in memory example
110
- apples = [Apple.new(colour: 'red', weight: '1lb'), Apple.new(colour: 'green', weight: '1lb')]
119
+ # In memory example
120
+ apples = [Apple.new(colour: 'red', weight: '1lb'), Apple.new(colour: 'green', weight: '1lb')]
111
121
  apple = apples.find { |apple| apple.colour = params[:colour] }
112
122
 
113
123
  response_with object: apple, type: :json
@@ -121,8 +131,8 @@ Just make sure Serializable module included in the target class.
121
131
  attr_accessor :id, :colour, :weight
122
132
  end
123
133
  ```
124
- However, you can simply turn it to ORM object by extending database class.
125
-
134
+ However, you can simply turn it to ORM object by extending database class Rubee::SequelObject.
135
+ This one is already serializable and charged with hooks.
126
136
  ```Ruby
127
137
  class Apple < Rubee::SequelObject
128
138
  attr_accessor :id, :colour, :weight
@@ -130,7 +140,6 @@ However, you can simply turn it to ORM object by extending database class.
130
140
  ```
131
141
 
132
142
  So in the controller you would need to query your target object now.
133
-
134
143
  ```ruby
135
144
  #ApplesController
136
145
 
@@ -275,10 +284,138 @@ irb(main):010> .then { |dataset| Comment.serialize(dataset) }
275
284
  This is recommended when you want to run one query and serialize it back to Rubee object only once.
276
285
  So it may safe some resources.
277
286
 
287
+ ## Routing
288
+ Rubee uses explicit routes. In the routes.rb yout can define routes for any of the main HTTP methods. You can also add any matched parameter denoted by a pair of `{ }` in the path of the route. Eg. `/path/to/{a_key}/somewhere`
289
+
290
+ ### Routing methods
291
+ ``` ruby
292
+ Rubee::Router.draw do |router|
293
+ router.get '/posts', to: 'posts#index'
294
+ router.post '/posts', to: 'posts#create'
295
+ router.patch '/posts/{id}', to: 'posts#update'
296
+ router.put '/posts/{id}', to: 'posts#update'
297
+ router.delete '/posts/{id}', to: 'posts#delete'
298
+ router.head '/posts', to: 'posts#index'
299
+ router.connect '/posts', to: 'posts#index'
300
+ router.options '/posts', to: 'posts#index'
301
+ router.trace '/posts', to: 'posts#index'
302
+ end
303
+ ```
304
+
305
+ As you see above every route is set up as:\
306
+ `route.http_method path, to: "controller#action", model { ...optional }`
278
307
 
308
+ ### Defining Model attributes in routes
309
+ One of Rubee's unique traits is where we can define our models for generation. You've seen above one possible way you can set up.
310
+
311
+ ```ruby
312
+ Rubee::Router.draw do |router|
313
+ ...
314
+ # draw the contract
315
+ router.get "/apples", to: "apples#index",
316
+ model: {
317
+ name: "apple",
318
+ attributes: [
319
+ { name: 'id', type: :primary },
320
+ { name: 'colour', type: :string },
321
+ { name: 'weight', type: :integer }
322
+ ]
323
+ }
324
+ end
325
+ ```
326
+
327
+ There are many other keys supported by us and Sequel to help generate your initial db files. Other supported attribute key types are:
328
+ ``` ruby
329
+ [
330
+ { name: 'key1', type: :primary},
331
+ { name: 'key2', type: :string },
332
+ { name: 'key3', type: :text },
333
+ { name: 'key4', type: :integer },
334
+ { name: 'key5', type: :date },
335
+ { name: 'key6', type: :datetime },
336
+ { name: 'key7', type: :time },
337
+ { name: 'key8', type: :boolean },
338
+ { name: 'key9', type: :bigint },
339
+ { name: 'key10', type: :decimal },
340
+ { name: 'key11', type: :foreign_key },
341
+ { name: 'key12', type: :index },
342
+ { name: 'key13', type: :unique }
343
+ ]
344
+ ```
345
+ Every attribute can have a set of options passed based on their related [Sequel schema definition](https://github.com/jeremyevans/sequel/blob/master/doc/schema_modification.rdoc).
346
+
347
+ An example of this would be for the type string: \
348
+ `{name: 'key', type: :string, options: { size: 50, fixed: true } }`
349
+
350
+ Gets translated to:\
351
+ `String :key, size: 50, fixed: true`
352
+
353
+ ### Generation from routes
354
+ As long as you have a `{ model: 'something' }` passed to your given route you can use it to generate your initial model files. If only a `path` and a `to:` are defined will only generate a controller and a corresponding view.
355
+
356
+ To generate based on a get route for the path /apples:\
357
+ `rubee generate get /apples` or `rubee gen get /apples`\
358
+
359
+ To generate base on a patch request for the path /apples/{id}:\
360
+ `rubee generate patch /apples/{id}` or `rubee gen patch /apples/{id}`
361
+
362
+
363
+ Example:
364
+ ```ruby
365
+ Rubee::Router.draw do |router|
366
+ ...
367
+ # draw the contract
368
+ router.get "/apples", to: "apples#index"
369
+ end
370
+ ```
371
+ Will Generate:
372
+ ```bash
373
+ ./app/controllers/apples_controller.rb # Controller with respective action
374
+ ./app/views/apples_index.erb # ERB view that is rendered by the controller right away
375
+ ```
376
+
377
+ Example 2:
378
+ ```ruby
379
+ Rubee::Router.draw do |router|
380
+ ...
381
+ # draw the contract
382
+ router.get "/apples", to: "apples#index", model: { name: 'apple' }
383
+ end
384
+ ```
385
+ Will generate:
386
+ ```bash
387
+ ./app/controllers/apples_controller.rb # Controller with respective action
388
+ ./app/views/apples_index.erb # ERB view that is rendered by the controller right away
389
+ ./app/models/apple.rb # Model that acts as ORM
390
+ ```
391
+
392
+ Example 3:
393
+ ```ruby
394
+ Rubee::Router.draw do |router|
395
+ ...
396
+ # draw the contract
397
+ router.get "/apples", to: "apples#index",
398
+ model: {
399
+ name: 'apple',
400
+ attributes: [
401
+ { name: 'id', type: :primary },
402
+ { name: 'colour', type: :string },
403
+ { name: 'weight', type: :integer }
404
+ ]
405
+ }
406
+ end
407
+ ```
408
+
409
+ Will generate:
410
+ ```bash
411
+ ./app/controllers/apples_controller.rb # Controller with respective action
412
+ ./app/models/apple.rb # Model that acts as ORM
413
+ ./app/views/apples_index.erb # ERB view that is rendered by the controller right away
414
+ ./db/create_items.rb # Database migration file needed for creating repsective table
415
+ ```
279
416
 
280
417
  ## Views
281
- View in ruBee is just a plain html/erb file that can be rendered from the controller.
418
+ View in ruBee is just a plain html/erb/react file that can be rendered from the controller.
282
419
 
283
420
  ## Templates over erb
284
421
 
@@ -311,6 +448,107 @@ end
311
448
  <p><%= locals[:object][:message] %></p> # displaying, passed in the controller object
312
449
  </div>
313
450
  ```
451
+
452
+ ## React as a view
453
+
454
+ React is supported out of the box in the rubee view.
455
+ Make react as a view representation layer is easy.
456
+
457
+ Prerequisites: Node and NPM are required
458
+
459
+ 1. Make sure after creating project and bundling you have installed react dependencies by
460
+
461
+ ```bash
462
+ rubee react prepare # this will install react related node modules
463
+ ```
464
+ 2. Make sure you have configured react in the configuration file
465
+
466
+ ```ruby
467
+ # config/base_configuration/rb
468
+ Rubee::Configuration.setup(env = :development) do |config|
469
+ config.database_url = { url: 'sqlite://db/development.db', env: }
470
+
471
+ # this line registers react as a view
472
+ config.react = { on: true, env: }
473
+ end
474
+ ```
475
+
476
+ 3. Start server by
477
+
478
+ ```bash
479
+ rubee start
480
+ ```
481
+
482
+ 3. Open your browser and navigate to http://localhost:3000/home
483
+
484
+ 4. You will see the react app running in the browser.
485
+
486
+ 5. For development purposes make sure you run `rubee start_dev` and in other terminal window run `rubee react watch`.
487
+ So that will ensure all cahnges applying instantly.
488
+
489
+ 6. You can generate react view from the route by indicating the view name explicitly
490
+
491
+ ```ruby
492
+ # config/routes.rb
493
+ Rubee::Router.draw do |router|
494
+ router.get('/', to: 'welcome#show') # override it for your app
495
+
496
+ router.get('/api/users', to: 'user#index', react: { view_name: 'users.tsx' })
497
+ # Please note /api/users is the backend endpoint
498
+ # For rendering generated /app/views/users.tsx file, you need to update react routes
499
+ end
500
+ ```
501
+
502
+ 7. Add logic to generated api controller
503
+
504
+ ```ruby
505
+ # app/controllers/api/user_controller.rb
506
+ class Api::UserController < Rubee::BaseController
507
+ def index
508
+ response_with object: User.all, type: :json
509
+ end
510
+ end
511
+ ```
512
+ 8. Register path in react routes
513
+
514
+ ```javascript
515
+ // app/views/app.tsx
516
+ <Router>
517
+ <Routes>
518
+ <Route path="/users" element={<Users />} />
519
+ <Route path="*" element={<NotFound />} />
520
+ </Routes>
521
+ </Router>
522
+ ```
523
+ 9. Fetch data from the backend in the users.tsx react component and display it in the browser http://localhost:3000/users
524
+
525
+ ```javascript
526
+ # app/views/users.tsx
527
+ import { useState, useEffect } from 'react';
528
+
529
+ function Users() {
530
+ const [users, setUsers] = useState([]);
531
+
532
+ useEffect(() => {
533
+ fetch('/api/users')
534
+ .then(response => response.json())
535
+ .then(data => setUsers(data));
536
+ }, []);
537
+
538
+ return (
539
+ <div>
540
+ <h1>Users</h1>
541
+ <ul>
542
+ {users.map(user => (
543
+ <li key={user.id}>id: {user.id}: {user.name}</li>
544
+ ))}
545
+ </ul>
546
+ </div>
547
+ );
548
+ }
549
+
550
+ ```
551
+
314
552
  ## Object hooks
315
553
 
316
554
  In ruBee by extending Hookable module any Ruby object can be charged with hooks (logic),
@@ -406,6 +644,8 @@ end
406
644
  ```bash
407
645
  rubee start # start the server
408
646
  rubee start_dev # start the server in dev mode, which restart server on changes
647
+ rubee react prepare # install react dependencies
648
+ rubee react watch # dev mode for react, works together with start_dev
409
649
  rubee stop # stop the server
410
650
  rubee restart # restart the server
411
651
  ```
@@ -417,6 +657,7 @@ rubee generate get /apples # generate controller view, model and migration if se
417
657
 
418
658
  ## Migraiton commands
419
659
  ```bash
660
+ rubee db run:all # run all migrations
420
661
  rubee db run:create_apples # where create_apples is the name of the migration file, located in /db folder
421
662
  rubee db structure # generate migration file for the database structure
422
663
  ```
@@ -424,6 +665,7 @@ rubee db structure # generate migration file for the database structure
424
665
  ## Rubee console
425
666
  ```bash
426
667
  rubee console # start the console
668
+ # you can reload the console by typing reload, so it will pick up latest changes
427
669
  ```
428
670
 
429
671
  ## Testing
@@ -431,6 +673,7 @@ rubee console # start the console
431
673
  rubee test # run all tests
432
674
  rubee test auth_tokenable_test.rb # run specific tests
433
675
  ```
676
+
434
677
  If you want to run any ruBee command within a specific ENV make sure you added it before a command.
435
678
  For instance if you want to run console in test environment you need to run the following command
436
679
 
@@ -514,30 +757,11 @@ TestAsyncRunnner.new.perform_async(options: {"email"=> "new@new.com", "password"
514
757
 
515
758
  ### Contributing
516
759
 
517
- You are more than welcome to contribute to ruBee! To do so, please follow these steps:
518
-
519
- 1. Fork the repository by clicking the "Fork" button on the GitHub page.
520
-
521
- 2. Clone your fork:
522
- ```bash
523
- git clone https://github.com/your-username/rubee.git
524
- ```
525
-
526
- 3. Create a new branch for your feature or bug fix:
527
- ```bash
528
- git checkout -b feature/your-feature-name
529
- ```
530
-
531
- 4. Make your changes and commit them with descriptive messages:
532
- ```bash
533
- git commit -m "Add feature: [brief description of feature]"
534
- ```
535
-
536
- 5. Push your changes to your fork:
537
- ```bash
538
- git push origin feature/your-feature-name
539
- ```
540
-
541
- 6. Submit a pull request to the main branch of the original repository.
760
+ If you are interested in contributing to ruBee,
761
+ please read the [Contributing](https://github.com/nucleom42/rubee/blob/main/CONTRIBUTING.md) guide.
762
+ Also feel free to open an [issue](https://github.com/nucleom42/rubee/issues) if you apot one.
763
+ Have an idea or you wnat to discuss something?
764
+ Please open a [discussion](https://github.com/nucleom42/rubee/discussions)
542
765
 
543
- Let's make it shine even brighter!
766
+ ## License
767
+ This project is released under the MIT License.
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ru.Bee
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleg Saltykov
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-04-12 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: bundler
@@ -43,7 +43,11 @@ files:
43
43
  - lib/Dockerfile
44
44
  - lib/app/controllers/welcome_controller.rb
45
45
  - lib/app/models/user.rb
46
+ - lib/app/views/app.tsx
47
+ - lib/app/views/apples_.erb
48
+ - lib/app/views/index.html
46
49
  - lib/app/views/layout.erb
50
+ - lib/app/views/utils/redirectToBackend.tsx
47
51
  - lib/app/views/welcome_header.erb
48
52
  - lib/app/views/welcome_show.erb
49
53
  - lib/config.ru
@@ -54,8 +58,172 @@ files:
54
58
  - lib/db/create_posts.rb
55
59
  - lib/db/create_users.rb
56
60
  - lib/db/structure.rb
61
+ - lib/esbuild.config.js
57
62
  - lib/images/rubee.svg
58
63
  - lib/inits/print_colors.rb
64
+ - lib/js/app.js
65
+ - lib/js/app.js.map
66
+ - lib/js/bundle.js
67
+ - lib/js/bundle.js.map
68
+ - lib/node_modules/@types/cookie/LICENSE
69
+ - lib/node_modules/@types/cookie/README.md
70
+ - lib/node_modules/@types/cookie/index.d.ts
71
+ - lib/node_modules/@types/cookie/package.json
72
+ - lib/node_modules/cookie/LICENSE
73
+ - lib/node_modules/cookie/README.md
74
+ - lib/node_modules/cookie/dist/index.d.ts
75
+ - lib/node_modules/cookie/dist/index.js
76
+ - lib/node_modules/cookie/dist/index.js.map
77
+ - lib/node_modules/cookie/package.json
78
+ - lib/node_modules/js-tokens/CHANGELOG.md
79
+ - lib/node_modules/js-tokens/LICENSE
80
+ - lib/node_modules/js-tokens/README.md
81
+ - lib/node_modules/js-tokens/index.js
82
+ - lib/node_modules/js-tokens/package.json
83
+ - lib/node_modules/loose-envify/LICENSE
84
+ - lib/node_modules/loose-envify/README.md
85
+ - lib/node_modules/loose-envify/cli.js
86
+ - lib/node_modules/loose-envify/custom.js
87
+ - lib/node_modules/loose-envify/index.js
88
+ - lib/node_modules/loose-envify/loose-envify.js
89
+ - lib/node_modules/loose-envify/package.json
90
+ - lib/node_modules/loose-envify/replace.js
91
+ - lib/node_modules/react-dom/LICENSE
92
+ - lib/node_modules/react-dom/README.md
93
+ - lib/node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js
94
+ - lib/node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js
95
+ - lib/node_modules/react-dom/cjs/react-dom-server-legacy.node.development.js
96
+ - lib/node_modules/react-dom/cjs/react-dom-server-legacy.node.production.min.js
97
+ - lib/node_modules/react-dom/cjs/react-dom-server.browser.development.js
98
+ - lib/node_modules/react-dom/cjs/react-dom-server.browser.production.min.js
99
+ - lib/node_modules/react-dom/cjs/react-dom-server.node.development.js
100
+ - lib/node_modules/react-dom/cjs/react-dom-server.node.production.min.js
101
+ - lib/node_modules/react-dom/cjs/react-dom-test-utils.development.js
102
+ - lib/node_modules/react-dom/cjs/react-dom-test-utils.production.min.js
103
+ - lib/node_modules/react-dom/cjs/react-dom.development.js
104
+ - lib/node_modules/react-dom/cjs/react-dom.production.min.js
105
+ - lib/node_modules/react-dom/cjs/react-dom.profiling.min.js
106
+ - lib/node_modules/react-dom/client.js
107
+ - lib/node_modules/react-dom/index.js
108
+ - lib/node_modules/react-dom/package.json
109
+ - lib/node_modules/react-dom/profiling.js
110
+ - lib/node_modules/react-dom/server.browser.js
111
+ - lib/node_modules/react-dom/server.js
112
+ - lib/node_modules/react-dom/server.node.js
113
+ - lib/node_modules/react-dom/test-utils.js
114
+ - lib/node_modules/react-dom/umd/react-dom-server-legacy.browser.development.js
115
+ - lib/node_modules/react-dom/umd/react-dom-server-legacy.browser.production.min.js
116
+ - lib/node_modules/react-dom/umd/react-dom-server.browser.development.js
117
+ - lib/node_modules/react-dom/umd/react-dom-server.browser.production.min.js
118
+ - lib/node_modules/react-dom/umd/react-dom-test-utils.development.js
119
+ - lib/node_modules/react-dom/umd/react-dom-test-utils.production.min.js
120
+ - lib/node_modules/react-dom/umd/react-dom.development.js
121
+ - lib/node_modules/react-dom/umd/react-dom.production.min.js
122
+ - lib/node_modules/react-dom/umd/react-dom.profiling.min.js
123
+ - lib/node_modules/react-router-dom/LICENSE.md
124
+ - lib/node_modules/react-router-dom/README.md
125
+ - lib/node_modules/react-router-dom/dist/index.d.mts
126
+ - lib/node_modules/react-router-dom/dist/index.d.ts
127
+ - lib/node_modules/react-router-dom/dist/index.js
128
+ - lib/node_modules/react-router-dom/dist/index.mjs
129
+ - lib/node_modules/react-router-dom/package.json
130
+ - lib/node_modules/react-router/CHANGELOG.md
131
+ - lib/node_modules/react-router/LICENSE.md
132
+ - lib/node_modules/react-router/README.md
133
+ - lib/node_modules/react-router/dist/development/chunk-KNED5TY2.mjs
134
+ - lib/node_modules/react-router/dist/development/dom-export.d.mts
135
+ - lib/node_modules/react-router/dist/development/dom-export.d.ts
136
+ - lib/node_modules/react-router/dist/development/dom-export.js
137
+ - lib/node_modules/react-router/dist/development/dom-export.mjs
138
+ - lib/node_modules/react-router/dist/development/fog-of-war-1hWhK5ey.d.mts
139
+ - lib/node_modules/react-router/dist/development/fog-of-war-oa9CGk10.d.ts
140
+ - lib/node_modules/react-router/dist/development/future-ldDp5FKH.d.mts
141
+ - lib/node_modules/react-router/dist/development/future-ldDp5FKH.d.ts
142
+ - lib/node_modules/react-router/dist/development/index.d.mts
143
+ - lib/node_modules/react-router/dist/development/index.d.ts
144
+ - lib/node_modules/react-router/dist/development/index.js
145
+ - lib/node_modules/react-router/dist/development/index.mjs
146
+ - lib/node_modules/react-router/dist/development/lib/types/route-module.d.mts
147
+ - lib/node_modules/react-router/dist/development/lib/types/route-module.d.ts
148
+ - lib/node_modules/react-router/dist/development/lib/types/route-module.js
149
+ - lib/node_modules/react-router/dist/development/lib/types/route-module.mjs
150
+ - lib/node_modules/react-router/dist/development/route-data-5OzAzQtT.d.mts
151
+ - lib/node_modules/react-router/dist/development/route-data-5OzAzQtT.d.ts
152
+ - lib/node_modules/react-router/dist/production/chunk-ZIM7OIE3.mjs
153
+ - lib/node_modules/react-router/dist/production/dom-export.d.mts
154
+ - lib/node_modules/react-router/dist/production/dom-export.d.ts
155
+ - lib/node_modules/react-router/dist/production/dom-export.js
156
+ - lib/node_modules/react-router/dist/production/dom-export.mjs
157
+ - lib/node_modules/react-router/dist/production/fog-of-war-1hWhK5ey.d.mts
158
+ - lib/node_modules/react-router/dist/production/fog-of-war-oa9CGk10.d.ts
159
+ - lib/node_modules/react-router/dist/production/future-ldDp5FKH.d.mts
160
+ - lib/node_modules/react-router/dist/production/future-ldDp5FKH.d.ts
161
+ - lib/node_modules/react-router/dist/production/index.d.mts
162
+ - lib/node_modules/react-router/dist/production/index.d.ts
163
+ - lib/node_modules/react-router/dist/production/index.js
164
+ - lib/node_modules/react-router/dist/production/index.mjs
165
+ - lib/node_modules/react-router/dist/production/lib/types/route-module.d.mts
166
+ - lib/node_modules/react-router/dist/production/lib/types/route-module.d.ts
167
+ - lib/node_modules/react-router/dist/production/lib/types/route-module.js
168
+ - lib/node_modules/react-router/dist/production/lib/types/route-module.mjs
169
+ - lib/node_modules/react-router/dist/production/route-data-5OzAzQtT.d.mts
170
+ - lib/node_modules/react-router/dist/production/route-data-5OzAzQtT.d.ts
171
+ - lib/node_modules/react-router/package.json
172
+ - lib/node_modules/react/LICENSE
173
+ - lib/node_modules/react/README.md
174
+ - lib/node_modules/react/cjs/react-jsx-dev-runtime.development.js
175
+ - lib/node_modules/react/cjs/react-jsx-dev-runtime.production.min.js
176
+ - lib/node_modules/react/cjs/react-jsx-dev-runtime.profiling.min.js
177
+ - lib/node_modules/react/cjs/react-jsx-runtime.development.js
178
+ - lib/node_modules/react/cjs/react-jsx-runtime.production.min.js
179
+ - lib/node_modules/react/cjs/react-jsx-runtime.profiling.min.js
180
+ - lib/node_modules/react/cjs/react.development.js
181
+ - lib/node_modules/react/cjs/react.production.min.js
182
+ - lib/node_modules/react/cjs/react.shared-subset.development.js
183
+ - lib/node_modules/react/cjs/react.shared-subset.production.min.js
184
+ - lib/node_modules/react/index.js
185
+ - lib/node_modules/react/jsx-dev-runtime.js
186
+ - lib/node_modules/react/jsx-runtime.js
187
+ - lib/node_modules/react/package.json
188
+ - lib/node_modules/react/react.shared-subset.js
189
+ - lib/node_modules/react/umd/react.development.js
190
+ - lib/node_modules/react/umd/react.production.min.js
191
+ - lib/node_modules/react/umd/react.profiling.min.js
192
+ - lib/node_modules/scheduler/LICENSE
193
+ - lib/node_modules/scheduler/README.md
194
+ - lib/node_modules/scheduler/cjs/scheduler-unstable_mock.development.js
195
+ - lib/node_modules/scheduler/cjs/scheduler-unstable_mock.production.min.js
196
+ - lib/node_modules/scheduler/cjs/scheduler-unstable_post_task.development.js
197
+ - lib/node_modules/scheduler/cjs/scheduler-unstable_post_task.production.min.js
198
+ - lib/node_modules/scheduler/cjs/scheduler.development.js
199
+ - lib/node_modules/scheduler/cjs/scheduler.production.min.js
200
+ - lib/node_modules/scheduler/index.js
201
+ - lib/node_modules/scheduler/package.json
202
+ - lib/node_modules/scheduler/umd/scheduler-unstable_mock.development.js
203
+ - lib/node_modules/scheduler/umd/scheduler-unstable_mock.production.min.js
204
+ - lib/node_modules/scheduler/umd/scheduler.development.js
205
+ - lib/node_modules/scheduler/umd/scheduler.production.min.js
206
+ - lib/node_modules/scheduler/umd/scheduler.profiling.min.js
207
+ - lib/node_modules/scheduler/unstable_mock.js
208
+ - lib/node_modules/scheduler/unstable_post_task.js
209
+ - lib/node_modules/set-cookie-parser/LICENSE
210
+ - lib/node_modules/set-cookie-parser/README.md
211
+ - lib/node_modules/set-cookie-parser/lib/set-cookie.js
212
+ - lib/node_modules/set-cookie-parser/package.json
213
+ - lib/node_modules/turbo-stream/LICENSE
214
+ - lib/node_modules/turbo-stream/README.md
215
+ - lib/node_modules/turbo-stream/dist/flatten.d.ts
216
+ - lib/node_modules/turbo-stream/dist/flatten.js
217
+ - lib/node_modules/turbo-stream/dist/turbo-stream.d.ts
218
+ - lib/node_modules/turbo-stream/dist/turbo-stream.js
219
+ - lib/node_modules/turbo-stream/dist/turbo-stream.mjs
220
+ - lib/node_modules/turbo-stream/dist/unflatten.d.ts
221
+ - lib/node_modules/turbo-stream/dist/unflatten.js
222
+ - lib/node_modules/turbo-stream/dist/utils.d.ts
223
+ - lib/node_modules/turbo-stream/dist/utils.js
224
+ - lib/node_modules/turbo-stream/package.json
225
+ - lib/package-lock.json
226
+ - lib/package.json
59
227
  - lib/rubee.rb
60
228
  - lib/rubee/async/asyncable.rb
61
229
  - lib/rubee/async/sidekiq_async.rb
@@ -76,6 +244,7 @@ files:
76
244
  - lib/tests/example_models/comment.rb
77
245
  - lib/tests/example_models/post.rb
78
246
  - lib/tests/example_models/user.rb
247
+ - lib/tests/rubee_generator_test.rb
79
248
  - lib/tests/rubeeapp_test.rb
80
249
  - lib/tests/test.db
81
250
  - lib/tests/test_helper.rb
@@ -99,7 +268,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
268
  - !ruby/object:Gem::Version
100
269
  version: '0'
101
270
  requirements: []
102
- rubygems_version: 3.6.6
271
+ rubygems_version: 3.6.8
103
272
  specification_version: 4
104
273
  summary: Fast and lightweight Ruby application server designed for minimalism and
105
274
  flexibility