human_routes 0.0.3 → 0.0.4

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: 6619b6b97a5cb0145a8d7094e78b9a60977de870747daab57ead72a4616b35a7
4
+ data.tar.gz: 9ce9e153c6662da207f112f4eb35bca3959afa80993d10be771d23768db38590
5
5
  SHA512:
6
- metadata.gz: c00bc6a43435013e188b97913862a37cd5dc665fd5fab540d4ee64808f997c81967e0437b9a85cbc7726a638cbeecd58b033940e851f23b590935295ceb7f5f8
7
- data.tar.gz: dd0df5f668857a9906c74ad87df9f9518f8320df74c961a548d2a00abc5f2dd0277851168fca14aed51a1a135a6fef0366511d9127a58bf083afd2ec42aba94f
6
+ metadata.gz: 99529e4c6c0b3eaea6557cc8caa3eac0c25c68fc17e4404ebd1a825e02ac556a69307d0e769488164b7e35797b0099c72f6a7e9b54d359702f861b5b6aad0a64
7
+ data.tar.gz: 21d11d2ea7e321637278de2488bdcf55c733d0e2684cfe3e6b1f46b02fcdaf6f2b16dc156fdc3eca637fe88cd6f6798efaef07028a767ce469fc284ac2ffff2f
@@ -0,0 +1,3 @@
1
+ ---
2
+ github: [fnando]
3
+ custom: ["https://www.paypal.me/nandovieira/🍕"]
data/.rubocop.yml CHANGED
@@ -5,8 +5,5 @@ inherit_gem:
5
5
  AllCops:
6
6
  TargetRubyVersion: 2.7
7
7
 
8
- Metrics/MethodLength:
9
- Enabled: false
10
-
11
- Metrics/ClassLength:
8
+ Metrics:
12
9
  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,34 @@ 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
+
130
162
  ## Development
131
163
 
132
164
  After checking out the repo, run `bin/setup` to install dependencies. Then, run
@@ -142,7 +174,7 @@ git commits and tags, and push the `.gem` file to
142
174
  ## Contributing
143
175
 
144
176
  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,
177
+ <https://github.com/fnando/human_routes>. This project is intended to be a safe,
146
178
  welcoming space for collaboration, and contributors are expected to adhere to
147
179
  the
148
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,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,10 +132,55 @@ 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
+ path = path.to_s.dasherize
161
184
  name = route_options.delete(:as) { default_name.underscore.tr("/", "_") }
162
185
 
163
186
  [path, name, route_options]
@@ -173,21 +196,21 @@ module HumanRoutes
173
196
  param = options.fetch(:param, :id)
174
197
 
175
198
  segments = if resource?
176
- resource_segments(segment, param)
199
+ resource_segments(segment, param, options)
177
200
  else
178
- resources_segments(segment, param)
201
+ resources_segments(segment, param, options)
179
202
  end
180
203
 
181
204
  segments.compact.join("/")
182
205
  end
183
206
 
184
- private def resource_segments(segment, _param)
207
+ private def resource_segments(segment, _param, options)
185
208
  segments = [controller_name]
186
- segments << segment unless segment == :show
209
+ segments << segment unless options[:bare]
187
210
  segments
188
211
  end
189
212
 
190
- private def resources_segments(segment, param)
213
+ private def resources_segments(segment, param, _options)
191
214
  case segment
192
215
  when :list
193
216
  [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.4"
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.4
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: 2021-12-27 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.2.32
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