middleman-router 0.0.1
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 +7 -0
- data/.gitignore +10 -0
- data/Gemfile +18 -0
- data/README.md +188 -0
- data/Rakefile +14 -0
- data/features/support/env.rb +4 -0
- data/lib/middleman-router.rb +6 -0
- data/lib/middleman-router/extension.rb +58 -0
- data/lib/middleman-router/mapper.rb +132 -0
- data/lib/middleman_extension.rb +1 -0
- data/middleman-router.gemspec +25 -0
- metadata +75 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 979526ec50e8d23d348acf97ea76b08f39560897
|
|
4
|
+
data.tar.gz: 6d39307fdd6ec98bf6cadfc5738f471399aece69
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 37453c7dbd4cfe26a2236d32f6dce387c7d1aa0ecbf105818138e60c8287884aa129f345846481b03b143f72531553fa012c9ae1d26a3eebf325c1f921c0d4e1
|
|
7
|
+
data.tar.gz: ced32ec7694de15389c600ec729cbbdb4d7287900c98ae7a81c572a63a91a0f58bbe28c53551b8cdd6d09de6b7480786d9e7127e2119f27ef846e14e90e76215
|
data/.gitignore
ADDED
data/Gemfile
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# If you do not have OpenSSL installed, update
|
|
2
|
+
# the following line to use "http://" instead
|
|
3
|
+
source 'https://rubygems.org'
|
|
4
|
+
|
|
5
|
+
# Specify your gem's dependencies in middleman-router.gemspec
|
|
6
|
+
gemspec
|
|
7
|
+
|
|
8
|
+
group :development do
|
|
9
|
+
gem 'rake'
|
|
10
|
+
gem 'rdoc'
|
|
11
|
+
gem 'yard'
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
group :test do
|
|
15
|
+
gem 'cucumber'
|
|
16
|
+
gem 'aruba'
|
|
17
|
+
gem 'rspec'
|
|
18
|
+
end
|
data/README.md
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Middleman Router
|
|
2
|
+
|
|
3
|
+
`middleman-router` is an extension of Middleman that provides an easy way to organize and manage all of your page routes.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
Add this line to your application's Gemfile:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
gem 'middleman-router'
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
And then execute:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
$ bundle install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Or install it yourself as:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
$ gem install middleman-robots
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Activate the plugin in the config.rb file
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
# config.rb
|
|
29
|
+
activate :router
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
By default, your routes should be stored in `lib/routes.rb` but you can customize the location if you'd like:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
# config.rb
|
|
36
|
+
activate :router, routes_location: 'routes/routes'
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Defining Your Routes
|
|
40
|
+
|
|
41
|
+
In order to use Middlman Router, you need to setup your routes files.
|
|
42
|
+
|
|
43
|
+
```ruby
|
|
44
|
+
# lib/routes.rb
|
|
45
|
+
Router.draw do
|
|
46
|
+
route :home, path: ""
|
|
47
|
+
route :about
|
|
48
|
+
route :contact
|
|
49
|
+
|
|
50
|
+
route :services do
|
|
51
|
+
route :strategy, path: "digital-strategy"
|
|
52
|
+
route :design
|
|
53
|
+
route :development, path: "web-development"
|
|
54
|
+
route :search
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
route :careers, url: "https://external-link.jobboard.com"
|
|
58
|
+
end
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Using Routes
|
|
62
|
+
|
|
63
|
+
Once you've defined all of your routes in your routes file, you can easily call any named route by using the helper. If you have a named route of `route :about` then you can simply call:
|
|
64
|
+
|
|
65
|
+
```ruby
|
|
66
|
+
= link_to "About Us", Router.about_path
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
When the site is compiled, it will render the URL from your route. If you change a route within your routes file then there is no need to change the route helper declaration unless you change the named route (e.g. you changed `route :about` to `route :about_us`.
|
|
70
|
+
|
|
71
|
+
For nested routes, you'll need to use the parent named route as part of the path, e.g.:
|
|
72
|
+
|
|
73
|
+
```ruby
|
|
74
|
+
# lib/routes.rb
|
|
75
|
+
route :about do
|
|
76
|
+
route :team
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# html/erb file
|
|
80
|
+
= link_to "Team", Router.team_about_path
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Route Attributes
|
|
84
|
+
|
|
85
|
+
Defining a `route` is the base for creating a new route. There are a few options you can pass to `route` to customize it.
|
|
86
|
+
|
|
87
|
+
**name**
|
|
88
|
+
The name of the route is the only required attribute.
|
|
89
|
+
|
|
90
|
+
```ruby
|
|
91
|
+
route :about_us
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
This will create a route like `about_us` and point to the file `about_us.html`.
|
|
95
|
+
|
|
96
|
+
**path**
|
|
97
|
+
You can customize the file that a give route loads. This is useful if you prefer hypenated urls rather than snake case.
|
|
98
|
+
|
|
99
|
+
```ruby
|
|
100
|
+
route :about_us, path: "about-us"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
This will look for a file `about-us.html` for the given route. You can point any route to whatever file or directory that you want.
|
|
104
|
+
|
|
105
|
+
```ruby
|
|
106
|
+
route :about_us, path: "about/about-company"
|
|
107
|
+
```
|
|
108
|
+
**url**
|
|
109
|
+
You can have routes that link to external endpoints, simple add the `url` attribute to your route:
|
|
110
|
+
|
|
111
|
+
```ruby
|
|
112
|
+
route :client_login, url: "https://link-to-external-site.com"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Nested Paths**
|
|
116
|
+
You can easily nest paths by adding additional routes to a route block. For example:
|
|
117
|
+
|
|
118
|
+
```ruby
|
|
119
|
+
route :about do
|
|
120
|
+
route :team
|
|
121
|
+
route :history
|
|
122
|
+
route :location
|
|
123
|
+
end
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
This will create the following routes:
|
|
127
|
+
|
|
128
|
+
- /about
|
|
129
|
+
- /about/team
|
|
130
|
+
- /about/history
|
|
131
|
+
- /about/location
|
|
132
|
+
|
|
133
|
+
You can continue to nest if you'd like.
|
|
134
|
+
|
|
135
|
+
```ruby
|
|
136
|
+
route :about do
|
|
137
|
+
route :team do
|
|
138
|
+
route :bob
|
|
139
|
+
route :sally do
|
|
140
|
+
route :bio
|
|
141
|
+
route :experience
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
This will create the following routes:
|
|
148
|
+
|
|
149
|
+
- /about
|
|
150
|
+
- /about/team
|
|
151
|
+
- /about/team/bob
|
|
152
|
+
- /about/team/sally
|
|
153
|
+
- /about/team/sally/bio
|
|
154
|
+
- /about/team/sally/experience
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
**index**
|
|
158
|
+
If you want to nest pages but don't want an index route then you can exlude that from the route generation.
|
|
159
|
+
|
|
160
|
+
```ruby
|
|
161
|
+
route :service, index: false do
|
|
162
|
+
route :design
|
|
163
|
+
route :development
|
|
164
|
+
end
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
This will avoid trying to match the url `/services` to `services/index.html`. This is useful wen you don't have index files for a subdirectory.
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
**query params**
|
|
171
|
+
You can pass query params to any route like you do with the rails router. Simple pass the query key and value as a hash to the route.
|
|
172
|
+
|
|
173
|
+
```ruby
|
|
174
|
+
= link_to "Contact Us", contact_path(ref: "work", location: "header")
|
|
175
|
+
#=> /contact?ref=work&location=header
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Things to note
|
|
179
|
+
|
|
180
|
+
One thing to note is that the index root needs to be setup like this:
|
|
181
|
+
|
|
182
|
+
```ruby
|
|
183
|
+
Router.draw do
|
|
184
|
+
route :home, path: ""
|
|
185
|
+
end
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Otherwise, it'll try to route `Router.home_path` to `home.html`.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require 'bundler'
|
|
2
|
+
Bundler::GemHelper.install_tasks
|
|
3
|
+
|
|
4
|
+
require 'cucumber/rake/task'
|
|
5
|
+
|
|
6
|
+
Cucumber::Rake::Task.new(:cucumber, 'Run features that should pass') do |t|
|
|
7
|
+
t.cucumber_opts = '--color --tags ~@wip --strict'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
require 'rake/clean'
|
|
11
|
+
|
|
12
|
+
task test: ['cucumber']
|
|
13
|
+
|
|
14
|
+
task default: :test
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Require core library
|
|
2
|
+
require 'middleman-core'
|
|
3
|
+
require 'middleman-router/mapper'
|
|
4
|
+
|
|
5
|
+
# TODO
|
|
6
|
+
# -[ ] Auto reload the routes when they are updated
|
|
7
|
+
# -[ ] Need ability to add `root_path` which defaults to index.html
|
|
8
|
+
# -[ ] index: false should work
|
|
9
|
+
# -[ ] Refactor so "Router.path_name" is not required, only 'path_name'
|
|
10
|
+
# -[ ] Ability to print out all routes, e.g. `rake routes`
|
|
11
|
+
# -[ ] Ability to add "/" at the end of each route
|
|
12
|
+
|
|
13
|
+
# Extension namespace
|
|
14
|
+
class Router < ::Middleman::Extension
|
|
15
|
+
option :routes_location, 'lib/routes'
|
|
16
|
+
|
|
17
|
+
@app = nil
|
|
18
|
+
|
|
19
|
+
def initialize(app, options_hash={}, &block)
|
|
20
|
+
super
|
|
21
|
+
|
|
22
|
+
@app = app
|
|
23
|
+
require options.routes_location
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def after_configuration
|
|
27
|
+
# Do something
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class << self
|
|
31
|
+
def draw(&block)
|
|
32
|
+
mapper = Mapper.new(self)
|
|
33
|
+
mapper.instance_exec(&block)
|
|
34
|
+
nil
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def add_route(path_name, path_url)
|
|
38
|
+
puts "#{path_name} => #{path_url}"
|
|
39
|
+
define_singleton_method(path_name) do |*args|
|
|
40
|
+
url(path_url, args.first)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
self.expose_to_template << path_name
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def url(path, *args)
|
|
49
|
+
options = args.first
|
|
50
|
+
|
|
51
|
+
if options
|
|
52
|
+
path = "#{path}?#{options.to_query}"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
path
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
class Mapper
|
|
2
|
+
# A Resource class for a route. Basically just a way
|
|
3
|
+
# to hold data for a route
|
|
4
|
+
class Resource
|
|
5
|
+
attr_accessor :name, :route_name, :path, :enabled
|
|
6
|
+
|
|
7
|
+
def initialize(options={})
|
|
8
|
+
@name = options[:name]
|
|
9
|
+
@route_name = options[:route_name]
|
|
10
|
+
@path = options[:path]
|
|
11
|
+
@enabled = options[:enabled]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def enabled?
|
|
15
|
+
@enabled == true
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Initialize the Mapper
|
|
20
|
+
def initialize(set)
|
|
21
|
+
@set = set
|
|
22
|
+
@resources = []
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Route
|
|
26
|
+
# Creates a new route and any child routes
|
|
27
|
+
#
|
|
28
|
+
# Usage: route :about_us, path: "about-us", as: "about"
|
|
29
|
+
def route(*args, &block)
|
|
30
|
+
resource = build_resource(args, @scope)
|
|
31
|
+
|
|
32
|
+
if resource.enabled?
|
|
33
|
+
@set.add_route(resource.route_name, resource.path)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# If a block is passed, then let's create routes
|
|
37
|
+
# for each child route in the block
|
|
38
|
+
#
|
|
39
|
+
if block_given?
|
|
40
|
+
previous_scope = @scope
|
|
41
|
+
@scope = resource
|
|
42
|
+
|
|
43
|
+
self.instance_exec(&block)
|
|
44
|
+
|
|
45
|
+
@scope = previous_scope
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
# Create a Resource for the route
|
|
52
|
+
def build_resource(args, scope=nil)
|
|
53
|
+
options = args.last.is_a?(::Hash) ? args.pop : {}
|
|
54
|
+
options[:scope] = scope if scope
|
|
55
|
+
enabled = !(options[:index] == false)
|
|
56
|
+
route = args.first
|
|
57
|
+
|
|
58
|
+
# Set the route attributes, name, path, etc
|
|
59
|
+
name = named(route, options)
|
|
60
|
+
route_name = named_route(route, options)
|
|
61
|
+
path = url_route(route, options)
|
|
62
|
+
|
|
63
|
+
# Create and return the route resource
|
|
64
|
+
Resource.new(
|
|
65
|
+
name: name,
|
|
66
|
+
route_name: route_name,
|
|
67
|
+
path: path,
|
|
68
|
+
enabled: enabled
|
|
69
|
+
)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Returns the named_route that can be access as a
|
|
73
|
+
# global helper on the front-end
|
|
74
|
+
def named_route(route_name, options={})
|
|
75
|
+
label = named(route_name, options)
|
|
76
|
+
# Return it as a underscored symbol
|
|
77
|
+
"#{label}_path".underscore.to_sym
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def named(route_name, options={})
|
|
81
|
+
# User can override the name
|
|
82
|
+
if options[:as]
|
|
83
|
+
route_name = options[:as]
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# If there is a parent/scope, then let's prepend
|
|
87
|
+
# that route to the named_route
|
|
88
|
+
if options[:scope]
|
|
89
|
+
route_name = "#{route_name}_#{options[:scope].name}"
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
route_name
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Return the URL fro the route
|
|
96
|
+
def url_route(route_name, options={})
|
|
97
|
+
if options[:url]
|
|
98
|
+
return options[:url]
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Ability to customize this
|
|
102
|
+
if options[:path]
|
|
103
|
+
if options[:path].empty?
|
|
104
|
+
return "/"
|
|
105
|
+
else
|
|
106
|
+
path = options[:path]
|
|
107
|
+
end
|
|
108
|
+
else
|
|
109
|
+
path = route_name
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Nest under a parent/scope route if required
|
|
113
|
+
if options[:scope]
|
|
114
|
+
path = "#{options[:scope].path}#{parameterize(path)}"
|
|
115
|
+
else
|
|
116
|
+
path = "/#{parameterize(path)}"
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
"#{path}/"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Parameterize a string
|
|
123
|
+
def parameterize(string)
|
|
124
|
+
string = string.to_s
|
|
125
|
+
|
|
126
|
+
# Turn unwanted chars into the separator.
|
|
127
|
+
string.gsub!(/[^a-z0-9\-_]+/i, '-')
|
|
128
|
+
string.downcase!
|
|
129
|
+
|
|
130
|
+
string
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require 'middleman-router'
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
|
|
4
|
+
Gem::Specification.new do |s|
|
|
5
|
+
s.name = "middleman-router"
|
|
6
|
+
s.version = "0.0.1"
|
|
7
|
+
s.licenses = ['MIT']
|
|
8
|
+
s.platform = Gem::Platform::RUBY
|
|
9
|
+
s.authors = ["John Koht"]
|
|
10
|
+
s.email = ["john@kohactive.com"]
|
|
11
|
+
s.homepage = "https://github.com/kohactive/middleman-router"
|
|
12
|
+
s.summary = %q{A simple router for Middleman projects}
|
|
13
|
+
s.description = %q{A simple router for Middleman projets, inspired by the Rails router}
|
|
14
|
+
|
|
15
|
+
s.files = `git ls-files`.split("\n")
|
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
18
|
+
s.require_paths = ["lib"]
|
|
19
|
+
|
|
20
|
+
# The version of middleman-core your extension depends on
|
|
21
|
+
s.add_runtime_dependency("middleman-core", '~> 4.2', '>= 4.2.1')
|
|
22
|
+
|
|
23
|
+
# Additional dependencies
|
|
24
|
+
# s.add_runtime_dependency("gem-name", "gem-version")
|
|
25
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: middleman-router
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- John Koht
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2018-07-20 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: middleman-core
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '4.2'
|
|
20
|
+
- - ">="
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: 4.2.1
|
|
23
|
+
type: :runtime
|
|
24
|
+
prerelease: false
|
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
26
|
+
requirements:
|
|
27
|
+
- - "~>"
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '4.2'
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: 4.2.1
|
|
33
|
+
description: A simple router for Middleman projets, inspired by the Rails router
|
|
34
|
+
email:
|
|
35
|
+
- john@kohactive.com
|
|
36
|
+
executables: []
|
|
37
|
+
extensions: []
|
|
38
|
+
extra_rdoc_files: []
|
|
39
|
+
files:
|
|
40
|
+
- ".gitignore"
|
|
41
|
+
- Gemfile
|
|
42
|
+
- README.md
|
|
43
|
+
- Rakefile
|
|
44
|
+
- features/support/env.rb
|
|
45
|
+
- lib/middleman-router.rb
|
|
46
|
+
- lib/middleman-router/extension.rb
|
|
47
|
+
- lib/middleman-router/mapper.rb
|
|
48
|
+
- lib/middleman_extension.rb
|
|
49
|
+
- middleman-router.gemspec
|
|
50
|
+
homepage: https://github.com/kohactive/middleman-router
|
|
51
|
+
licenses:
|
|
52
|
+
- MIT
|
|
53
|
+
metadata: {}
|
|
54
|
+
post_install_message:
|
|
55
|
+
rdoc_options: []
|
|
56
|
+
require_paths:
|
|
57
|
+
- lib
|
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
59
|
+
requirements:
|
|
60
|
+
- - ">="
|
|
61
|
+
- !ruby/object:Gem::Version
|
|
62
|
+
version: '0'
|
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '0'
|
|
68
|
+
requirements: []
|
|
69
|
+
rubyforge_project:
|
|
70
|
+
rubygems_version: 2.6.11
|
|
71
|
+
signing_key:
|
|
72
|
+
specification_version: 4
|
|
73
|
+
summary: A simple router for Middleman projects
|
|
74
|
+
test_files:
|
|
75
|
+
- features/support/env.rb
|