tramway 0.2.3 → 0.3

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.
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