human_routes 0.0.3 → 0.0.6

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: 750706caf0cfc1bbd3580eaf6c3103c73bc2e0f02c190c5103c7883f0749a958
4
- data.tar.gz: d6cf027de35c5b1c9a3905550a606bb26585307b2b6fd97a5224975d804c4e8c
3
+ metadata.gz: 599c1d4f7022f37dd7a8c87f89e01480c95ea8f04d89137034139d87beabd8a5
4
+ data.tar.gz: e26db1816cc2b383938b5f2adf7e5d6c1955c8d25996c0913a2bb7def1c8f61e
5
5
  SHA512:
6
- metadata.gz: c00bc6a43435013e188b97913862a37cd5dc665fd5fab540d4ee64808f997c81967e0437b9a85cbc7726a638cbeecd58b033940e851f23b590935295ceb7f5f8
7
- data.tar.gz: dd0df5f668857a9906c74ad87df9f9518f8320df74c961a548d2a00abc5f2dd0277851168fca14aed51a1a135a6fef0366511d9127a58bf083afd2ec42aba94f
6
+ metadata.gz: af48d012d17e2c1525a524c68e14e6a72f8626fd4804d9a9252b923850547bf39eefcfe54966410ef5fe1619f3c510d92cd0271691e9e29c43ad6c4a02193849
7
+ data.tar.gz: 789d18466d195a4afb4490567a38ad8c72d0f489b9485ffbb3a9c3cbcd2b09f63a58f49a5968b366ea07a28fca126ca191b663f5d1a43768c1d20b4fd08371c7
@@ -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
@@ -127,6 +131,52 @@ Rails.application.routes.draw do
127
131
  end
128
132
  ```
129
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
159
+ end
160
+ ```
161
+
162
+ For nested paths, you can use `:parent`:
163
+
164
+ ```ruby
165
+ Rails.application.routes.draw do
166
+ route :posts do
167
+ all
168
+ end
169
+
170
+ route :comments, parent: "posts/:post_id" do
171
+ remove #=> /posts/:post_id/comments/:id/remove
172
+ list #=> /posts/:post_id/comments
173
+
174
+ # or
175
+ all
176
+ end
177
+ end
178
+ ```
179
+
130
180
  ## Development
131
181
 
132
182
  After checking out the repo, run `bin/setup` to install dependencies. Then, run
@@ -142,7 +192,7 @@ git commits and tags, and push the `.gem` file to
142
192
  ## Contributing
143
193
 
144
194
  Bug reports and pull requests are welcome on GitHub at
145
- https://github.com/fnando/human_routes. This project is intended to be a safe,
195
+ <https://github.com/fnando/human_routes>. This project is intended to be a safe,
146
196
  welcoming space for collaboration, and contributors are expected to adhere to
147
197
  the
148
198
  [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,12 +2,13 @@
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 = {}
11
12
  end
12
13
 
13
14
  def controller_name
@@ -33,25 +34,19 @@ module HumanRoutes
33
34
  args: args
34
35
  )
35
36
 
36
- routes << [
37
- path,
38
- {
39
- via: :get,
40
- controller: controller,
41
- action: :new,
42
- as: name
43
- }.merge(options)
44
- ]
45
-
46
- routes << [
47
- path,
48
- {
49
- via: :post,
50
- controller: controller,
51
- action: :create,
52
- as: ""
53
- }.merge(options)
54
- ]
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)
55
50
  end
56
51
 
57
52
  def update(*args)
@@ -61,25 +56,19 @@ module HumanRoutes
61
56
  args: args
62
57
  )
63
58
 
64
- routes << [
65
- path,
66
- {
67
- via: :get,
68
- controller: controller,
69
- action: :edit,
70
- as: name
71
- }.merge(options)
72
- ]
73
-
74
- routes << [
75
- path,
76
- {
77
- via: :post,
78
- controller: controller,
79
- action: :update,
80
- as: ""
81
- }.merge(options)
82
- ]
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)
83
72
  end
84
73
 
85
74
  def remove(*args)
@@ -89,25 +78,19 @@ module HumanRoutes
89
78
  args: args
90
79
  )
91
80
 
92
- routes << [
93
- path,
94
- {
95
- via: :get,
96
- controller: controller,
97
- action: :remove,
98
- as: name
99
- }.merge(options)
100
- ]
101
-
102
- routes << [
103
- path,
104
- {
105
- via: :post,
106
- controller: controller,
107
- action: :destroy,
108
- as: ""
109
- }.merge(options)
110
- ]
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)
111
94
  end
112
95
 
113
96
  def list(*args)
@@ -117,33 +100,28 @@ module HumanRoutes
117
100
  args: args
118
101
  )
119
102
 
120
- routes << [
121
- path,
122
- {
123
- via: :get,
124
- controller: controller,
125
- action: :index,
126
- as: name
127
- }.merge(options)
128
- ]
103
+ match path, {
104
+ via: :get,
105
+ controller: controller,
106
+ action: :index,
107
+ as: name
108
+ }.merge(options)
129
109
  end
130
110
 
131
111
  def show(*args)
132
112
  path, name, options = extract_route_args(
133
113
  segment: :show,
134
114
  default_name: singular_controller_name,
135
- args: args
115
+ args: args,
116
+ bare: true
136
117
  )
137
118
 
138
- routes << [
139
- path,
140
- {
141
- via: :get,
142
- controller: controller,
143
- action: :show,
144
- as: name
145
- }.merge(options)
146
- ]
119
+ match path, {
120
+ via: :get,
121
+ controller: controller,
122
+ action: :show,
123
+ as: name
124
+ }.merge(options)
147
125
  end
148
126
 
149
127
  def all
@@ -154,12 +132,68 @@ module HumanRoutes
154
132
  list unless controller_name == controller_name.singularize
155
133
  end
156
134
 
157
- private def extract_route_args(segment:, 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
+ )
158
176
  route_options = args.extract_options!
159
- route_options = default_options.merge(options).merge(route_options)
177
+ route_options = default_options
178
+ .merge(bare: bare)
179
+ .merge(options)
180
+ .merge(route_options)
181
+
160
182
  path = args.first || path_for(segment, route_options)
183
+
184
+ path = [
185
+ route_options[:parent].to_s.split("/"),
186
+ path.to_s.split("/")
187
+ ].flatten.compact
188
+
189
+ path = path.map do |s|
190
+ s.start_with?(":") ? s : s.dasherize
191
+ end.join("/")
192
+
161
193
  name = route_options.delete(:as) { default_name.underscore.tr("/", "_") }
162
194
 
195
+ route_options.delete(:bare)
196
+
163
197
  [path, name, route_options]
164
198
  end
165
199
 
@@ -173,21 +207,21 @@ module HumanRoutes
173
207
  param = options.fetch(:param, :id)
174
208
 
175
209
  segments = if resource?
176
- resource_segments(segment, param)
210
+ resource_segments(segment, param, options)
177
211
  else
178
- resources_segments(segment, param)
212
+ resources_segments(segment, param, options)
179
213
  end
180
214
 
181
215
  segments.compact.join("/")
182
216
  end
183
217
 
184
- private def resource_segments(segment, _param)
218
+ private def resource_segments(segment, _param, options)
185
219
  segments = [controller_name]
186
- segments << segment unless segment == :show
220
+ segments << segment unless options[:bare]
187
221
  segments
188
222
  end
189
223
 
190
- private def resources_segments(segment, param)
224
+ private def resources_segments(segment, param, _options)
191
225
  case segment
192
226
  when :list
193
227
  [controller_name]
@@ -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.3"
4
+ VERSION = "0.0.6"
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.3
4
+ version: 0.0.6
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-07-18 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.17
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