tramway 0.2.3 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eee7e8b57c93fd646e96a26e07e9dab81b6deee977c50c2ab34b1df93f48e96d
4
- data.tar.gz: 48d411dcce7d057eb867862f2b8410b5320bbf2dfdc47f5a0e06508f34049139
3
+ metadata.gz: 5e8751e6e662061508bb687b258c13f3dcb40460344959595a66c998608e38af
4
+ data.tar.gz: 66076bba6be9af35c2e787bf43e8e6cb00877bd5f5b53cf4b70ce37a09f78c2b
5
5
  SHA512:
6
- metadata.gz: dc78481a707c0688c774469549b8c1dc319adfe51f67cdd871b4b4751f03367206c674298c764a54110aa9c9b634082c6c844e1b97df0e9d2b2411fb536fa527
7
- data.tar.gz: 2bdf9eca337acd11afacb0fca442e6047b1b600d5b6a499bad31ad7522777edf0c2079c247491334a32eb3bb8682d54c78e596256b120c14a6c4a62593592150
6
+ metadata.gz: aec595653662af5dfe38f8d402dd799d8da2ad77ba8c3e032aba22c56020467f9b4ee1f701a07e7477ecbd34ff7725c32fac18a6a359513e064dbbdc567d703c
7
+ data.tar.gz: 5e1799a4d4290ac7bf5e9bd8c1fe524119eb4449ffe0ddeccb3ecf934343160672572c22e834f76a7bebe522d4ca226aa08ce8336ba1f56f88dc53fe692eba72
data/README.md CHANGED
@@ -1,6 +1,13 @@
1
1
  # Tramway
2
2
  Unite Ruby on Rails brilliance. Streamline development with Tramway.
3
3
 
4
+ * [Installation](https://github.com/Purple-Magic/tramway#installation)
5
+ * [Usage](https://github.com/Purple-Magic/tramway#usage)
6
+ * [Tramway Entities](https://github.com/Purple-Magic/tramway#tramway-entities)
7
+ * [Tramway Decorators](https://github.com/Purple-Magic/tramway#tramway-decorators)
8
+ * [Tramway Form](https://github.com/Purple-Magic/tramway#tramway-form)
9
+ * [Tramway Navbar](https://github.com/Purple-Magic/tramway#tramway-navbar)
10
+
4
11
  ## Installation
5
12
  Add this line to your application's Gemfile:
6
13
 
@@ -43,10 +50,6 @@ Tramway.configure do |config|
43
50
  end
44
51
  ```
45
52
 
46
- ### Tailwind components
47
-
48
- Tramway uses [Tailwind](https://tailwindcss.com/) by default. All UI helpers are implemented with [ViewComponent](https://github.com/viewcomponent/view_component).
49
-
50
53
  ### Tramway Decorators
51
54
 
52
55
  Tramway provides convenient decorators for your objects. **NOTE:** This is not the decorator pattern in its usual representation.
@@ -97,6 +100,152 @@ def show
97
100
  end
98
101
  ```
99
102
 
103
+ ### Tramway Form
104
+
105
+ Tramway provides **convenient** form objects for Rails applications. List properties you want to change and the rules in Form classes. No controllers overloading.
106
+
107
+ *app/forms/user_form.rb
108
+ ```ruby
109
+ class UserForm < Tramway::BaseForm
110
+ properties :email, :password, :first_name, :last_name, :phone
111
+
112
+ def password=(value)
113
+ object.password = value if value.present?
114
+ end
115
+ end
116
+ ```
117
+
118
+ **Controllers without Tramway Form**
119
+
120
+ *app/controllers/users_controller.rb*
121
+ ```ruby
122
+ class UsersController < ApplicationController
123
+ def create
124
+ @user = User.new
125
+ if @user.save user_params
126
+ render :show
127
+ else
128
+ render :new
129
+ end
130
+ end
131
+
132
+ def update
133
+ @user = User.find params[:id]
134
+ if @user.save user_params
135
+ render :show
136
+ else
137
+ render :edit
138
+ end
139
+ end
140
+
141
+ private
142
+
143
+ def user_params
144
+ params[:user].permit(:email, :password, :first_name, :last_name, :phone)
145
+ end
146
+ end
147
+ ```
148
+
149
+ **Controllers with Tramway Form**
150
+
151
+ *app/controllers/users_controller.rb*
152
+ ```ruby
153
+ class UsersController < ApplicationController
154
+ def create
155
+ @user = tramway_form User.new
156
+ if @user.submit params[:user]
157
+ render :show
158
+ else
159
+ render :new
160
+ end
161
+ end
162
+
163
+ def update
164
+ @user = tramway_form User.find params[:id]
165
+ if @user.submit params[:user]
166
+ render :show
167
+ else
168
+ render :edit
169
+ end
170
+ end
171
+ end
172
+ ```
173
+
174
+ #### Implement Form objects for any case
175
+
176
+ *app/forms/user_updating_email_form.rb*
177
+ ```ruby
178
+ class UserUpdatingEmailForm < Tramway::BaseForm
179
+ properties :email
180
+ end
181
+ ```
182
+
183
+ *app/controllers/updating_emails_controller.rb*
184
+ ```ruby
185
+ def update
186
+ @user = UserUpdatingEmailForm.new User.find params[:id]
187
+ if @user.submit params[:user]
188
+ # success
189
+ else
190
+ # failure
191
+ end
192
+ end
193
+ ```
194
+
195
+ #### Create form namespaces
196
+
197
+ *app/forms/admin/user_form.rb*
198
+ ```ruby
199
+ class Admin::UserForm < Tramway::BaseForm
200
+ properties :email, :password, :first_name, :last_name, :etc
201
+ end
202
+ ```
203
+
204
+ *app/controllers/admin/users_controller.rb*
205
+ ```ruby
206
+ class Admin::UsersController < Admin::ApplicationController
207
+ def create
208
+ @user = tramway_form User.new, namespace: :admin
209
+ if @user.submit params[:user]
210
+ render :show
211
+ else
212
+ render :new
213
+ end
214
+ end
215
+
216
+ def update
217
+ @user = tramway_form User.find(params[:id]), namespace: :admin
218
+ if @user.submit params[:user]
219
+ render :show
220
+ else
221
+ render :edit
222
+ end
223
+ end
224
+ end
225
+ ```
226
+
227
+ ### Make flexible and extendable forms
228
+
229
+ Tramway Form properties are not mapped to a model. You're able to make extended forms.
230
+
231
+ *app/forms/user_form.rb*
232
+ ```ruby
233
+ class UserForm < Tramway::BaseForm
234
+ properties :email, :password, :full_name
235
+
236
+ # RULE: in case password is empty, don't save
237
+ def password=(value)
238
+ object.password = value if value.present?
239
+ end
240
+
241
+ # EXTENDED FIELD: full name
242
+ def full_name=(value)
243
+ object.first_name = value.split(' ').first
244
+ object.last_name = value.split(' ').last
245
+ end
246
+ end
247
+ ```
248
+
100
249
  ### Tramway Navbar
101
250
 
102
251
  Tramway provides DSL for rendering Tailwind Navgiation bar.
@@ -163,6 +312,10 @@ tramway_navbar title: 'Purple Magic' do |nav|
163
312
  end
164
313
  ```
165
314
 
315
+ ### Tailwind components
316
+
317
+ Tramway uses [Tailwind](https://tailwindcss.com/) by default. All UI helpers are implemented with [ViewComponent](https://github.com/viewcomponent/view_component).
318
+
166
319
  ## Contributing
167
320
 
168
321
  Install [lefthook](https://github.com/evilmartians/lefthook)
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tramway
4
+ # Provides form object for Tramway
5
+ #
6
+ class BaseForm
7
+ attr_reader :object
8
+
9
+ %i[model_name to_key to_model errors attributes].each do |method_name|
10
+ delegate method_name, to: :object
11
+ end
12
+
13
+ def initialize(object)
14
+ @object = object
15
+ end
16
+
17
+ class << self
18
+ def property(attribute, _proc_obj = nil)
19
+ @properties ||= []
20
+ @properties << attribute
21
+
22
+ delegate attribute, to: :object
23
+ end
24
+
25
+ def properties(*attributes)
26
+ if attributes.any?
27
+ attributes.each do |attribute|
28
+ property(attribute)
29
+ end
30
+ else
31
+ @properties || []
32
+ end
33
+ end
34
+ end
35
+
36
+ def submit(params)
37
+ __submit params
38
+
39
+ object.save.tap do
40
+ __object
41
+ end
42
+ end
43
+
44
+ def submit!(params)
45
+ __submit params
46
+
47
+ object.save!.tap do
48
+ __object
49
+ end
50
+ end
51
+
52
+ def method_missing(method_name, *args)
53
+ if method_name.to_s.end_with?('=') && args.count == 1
54
+ object.public_send(method_name, args.first)
55
+ else
56
+ super
57
+ end
58
+ end
59
+
60
+ def respond_to_missing?(method_name, include_private = false)
61
+ method_name.to_s.end_with?('=') || super
62
+ end
63
+
64
+ private
65
+
66
+ def __submit(params)
67
+ self.class.properties.each do |attribute|
68
+ public_send("#{attribute}=", params[attribute])
69
+ end
70
+ end
71
+
72
+ def __object
73
+ object.persisted? ? object.reload : object
74
+ end
75
+ end
76
+ end
@@ -18,6 +18,12 @@ module Tramway
18
18
 
19
19
  loaded_class.include Tramway::Helpers::DecorateHelper
20
20
  end
21
+
22
+ ActiveSupport.on_load(:action_controller) do |loaded_class|
23
+ require 'tramway/helpers/form_helper'
24
+
25
+ loaded_class.include Tramway::Helpers::FormHelper
26
+ end
21
27
  end
22
28
  end
23
29
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tramway
4
+ module Forms
5
+ # Provides method to determine decorators classes
6
+ module ClassHelper
7
+ module_function
8
+
9
+ def form_class(object, form, namespace)
10
+ object_class = object.class
11
+
12
+ if form.present?
13
+ form
14
+ elsif namespace.present?
15
+ "#{namespace.to_s.camelize}::#{object_class}Form".constantize
16
+ else
17
+ "#{object_class}Form".constantize
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tramway/forms/class_helper'
4
+
5
+ module Tramway
6
+ module Helpers
7
+ # Provides methods into Rails ActionController
8
+ #
9
+ module FormHelper
10
+ def tramway_form(object, form: nil, namespace: nil)
11
+ Tramway::Forms::ClassHelper.form_class(object, form, namespace).new object
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tramway
4
- VERSION = '0.2.3'
4
+ VERSION = '0.3'
5
5
  end
data/lib/tramway.rb CHANGED
@@ -4,6 +4,7 @@ require 'types'
4
4
  require 'tramway/version'
5
5
  require 'tramway/engine'
6
6
  require 'tramway/base_decorator'
7
+ require 'tramway/base_form'
7
8
  require 'tramway/config'
8
9
  require 'view_component/compiler'
9
10
  require 'view_component/engine'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tramway
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - kalashnikovisme
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-08-17 00:00:00.000000000 Z
12
+ date: 2023-09-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: dry-struct
@@ -102,13 +102,16 @@ files:
102
102
  - lib/tasks/tramway_tasks.rake
103
103
  - lib/tramway.rb
104
104
  - lib/tramway/base_decorator.rb
105
+ - lib/tramway/base_form.rb
105
106
  - lib/tramway/config.rb
106
107
  - lib/tramway/configs/entities/route.rb
107
108
  - lib/tramway/configs/entity.rb
108
109
  - lib/tramway/decorators/class_helper.rb
109
110
  - lib/tramway/decorators/collection_decorator.rb
110
111
  - lib/tramway/engine.rb
112
+ - lib/tramway/forms/class_helper.rb
111
113
  - lib/tramway/helpers/decorate_helper.rb
114
+ - lib/tramway/helpers/form_helper.rb
112
115
  - lib/tramway/helpers/navbar_helper.rb
113
116
  - lib/tramway/navbar.rb
114
117
  - lib/tramway/utils/render.rb