human_routes 0.0.3 → 0.0.6

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