human_routes 0.0.1 → 0.0.5

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: 2ad89763d40365e71ad1e2d6ca62e93c9d407cb4342ed0904c1b181338c5a599
4
- data.tar.gz: 076fe95f90963ab455b86559c00c0af7dd0aeb624b2a1605c12ab2cccfbd3418
3
+ metadata.gz: 3c9732c44671356336d93d93f66551dc7ac4f05e430b0abe73cbff5d4aa32fe9
4
+ data.tar.gz: ec8df768c2dfbdea30fd6e020545fc9df04669da1236c1266877a4046e987589
5
5
  SHA512:
6
- metadata.gz: 2af45ff4d9f08a645a0c2a367a652579ef43e24bd7bb9ad13db111b6be11b9d0952f0fcd6570797279d467948599d9cd4b92881ba48f44ea41a489d1513baad8
7
- data.tar.gz: 51122db49e0b50327e3f7dd9751e7f4051425386f5ab59b6c1504819d7d4654fa320f1896c4bb05e17d6eef4f324a5d47a5ad9865e8e174974f9f76f11275bee
6
+ metadata.gz: 1c66820fb3a6224c242ce241f7d9256946e96d4c27e855b7b5ef5548e7a8ad2c91b036faf6897c2442bb0d33ca6b5889d6e865de8dca5ba85430713f36afc32f
7
+ data.tar.gz: 594bbc22352cd07cc313768f7768c308f1f965763d4ed6da2d773ef2b7132e76aba914c95f8fc6413a4335467e2f7ec6e590d30df777601be4d11daaec8bf496
@@ -0,0 +1,3 @@
1
+ ---
2
+ github: [fnando]
3
+ custom: ["https://www.paypal.me/nandovieira/🍕"]
data/.rubocop.yml CHANGED
@@ -4,9 +4,7 @@ inherit_gem:
4
4
 
5
5
  AllCops:
6
6
  TargetRubyVersion: 2.7
7
+ NewCops: enable
7
8
 
8
- Metrics/MethodLength:
9
- Enabled: false
10
-
11
- Metrics/ClassLength:
9
+ Metrics:
12
10
  Enabled: false
data/README.md CHANGED
@@ -16,11 +16,15 @@ gem "human_routes"
16
16
 
17
17
  And then execute:
18
18
 
19
- $ bundle install
19
+ ```bash
20
+ bundle install
21
+ ```
20
22
 
21
23
  Or install it yourself as:
22
24
 
23
- $ gem install human_routes
25
+ ```bash
26
+ gem install human_routes
27
+ ```
24
28
 
25
29
  ## Usage
26
30
 
@@ -36,7 +40,7 @@ end
36
40
 
37
41
  This will generate a few routes different routes, as you can see below:
38
42
 
39
- ```
43
+ ```console
40
44
  $ rails routes
41
45
  Prefix Verb URI Pattern Controller#Action
42
46
  new_signup GET /signup/new signup#new
@@ -64,7 +68,7 @@ The above could added in one line with `route(:blogs) { all }`.
64
68
 
65
69
  This will generate the following routes:
66
70
 
67
- ```
71
+ ```console
68
72
  $ rails routes
69
73
  Prefix Verb URI Pattern Controller#Action
70
74
  new_blog GET /blogs/new blogs#new
@@ -104,6 +108,54 @@ Rails.application.routes.draw do
104
108
  route :pages, module: "customer" do
105
109
  all
106
110
  end
111
+
112
+ # Additionally, you can use `:name` to give a different name to
113
+ # namespaced controllers. This way routes can be generated using a shallow
114
+ # path instead of the usual `admin/reports`.
115
+ route "admin/reports", name: "reports" do
116
+ all
117
+ end
118
+
119
+ # Singular routes also are detected and generated accordingly.
120
+ # This will generate the following routes:
121
+ #
122
+ # GET /profile profile_path
123
+ # POST /profile/new
124
+ # GET /profile/edit edit_profile_path
125
+ # POST /profile/edit
126
+ # GET /profile/remove remove_profile_path
127
+ # POST /profile/remove
128
+ route "profile" do
129
+ all
130
+ end
131
+ end
132
+ ```
133
+
134
+ Sometimes you want to create routes without the action (e.g. `new` or `edit`);
135
+ in this case, you can use `bare: true`.
136
+
137
+ ```ruby
138
+ Rails.application.routes.draw do
139
+ # This will generate the following routes:
140
+ #
141
+ # GET /login new_login_path
142
+ # POST /login
143
+ route :login do
144
+ create bare: true
145
+ end
146
+ end
147
+ ```
148
+
149
+ You may want to add another paths not covered by the default helpers. In that
150
+ case, you can use `get` and `post`.
151
+
152
+ ```ruby
153
+ Rails.application.routes.draw do
154
+ route :login do
155
+ create as: "login", bare: true
156
+ get :verify_email #=> /login/verify-email
157
+ get :check_inbox #=> /login/check-inbox
158
+ end
107
159
  end
108
160
  ```
109
161
 
@@ -122,7 +174,7 @@ git commits and tags, and push the `.gem` file to
122
174
  ## Contributing
123
175
 
124
176
  Bug reports and pull requests are welcome on GitHub at
125
- https://github.com/fnando/human_routes. This project is intended to be a safe,
177
+ <https://github.com/fnando/human_routes>. This project is intended to be a safe,
126
178
  welcoming space for collaboration, and contributors are expected to adhere to
127
179
  the
128
180
  [code of conduct](https://github.com/fnando/human_routes/blob/master/CODE_OF_CONDUCT.md).
data/human_routes.gemspec CHANGED
@@ -7,6 +7,8 @@ Gem::Specification.new do |spec|
7
7
  spec.version = HumanRoutes::VERSION
8
8
  spec.authors = ["Nando Vieira"]
9
9
  spec.email = ["me@fnando.com"]
10
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
11
+ spec.metadata = {"rubygems_mfa_required" => "true"}
10
12
 
11
13
  spec.summary = "I say no to REST for client-facing urls."
12
14
  spec.description = spec.summary
@@ -2,16 +2,25 @@
2
2
 
3
3
  module HumanRoutes
4
4
  class Context
5
- attr_reader :controller
6
- attr_reader :options
5
+ attr_reader :controller, :options, :router, :named_routes
7
6
 
8
- def initialize(controller, options = {})
7
+ def initialize(router, controller, options = {})
8
+ @router = router
9
9
  @controller = controller
10
10
  @options = options
11
+ @named_routes = {}
12
+ end
13
+
14
+ def controller_name
15
+ @controller_name ||= options.delete(:name) { controller.to_s }
11
16
  end
12
17
 
13
18
  def singular_controller_name
14
- @singular_controller_name ||= controller.to_s.singularize
19
+ @singular_controller_name ||= controller_name.singularize
20
+ end
21
+
22
+ def resource?
23
+ controller_name == singular_controller_name
15
24
  end
16
25
 
17
26
  def routes
@@ -20,137 +29,161 @@ module HumanRoutes
20
29
 
21
30
  def create(*args)
22
31
  path, name, options = extract_route_args(
23
- default_path: "#{controller}/new",
32
+ segment: :new,
24
33
  default_name: "new_#{singular_controller_name}",
25
34
  args: args
26
35
  )
27
36
 
28
- routes << [
29
- path,
30
- {
31
- via: :get,
32
- controller: controller,
33
- action: :new,
34
- as: name
35
- }.merge(options)
36
- ]
37
-
38
- routes << [
39
- path,
40
- {
41
- via: :post,
42
- controller: controller,
43
- action: :create,
44
- as: ""
45
- }.merge(options)
46
- ]
37
+ match path, {
38
+ via: :get,
39
+ controller: controller,
40
+ action: :new,
41
+ as: name
42
+ }.merge(options)
43
+
44
+ match path, {
45
+ via: :post,
46
+ controller: controller,
47
+ action: :create,
48
+ as: ""
49
+ }.merge(options)
47
50
  end
48
51
 
49
52
  def update(*args)
50
53
  path, name, options = extract_route_args(
51
- default_path: "#{controller}/:id/edit",
54
+ segment: :edit,
52
55
  default_name: "edit_#{singular_controller_name}",
53
56
  args: args
54
57
  )
55
58
 
56
- routes << [
57
- path,
58
- {
59
- via: :get,
60
- controller: controller,
61
- action: :edit,
62
- as: name
63
- }.merge(options)
64
- ]
65
-
66
- routes << [
67
- path,
68
- {
69
- via: :post,
70
- controller: controller,
71
- action: :update,
72
- as: ""
73
- }.merge(options)
74
- ]
59
+ match path, {
60
+ via: :get,
61
+ controller: controller,
62
+ action: :edit,
63
+ as: name
64
+ }.merge(options)
65
+
66
+ match path, {
67
+ via: :post,
68
+ controller: controller,
69
+ action: :update,
70
+ as: ""
71
+ }.merge(options)
75
72
  end
76
73
 
77
74
  def remove(*args)
78
75
  path, name, options = extract_route_args(
79
- default_path: "#{controller}/:id/remove",
76
+ segment: :remove,
80
77
  default_name: "remove_#{singular_controller_name}",
81
78
  args: args
82
79
  )
83
80
 
84
- routes << [
85
- path,
86
- {
87
- via: :get,
88
- controller: controller,
89
- action: :remove,
90
- as: name
91
- }.merge(options)
92
- ]
93
-
94
- routes << [
95
- path,
96
- {
97
- via: :post,
98
- controller: controller,
99
- action: :destroy,
100
- as: ""
101
- }.merge(options)
102
- ]
81
+ match path, {
82
+ via: :get,
83
+ controller: controller,
84
+ action: :remove,
85
+ as: name
86
+ }.merge(options)
87
+
88
+ match path, {
89
+ via: :post,
90
+ controller: controller,
91
+ action: :destroy,
92
+ as: ""
93
+ }.merge(options)
103
94
  end
104
95
 
105
96
  def list(*args)
106
97
  path, name, options = extract_route_args(
107
- default_path: controller,
108
- default_name: controller,
98
+ segment: :list,
99
+ default_name: controller_name,
109
100
  args: args
110
101
  )
111
102
 
112
- routes << [
113
- path,
114
- {
115
- via: :get,
116
- controller: controller,
117
- action: :index,
118
- as: name
119
- }.merge(options)
120
- ]
103
+ match path, {
104
+ via: :get,
105
+ controller: controller,
106
+ action: :index,
107
+ as: name
108
+ }.merge(options)
121
109
  end
122
110
 
123
111
  def show(*args)
124
112
  path, name, options = extract_route_args(
125
- default_path: "#{controller}/:id",
113
+ segment: :show,
126
114
  default_name: singular_controller_name,
127
- args: args
115
+ args: args,
116
+ bare: true
128
117
  )
129
118
 
130
- routes << [
131
- path,
132
- {
133
- via: :get,
134
- controller: controller,
135
- action: :show,
136
- as: name
137
- }.merge(options)
138
- ]
119
+ match path, {
120
+ via: :get,
121
+ controller: controller,
122
+ action: :show,
123
+ as: name
124
+ }.merge(options)
139
125
  end
140
126
 
141
127
  def all
142
128
  create
143
129
  update
144
130
  remove
145
- list
146
131
  show
132
+ list unless controller_name == controller_name.singularize
147
133
  end
148
134
 
149
- private def extract_route_args(default_path:, default_name:, args:)
135
+ def get(action, *args)
136
+ path, name, options = extract_route_args(
137
+ segment: action,
138
+ default_name: action.to_s,
139
+ args: args
140
+ )
141
+
142
+ match path, {
143
+ via: :get,
144
+ controller: controller,
145
+ action: action,
146
+ as: name
147
+ }.merge(options)
148
+ end
149
+
150
+ def post(action, *args)
151
+ path, name, options = extract_route_args(
152
+ segment: action,
153
+ default_name: action.to_s,
154
+ args: args
155
+ )
156
+
157
+ match path, {
158
+ via: :post,
159
+ controller: controller,
160
+ action: action,
161
+ as: named_routes[path] == name ? "" : name
162
+ }.merge(options)
163
+ end
164
+
165
+ private def match(path, options)
166
+ named_routes[path] = options[:as] unless options[:as].empty?
167
+ router.match(path, options)
168
+ end
169
+
170
+ private def extract_route_args(
171
+ segment:,
172
+ default_name:,
173
+ args:,
174
+ bare: false
175
+ )
150
176
  route_options = args.extract_options!
151
- route_options = default_options.merge(options).merge(route_options)
152
- path = args.first || default_path
153
- name = route_options.delete(:as) || default_name
177
+ route_options = default_options
178
+ .merge(bare: bare)
179
+ .merge(options)
180
+ .merge(route_options)
181
+
182
+ path = args.first || path_for(segment, route_options)
183
+ path = path.to_s.dasherize
184
+ name = route_options.delete(:as) { default_name.underscore.tr("/", "_") }
185
+
186
+ route_options.delete(:bare)
154
187
 
155
188
  [path, name, route_options]
156
189
  end
@@ -160,5 +193,36 @@ module HumanRoutes
160
193
  format: false
161
194
  }
162
195
  end
196
+
197
+ private def path_for(segment, options)
198
+ param = options.fetch(:param, :id)
199
+
200
+ segments = if resource?
201
+ resource_segments(segment, param, options)
202
+ else
203
+ resources_segments(segment, param, options)
204
+ end
205
+
206
+ segments.compact.join("/")
207
+ end
208
+
209
+ private def resource_segments(segment, _param, options)
210
+ segments = [controller_name]
211
+ segments << segment unless options[:bare]
212
+ segments
213
+ end
214
+
215
+ private def resources_segments(segment, param, _options)
216
+ case segment
217
+ when :list
218
+ [controller_name]
219
+ when :new
220
+ [controller_name, segment]
221
+ when :show
222
+ [controller_name, ":#{param}"]
223
+ else
224
+ [controller_name, ":#{param}", segment]
225
+ end
226
+ end
163
227
  end
164
228
  end
@@ -3,12 +3,8 @@
3
3
  module HumanRoutes
4
4
  module Extensions
5
5
  def route(controller, options = {}, &block)
6
- context = Context.new(controller, options)
6
+ context = Context.new(self, controller, options)
7
7
  context.instance_eval(&block)
8
-
9
- context.routes.each do |route|
10
- match(*route)
11
- end
12
8
  end
13
9
  end
14
10
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HumanRoutes
4
- VERSION = "0.0.1"
4
+ VERSION = "0.0.5"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: human_routes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Vieira
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-22 00:00:00.000000000 Z
11
+ date: 2022-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -129,9 +129,9 @@ executables: []
129
129
  extensions: []
130
130
  extra_rdoc_files: []
131
131
  files:
132
+ - ".github/FUNDING.yml"
132
133
  - ".gitignore"
133
134
  - ".rubocop.yml"
134
- - ".tool-versions"
135
135
  - CODE_OF_CONDUCT.md
136
136
  - Gemfile
137
137
  - LICENSE.txt
@@ -148,10 +148,11 @@ homepage: https://github.com/fnando/human_routes
148
148
  licenses:
149
149
  - MIT
150
150
  metadata:
151
+ rubygems_mfa_required: 'true'
151
152
  homepage_uri: https://github.com/fnando/human_routes
152
153
  source_code_uri: https://github.com/fnando/human_routes
153
154
  changelog_uri: https://github.com/fnando/human_routes
154
- post_install_message:
155
+ post_install_message:
155
156
  rdoc_options: []
156
157
  require_paths:
157
158
  - lib
@@ -159,15 +160,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
159
160
  requirements:
160
161
  - - ">="
161
162
  - !ruby/object:Gem::Version
162
- version: '0'
163
+ version: 2.7.0
163
164
  required_rubygems_version: !ruby/object:Gem::Requirement
164
165
  requirements:
165
166
  - - ">="
166
167
  - !ruby/object:Gem::Version
167
168
  version: '0'
168
169
  requirements: []
169
- rubygems_version: 3.1.2
170
- signing_key:
170
+ rubygems_version: 3.3.3
171
+ signing_key:
171
172
  specification_version: 4
172
173
  summary: I say no to REST for client-facing urls.
173
174
  test_files: []
data/.tool-versions DELETED
@@ -1 +0,0 @@
1
- nodejs 12.16.1