gretel-trails 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.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.travis.yml +11 -0
  4. data/Gemfile +18 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +123 -0
  7. data/Rakefile +10 -0
  8. data/gretel-trails.gemspec +28 -0
  9. data/lib/assets/javascripts/gretel.trails.hidden.js.coffee.erb +32 -0
  10. data/lib/assets/javascripts/gretel.trails.jsuri.js.coffee +370 -0
  11. data/lib/gretel/trails/engine.rb +6 -0
  12. data/lib/gretel/trails/strategies/hidden_strategy.rb +57 -0
  13. data/lib/gretel/trails/version.rb +5 -0
  14. data/lib/gretel/trails.rb +25 -0
  15. data/lib/gretel-trails.rb +1 -0
  16. data/test/dummy/README.rdoc +261 -0
  17. data/test/dummy/Rakefile +7 -0
  18. data/test/dummy/app/assets/javascripts/application.js +16 -0
  19. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  20. data/test/dummy/app/controllers/application_controller.rb +3 -0
  21. data/test/dummy/app/controllers/categories_controller.rb +5 -0
  22. data/test/dummy/app/controllers/products_controller.rb +13 -0
  23. data/test/dummy/app/controllers/reviews_controller.rb +5 -0
  24. data/test/dummy/app/helpers/application_helper.rb +2 -0
  25. data/test/dummy/app/mailers/.gitkeep +0 -0
  26. data/test/dummy/app/models/.gitkeep +0 -0
  27. data/test/dummy/app/models/category.rb +11 -0
  28. data/test/dummy/app/models/product.rb +11 -0
  29. data/test/dummy/app/views/categories/show.html.erb +9 -0
  30. data/test/dummy/app/views/layouts/application.html.erb +16 -0
  31. data/test/dummy/app/views/products/recent.html.erb +9 -0
  32. data/test/dummy/app/views/products/show.html.erb +17 -0
  33. data/test/dummy/app/views/reviews/index.html.erb +13 -0
  34. data/test/dummy/config/application.rb +59 -0
  35. data/test/dummy/config/boot.rb +10 -0
  36. data/test/dummy/config/breadcrumbs.rb +21 -0
  37. data/test/dummy/config/database.yml +25 -0
  38. data/test/dummy/config/environment.rb +5 -0
  39. data/test/dummy/config/environments/development.rb +37 -0
  40. data/test/dummy/config/environments/production.rb +67 -0
  41. data/test/dummy/config/environments/test.rb +37 -0
  42. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  43. data/test/dummy/config/initializers/gretel.rb +2 -0
  44. data/test/dummy/config/initializers/inflections.rb +15 -0
  45. data/test/dummy/config/initializers/mime_types.rb +5 -0
  46. data/test/dummy/config/initializers/secret_token.rb +7 -0
  47. data/test/dummy/config/initializers/session_store.rb +8 -0
  48. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  49. data/test/dummy/config/locales/en.yml +5 -0
  50. data/test/dummy/config/routes.rb +9 -0
  51. data/test/dummy/config.ru +4 -0
  52. data/test/dummy/db/migrate/20131016195709_create_products.rb +13 -0
  53. data/test/dummy/db/migrate/20131016195903_create_categories.rb +11 -0
  54. data/test/dummy/db/migrate/20131016201943_create_gretel_trails.rb +11 -0
  55. data/test/dummy/db/schema.rb +45 -0
  56. data/test/dummy/lib/assets/.gitkeep +0 -0
  57. data/test/dummy/log/.gitkeep +0 -0
  58. data/test/dummy/public/404.html +26 -0
  59. data/test/dummy/public/422.html +26 -0
  60. data/test/dummy/public/500.html +25 -0
  61. data/test/dummy/public/favicon.ico +0 -0
  62. data/test/dummy/script/rails +6 -0
  63. data/test/dummy/test/fixtures/categories.yml +9 -0
  64. data/test/dummy/test/fixtures/products.yml +11 -0
  65. data/test/gretel_trails_test.rb +67 -0
  66. data/test/test_helper.rb +28 -0
  67. metadata +272 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 75ba4eea078b14bb0d61eb137262d08d24388554
4
+ data.tar.gz: aacf75c20b0fea1e345149b423e73a38dc165c6f
5
+ SHA512:
6
+ metadata.gz: 1ccee9ba8ed783a89dc99844d5d090b562f582a28520e68360ebe1e97c13d9a1cde904d3ceb78b3cd7a626e6365a813905d5ee7ecbb46bea2934316b371d7b48
7
+ data.tar.gz: 304d444bfdde884621754e8e9b3499dad62554e6092f7c2361cd117e9006ecdca79874f259b99a02f8c7071a543c8747d05d677e8f22458818a9c20b434fba0d
data/.gitignore ADDED
@@ -0,0 +1,23 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ log/*.log
19
+ test/dummy/db/*.sqlite3
20
+ test/dummy/log/*.log
21
+ test/dummy/tmp/
22
+ test/dummy/.sass-cache
23
+ .DS_Store
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
5
+ before_install:
6
+ - "export DISPLAY=:99.0"
7
+ - "sh -e /etc/init.d/xvfb start"
8
+ before_script:
9
+ - "cd test/dummy; rake db:migrate; rake db:test:prepare; cd ../.."
10
+ notifications:
11
+ email: false
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Declare your gem's dependencies in gretel.gemspec.
4
+ # Bundler will treat runtime dependencies like base dependencies, and
5
+ # development dependencies will be added by default to the :development group.
6
+ gemspec
7
+
8
+ # Used by the dummy application
9
+ gem "jquery-rails"
10
+ gem "coffee-rails"
11
+
12
+ # Declare any dependencies that are still in development here instead of in
13
+ # your gemspec. These might include edge Rails or gems from your path or
14
+ # Git. Remember to move these dependencies to your gemspec before releasing
15
+ # your gem to rubygems.org.
16
+
17
+ # To use debugger
18
+ # gem 'debugger'
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Lasse Bunk
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,123 @@
1
+ [![Build Status](https://secure.travis-ci.org/lassebunk/gretel-trails.png)](http://travis-ci.org/lassebunk/gretel-trails)
2
+
3
+ # Gretel::Trails
4
+
5
+ Gretel::Trails makes it easy to hide [Gretel](https://github.com/lassebunk/gretel) breadcrumb trails from the user, so they don't see them in URLs when navigating your site.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your Gemfile:
10
+
11
+ ```bash
12
+ gem 'gretel-trails'
13
+ ```
14
+
15
+ And run:
16
+
17
+ ```bash
18
+ $ bundle
19
+ ```
20
+
21
+ In an initializer, e.g. *config/initializers/gretel.rb*:
22
+
23
+ ```ruby
24
+ Gretel::Trails.strategy = :hidden
25
+ ```
26
+
27
+ Add a data attribute with the trail to your `<body>` tag, in *application.html.erb*:
28
+
29
+ ```erb
30
+ <body data-trail="<%= breadcrumb_trail %>">
31
+ ...
32
+ ```
33
+
34
+ And finally, at the bottom of *app/assets/javascripts/application.js*:
35
+
36
+ ```js
37
+ //= require gretel.trails.hidden
38
+ ```
39
+
40
+ Breadcrumb trails are now hidden from the user so they don't see them in URLs. It uses data attributes and `history.replaceState` to hide the trails from the URL.
41
+ For older browsers it falls back gracefully to showing trails in the URL, as specified by `Gretel.trail_param`.
42
+
43
+ Note: If you use [Turbolinks](https://github.com/rails/turbolinks), it's important that you add the require *after* you require Turbolinks. Else it won't work.
44
+
45
+ ## Usage
46
+
47
+ When you want to invisibly add the current trail when the user clicks a link, you add a special JS selector to the link where you want the trail added on click:
48
+
49
+ ```erb
50
+ <% @products.each do |product| %>
51
+ <%= link_to "My product", product, class: "js-append-trail" %>
52
+ <% end %>
53
+ ```
54
+
55
+ Trails are now transferred invisibly to the next page when the user clicks a link.
56
+
57
+ See Customization below for info on changing the `.js-append-trail` selector.
58
+
59
+ ### Custom links
60
+
61
+ Inside breadcrumbs, the links are automatically transformed with trails removed from the URLs and applied as data attributes instead.
62
+ If you want to do custom breadcrumb links with these changes applied, you can use the `breadcrumb_link_to` helper:
63
+
64
+ ```erb
65
+ <% parent_breadcrumb do |parent| %>
66
+ <%= breadcrumb_link_to "Back to #{parent.text}", parent.url %>
67
+ <% end %>
68
+ ```
69
+
70
+ The link will now have a URL without the trail param and `data-trail` containing the trail.
71
+
72
+ ## Customization
73
+
74
+ ### JS selector
75
+
76
+ If you want to customize the JS selector (the default is `.js-append-trail`), you can do so in an initializer:
77
+
78
+ ```ruby
79
+ Gretel::Trails::HiddenStrategy.js_selector = ".my-other-selector"
80
+ ```
81
+
82
+ It supports all [CSS selectors](http://api.jquery.com/category/selectors/) that you can use in jQuery.
83
+
84
+ ### Data attribute
85
+
86
+ The default trail data attribute for `<body>` and links is `data-trail` but you can change this in an initializer:
87
+
88
+ ```ruby
89
+ Gretel::Trails::HiddenStrategy.data_attribute = "other-data-attribute"
90
+ ```
91
+
92
+ That's it. :)
93
+
94
+ ### Trail param
95
+
96
+ The trail param that's hidden from the user is `params[:trail]` by default. You can change this in an initializer:
97
+
98
+ ```ruby
99
+ Gretel.trail_param = :other_param
100
+ ```
101
+
102
+ ## Requirements
103
+
104
+ * Ruby >= 1.9.3 (1.9.2 may work)
105
+ * Rails >= 3.2.0
106
+ * Gretel >= 3.0.0
107
+ * jQuery
108
+
109
+ ## Contributing
110
+
111
+ You are very welcome to contribute with bug fixes or new features. To contribute:
112
+
113
+ 1. Fork the project
114
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
115
+ 3. Commit your changes (`git commit -am 'Add feature'`)
116
+ 4. Push to the branch (`git push origin my-new-feature`)
117
+ 5. Create new pull request
118
+
119
+ ## Versioning
120
+
121
+ Follows [semantic versioning](http://semver.org/).
122
+
123
+ Copyright (c) 2013 [Lasse Bunk](http://lassebunk.dk), released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'rake/testtask'
2
+ require 'bundler/gem_tasks'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << "test"
6
+ t.test_files = FileList['test/**/*_test.rb']
7
+ t.verbose = true
8
+ end
9
+
10
+ task default: :test
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'gretel/trails/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "gretel-trails"
8
+ spec.version = Gretel::Trails::VERSION
9
+ spec.authors = ["Lasse Bunk"]
10
+ spec.email = ["lassebunk@gmail.com"]
11
+ spec.description = %q{Gretel::Trails is a collection of strategies for handling Gretel trails.}
12
+ spec.summary = %q{Collection of strategies for handling Gretel trails.}
13
+ spec.homepage = "https://github.com/lassebunk/gretel-trails"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.test_files = spec.files.grep(%r{^test/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "gretel", ">= 3.0.0.beta4"
21
+ spec.add_dependency "rails", ">= 3.2.0"
22
+ spec.add_development_dependency "rails", "~> 3.2.13"
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "sqlite3"
25
+ spec.add_development_dependency "rake"
26
+ spec.add_development_dependency "capybara", "~> 2.1.0"
27
+ spec.add_development_dependency "capybara-webkit", "~> 1.0.0"
28
+ end
@@ -0,0 +1,32 @@
1
+ //= require gretel.trails.jsuri
2
+
3
+ <%
4
+ unless defined?(Gretel::Trails::HiddenStrategy)
5
+ raise "Gretel::Trails::HiddenStrategy` was not found. Please add `Gretel::Trails.strategy = :hidden` to an initializer."
6
+ end
7
+ %>
8
+
9
+ # Remove trail from querystring
10
+ removeTrailFromUrl = ->
11
+ if history.replaceState?
12
+ return if location.href.indexOf("<%= Gretel.trail_param %>=") is -1
13
+ uri = new Gretel.Trails.Uri(location.href)
14
+ history.replaceState history.state, document.title, uri.deleteQueryParam("<%= Gretel.trail_param %>")
15
+
16
+ # Remove trail on load
17
+ removeTrailFromUrl()
18
+
19
+ if Turbolinks?
20
+ # Remove trail after page change
21
+ $(document).on "page:change", -> removeTrailFromUrl()
22
+
23
+ # Add trails to querystring
24
+ $ ->
25
+ $("body").on "click", "[data-<%= Gretel::Trails::HiddenStrategy.data_attribute %>], <%= Gretel::Trails::HiddenStrategy.js_selector %>", ->
26
+ if trail = $(this).data("<%= Gretel::Trails::HiddenStrategy.data_attribute %>") || $("body").data("<%= Gretel::Trails::HiddenStrategy.data_attribute %>")
27
+ href = $(this).attr("href")
28
+ uri = new Gretel.Trails.Uri(href)
29
+ href = uri.deleteQueryParam("<%= Gretel.trail_param %>").addQueryParam("<%= Gretel.trail_param %>", trail)
30
+ $(this).attr("href", href)
31
+ else
32
+ console?.log "[Gretel] No `data-<%= Gretel::Trails::HiddenStrategy.data_attribute %>` was found on the <body> tag or the link you just clicked. Please set it using the `breadcrumb_trail` helper or see the Gretel::Trails readme for more info."
@@ -0,0 +1,370 @@
1
+ #!
2
+ # * jsUri v1.1.1 – ported to CoffeeScript with http://js2coffee.org/
3
+ # * https://github.com/derek-watson/jsUri
4
+ # *
5
+ # * Copyright 2011, Derek Watson
6
+ # * Released under the MIT license.
7
+ # * http://jquery.org/license
8
+ # *
9
+ # * Includes parseUri regular expressions
10
+ # * http://blog.stevenlevithan.com/archives/parseuri
11
+ # * Copyright 2007, Steven Levithan
12
+ # * Released under the MIT license.
13
+ # *
14
+ # * Date: Mon Nov 14 20:06:34 2011 -0800
15
+ #
16
+ window.Gretel or= {}
17
+ window.Gretel.Trails or= {}
18
+
19
+ window.Gretel.Trails.Query = (queryString) ->
20
+
21
+ # query string parsing, parameter manipulation and stringification
22
+ "use strict"
23
+ # parseQuery(q) parses the uri query string and returns a multi-dimensional array of the components
24
+ parseQuery = (q) ->
25
+ arr = []
26
+ i = undefined
27
+ ps = undefined
28
+ p = undefined
29
+ keyval = undefined
30
+ return arr if typeof (q) is "undefined" or q is null or q is ""
31
+ q = q.substring(1) if q.indexOf("?") is 0
32
+ ps = q.toString().split(/[&;]/)
33
+ i = 0
34
+ while i < ps.length
35
+ p = ps[i]
36
+ keyval = p.split("=")
37
+ arr.push [keyval[0], keyval[1]]
38
+ i++
39
+ arr
40
+
41
+ params = parseQuery(queryString)
42
+
43
+ # toString() returns a string representation of the internal state of the object
44
+ toString = ->
45
+ s = ""
46
+ i = undefined
47
+ param = undefined
48
+ i = 0
49
+ while i < params.length
50
+ param = params[i]
51
+ s += "&" if s.length > 0
52
+ s += param.join("=")
53
+ i++
54
+ (if s.length > 0 then "?" + s else s)
55
+
56
+ decode = (s) ->
57
+ s = decodeURIComponent(s)
58
+ s = s.replace("+", " ")
59
+ s
60
+
61
+
62
+ # getParamValues(key) returns the first query param value found for the key 'key'
63
+ getParamValue = (key) ->
64
+ param = undefined
65
+ i = undefined
66
+ i = 0
67
+ while i < params.length
68
+ param = params[i]
69
+ return param[1] if decode(key) is decode(param[0])
70
+ i++
71
+
72
+
73
+ # getParamValues(key) returns an array of query param values for the key 'key'
74
+ getParamValues = (key) ->
75
+ arr = []
76
+ i = undefined
77
+ param = undefined
78
+ i = 0
79
+ while i < params.length
80
+ param = params[i]
81
+ arr.push param[1] if decode(key) is decode(param[0])
82
+ i++
83
+ arr
84
+
85
+
86
+ # deleteParam(key) removes all instances of parameters named (key)
87
+ # deleteParam(key, val) removes all instances where the value matches (val)
88
+ deleteParam = (args...) ->
89
+ [key, val] = args
90
+ arr = []
91
+ i = undefined
92
+ param = undefined
93
+ keyMatchesFilter = undefined
94
+ valMatchesFilter = undefined
95
+ i = 0
96
+ while i < params.length
97
+ param = params[i]
98
+ keyMatchesFilter = decode(param[0]) is decode(key)
99
+ valMatchesFilter = decode(param[1]) is decode(val)
100
+ arr.push param if (args.length is 1 and not keyMatchesFilter) or (args.length is 2 and not keyMatchesFilter and not valMatchesFilter)
101
+ i++
102
+ params = arr
103
+ this
104
+
105
+
106
+ # addParam(key, val) Adds an element to the end of the list of query parameters
107
+ # addParam(key, val, index) adds the param at the specified position (index)
108
+ addParam = (args...) ->
109
+ [key, val, index] = args
110
+ if args.length is 3 and index isnt -1
111
+ index = Math.min(index, params.length)
112
+ params.splice index, 0, [key, val]
113
+ else params.push [key, val] if args.length > 0
114
+ this
115
+
116
+
117
+ # replaceParam(key, newVal) deletes all instances of params named (key) and replaces them with the new single value
118
+ # replaceParam(key, newVal, oldVal) deletes only instances of params named (key) with the value (val) and replaces them with the new single value
119
+ # this function attempts to preserve query param ordering
120
+ replaceParam = (args...) ->
121
+ [key, newVal, oldVal] = args
122
+ index = -1
123
+ i = undefined
124
+ param = undefined
125
+ if args.length is 3
126
+ i = 0
127
+ while i < params.length
128
+ param = params[i]
129
+ if decode(param[0]) is decode(key) and decodeURIComponent(param[1]) is decode(oldVal)
130
+ index = i
131
+ break
132
+ i++
133
+ deleteParam(key, oldVal).addParam key, newVal, index
134
+ else
135
+ i = 0
136
+ while i < params.length
137
+ param = params[i]
138
+ if decode(param[0]) is decode(key)
139
+ index = i
140
+ break
141
+ i++
142
+ deleteParam key
143
+ addParam key, newVal, index
144
+ this
145
+
146
+
147
+ # public api
148
+ getParamValue: getParamValue
149
+ getParamValues: getParamValues
150
+ deleteParam: deleteParam
151
+ addParam: addParam
152
+ replaceParam: replaceParam
153
+ toString: toString
154
+
155
+ window.Gretel.Trails.Uri = (uriString) ->
156
+
157
+ # uri string parsing, attribute manipulation and stringification
158
+ "use strict"
159
+
160
+ #global Query: true
161
+
162
+ #jslint regexp: false, plusplus: false
163
+ strictMode = false
164
+
165
+ # parseUri(str) parses the supplied uri and returns an object containing its components
166
+ parseUri = (str) ->
167
+
168
+ #jslint unparam: true
169
+ parsers =
170
+ strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/
171
+ loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
172
+
173
+ keys = ["source", "protocol", "authority", "userInfo", "user", "password", "host", "port", "relative", "path", "directory", "file", "query", "anchor"]
174
+ q =
175
+ name: "queryKey"
176
+ parser: /(?:^|&)([^&=]*)=?([^&]*)/g
177
+
178
+ m = parsers[(if strictMode then "strict" else "loose")].exec(str)
179
+ uri = {}
180
+ i = 14
181
+ uri[keys[i]] = m[i] or "" while i--
182
+ uri[q.name] = {}
183
+ uri[keys[12]].replace q.parser, ($0, $1, $2) ->
184
+ uri[q.name][$1] = $2 if $1
185
+
186
+ uri
187
+
188
+ uriParts = parseUri(uriString or "")
189
+ queryObj = new Gretel.Trails.Query(uriParts.query)
190
+
191
+ #
192
+ # Basic get/set functions for all properties
193
+ #
194
+ protocol = (val) ->
195
+ uriParts.protocol = val if typeof val isnt "undefined"
196
+ uriParts.protocol
197
+
198
+ hasAuthorityPrefixUserPref = null
199
+
200
+ # hasAuthorityPrefix: if there is no protocol, the leading // can be enabled or disabled
201
+ hasAuthorityPrefix = (val) ->
202
+ hasAuthorityPrefixUserPref = val if typeof val isnt "undefined"
203
+ if hasAuthorityPrefixUserPref is null
204
+ uriParts.source.indexOf("//") isnt -1
205
+ else
206
+ hasAuthorityPrefixUserPref
207
+
208
+ userInfo = (val) ->
209
+ uriParts.userInfo = val if typeof val isnt "undefined"
210
+ uriParts.userInfo
211
+
212
+ host = (val) ->
213
+ uriParts.host = val if typeof val isnt "undefined"
214
+ uriParts.host
215
+
216
+ port = (val) ->
217
+ uriParts.port = val if typeof val isnt "undefined"
218
+ uriParts.port
219
+
220
+ path = (val) ->
221
+ uriParts.path = val if typeof val isnt "undefined"
222
+ uriParts.path
223
+
224
+ query = (val) ->
225
+ queryObj = new Gretel.Trails.Query(val) if typeof val isnt "undefined"
226
+ queryObj
227
+
228
+ anchor = (val) ->
229
+ uriParts.anchor = val if typeof val isnt "undefined"
230
+ uriParts.anchor
231
+
232
+
233
+ #
234
+ # Fluent setters for Uri uri properties
235
+ #
236
+ setProtocol = (val) ->
237
+ protocol val
238
+ this
239
+
240
+ setHasAuthorityPrefix = (val) ->
241
+ hasAuthorityPrefix val
242
+ this
243
+
244
+ setUserInfo = (val) ->
245
+ userInfo val
246
+ this
247
+
248
+ setHost = (val) ->
249
+ host val
250
+ this
251
+
252
+ setPort = (val) ->
253
+ port val
254
+ this
255
+
256
+ setPath = (val) ->
257
+ path val
258
+ this
259
+
260
+ setQuery = (val) ->
261
+ query val
262
+ this
263
+
264
+ setAnchor = (val) ->
265
+ anchor val
266
+ this
267
+
268
+
269
+ #
270
+ # Query method wrappers
271
+ #
272
+ getQueryParamValue = (key) ->
273
+ query().getParamValue key
274
+
275
+ getQueryParamValues = (key) ->
276
+ query().getParamValues key
277
+
278
+ deleteQueryParam = (args...) ->
279
+ [key, val] = args
280
+ if args.length is 2
281
+ query().deleteParam key, val
282
+ else
283
+ query().deleteParam key
284
+ this
285
+
286
+ addQueryParam = (args...) ->
287
+ [key, val, index] = args
288
+ if args.length is 3
289
+ query().addParam key, val, index
290
+ else
291
+ query().addParam key, val
292
+ this
293
+
294
+ replaceQueryParam = (args...) ->
295
+ [key, newVal, oldVal] = args
296
+ if args.length is 3
297
+ query().replaceParam key, newVal, oldVal
298
+ else
299
+ query().replaceParam key, newVal
300
+ this
301
+
302
+
303
+ #
304
+ # Serialization
305
+ #
306
+
307
+ # toString() stringifies the current state of the uri
308
+ toString = ->
309
+ s = ""
310
+ is_ = (s) ->
311
+ s isnt null and s isnt ""
312
+
313
+ if is_(protocol())
314
+ s += protocol()
315
+ s += ":" if protocol().indexOf(":") isnt protocol().length - 1
316
+ s += "//"
317
+ else
318
+ s += "//" if hasAuthorityPrefix() and is_(host())
319
+ if is_(userInfo()) and is_(host())
320
+ s += userInfo()
321
+ s += "@" if userInfo().indexOf("@") isnt userInfo().length - 1
322
+ if is_(host())
323
+ s += host()
324
+ s += ":" + port() if is_(port())
325
+ if is_(path())
326
+ s += path()
327
+ else
328
+ s += "/" if is_(host()) and (is_(query().toString()) or is_(anchor()))
329
+ if is_(query().toString())
330
+ s += "?" if query().toString().indexOf("?") isnt 0
331
+ s += query().toString()
332
+ if is_(anchor())
333
+ s += "#" if anchor().indexOf("#") isnt 0
334
+ s += anchor()
335
+ s
336
+
337
+
338
+ #
339
+ # Cloning
340
+ #
341
+
342
+ # clone() returns a new, identical Uri instance
343
+ clone = ->
344
+ new Uri(toString())
345
+
346
+
347
+ # public api
348
+ protocol: protocol
349
+ hasAuthorityPrefix: hasAuthorityPrefix
350
+ userInfo: userInfo
351
+ host: host
352
+ port: port
353
+ path: path
354
+ query: query
355
+ anchor: anchor
356
+ setProtocol: setProtocol
357
+ setHasAuthorityPrefix: setHasAuthorityPrefix
358
+ setUserInfo: setUserInfo
359
+ setHost: setHost
360
+ setPort: setPort
361
+ setPath: setPath
362
+ setQuery: setQuery
363
+ setAnchor: setAnchor
364
+ getQueryParamValue: getQueryParamValue
365
+ getQueryParamValues: getQueryParamValues
366
+ deleteQueryParam: deleteQueryParam
367
+ addQueryParam: addQueryParam
368
+ replaceQueryParam: replaceQueryParam
369
+ toString: toString
370
+ clone: clone
@@ -0,0 +1,6 @@
1
+ module Gretel
2
+ module Trails
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end