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 +4 -4
- data/README.md +157 -4
- data/lib/tramway/base_form.rb +76 -0
- data/lib/tramway/engine.rb +6 -0
- data/lib/tramway/forms/class_helper.rb +22 -0
- data/lib/tramway/helpers/form_helper.rb +15 -0
- data/lib/tramway/version.rb +1 -1
- data/lib/tramway.rb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5e8751e6e662061508bb687b258c13f3dcb40460344959595a66c998608e38af
|
|
4
|
+
data.tar.gz: 66076bba6be9af35c2e787bf43e8e6cb00877bd5f5b53cf4b70ce37a09f78c2b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
data/lib/tramway/engine.rb
CHANGED
|
@@ -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
|
data/lib/tramway/version.rb
CHANGED
data/lib/tramway.rb
CHANGED
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.
|
|
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-
|
|
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
|