human_routes 0.0.1 → 0.0.5

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