durl-rails 1.0.0
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 +8 -0
- data/CHANGELOG.md +3 -0
- data/CONTRIBUTING.md +9 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +59 -0
- data/Rakefile +44 -0
- data/VERSIONS.md +5 -0
- data/durl-rails.gemspec +24 -0
- data/lib/durl/rails/engine.rb +6 -0
- data/lib/durl/rails/version.rb +6 -0
- data/lib/durl/rails.rb +7 -0
- data/lib/durl-rails.rb +1 -0
- data/lib/generators/durl/install/install_generator.rb +37 -0
- data/vendor/assets/javascripts/durl.js +153 -0
- metadata +99 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c35976a924894217ab9f42710a3bdfda50c0a2a6
|
4
|
+
data.tar.gz: ab0114a5ee3ec0738b44cf71cc4cf5453e6bac54
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: eb96535badd1f389ccb451787bc6e89bfaabdc6534c0a6e00bbd7e3085c0082066da64ca9da936b6d841f3d3a97d64783dd35940a242113043b7cba96b72436e
|
7
|
+
data.tar.gz: a4243ae9d30727c85047c2030c7a456e12f8a7e21f2b6eb143ec4888991d22c92728906ee055b112c2411ed21720f589d067598eb5d037f6b02dcbdb7ca41a21
|
data/.gitignore
ADDED
data/CHANGELOG.md
ADDED
data/CONTRIBUTING.md
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2016 Tyler Kasten
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
# durl-rails
|
2
|
+
|
3
|
+
dURL! For Rails!
|
4
|
+
|
5
|
+
This gem provides:
|
6
|
+
|
7
|
+
* dURL
|
8
|
+
|
9
|
+
See [VERSIONS.md](VERSIONS.md) to see which versions of durl-rails bundle which versions of dURL.
|
10
|
+
|
11
|
+
## Versions
|
12
|
+
|
13
|
+
```
|
14
|
+
patch version bump = updates to durl-rails, and patch-level updates to dURL
|
15
|
+
minor version bump = minor-level updates to dURL
|
16
|
+
major version bump = major-level updates to dURL and updates to rails which may be backwards-incompatible
|
17
|
+
```
|
18
|
+
|
19
|
+
## Installation
|
20
|
+
|
21
|
+
Gemfile
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
gem "durl-rails"
|
25
|
+
```
|
26
|
+
|
27
|
+
And run `bundle install`. The rest of the installation depends on whether the asset pipeline is being used.
|
28
|
+
|
29
|
+
### Rails 3.1 or greater (with asset pipeline *enabled*)
|
30
|
+
|
31
|
+
The dURL files will be added to the asset pipeline and available for you to use. add these lines to `app/assets/javascripts/application.js`:
|
32
|
+
|
33
|
+
```js
|
34
|
+
//= require durl
|
35
|
+
```
|
36
|
+
|
37
|
+
### Rails 3.0 (or greater with asset pipeline *disabled*)
|
38
|
+
|
39
|
+
This gem adds a single generator: `durl:install`. Running the generator will copy dURL to the `public/javascripts` directory.
|
40
|
+
|
41
|
+
This gem will also hook into the Rails configuration process, adding dURL to the javascript files included by the `javascript_include_tag(:defaults)` call. While this gem contains the minified and un-minified versions of dURL, only the minified versions will be included in the `:defaults` when Rails is run in `production` or `test` mode (un-minified versions will be included when Rails is run in `development` mode).
|
42
|
+
|
43
|
+
To invoke the generator, run:
|
44
|
+
|
45
|
+
```sh
|
46
|
+
rails generate durl:install
|
47
|
+
```
|
48
|
+
|
49
|
+
You're done!
|
50
|
+
|
51
|
+
## Contributing
|
52
|
+
|
53
|
+
Feel free to open an issue ticket if you find something that could be improved.
|
54
|
+
|
55
|
+
## Acknowledgements
|
56
|
+
|
57
|
+
This gem's structure and technique for wrapping a JS library into a rails friendly package is based entirely on jquery-rails. Many thanks are due to all of [the jquery-rails contributors](https://github.com/rails/jquery-rails/graphs/contributors).
|
58
|
+
|
59
|
+
Copyright Tyler Kasten, released under the MIT License.
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
# Check if versions are correct between VERSION constants and .js files
|
5
|
+
#
|
6
|
+
task :release => [:guard_version]
|
7
|
+
|
8
|
+
task :guard_version do
|
9
|
+
def check_version(file, pattern, constant)
|
10
|
+
body = File.read("vendor/assets/javascripts/#{file}")
|
11
|
+
match = body.match(pattern) or abort "Version check failed: no pattern matched in #{file}"
|
12
|
+
file_version = body.match(pattern)[1]
|
13
|
+
constant_version = Durl::Rails.const_get(constant)
|
14
|
+
|
15
|
+
unless constant_version == file_version
|
16
|
+
abort "Durl::Rails::#{constant} was #{constant_version} but it should be #{file_version}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
check_version('durl.js', /Version: ([\S]+)/, 'DURL_VERSION')
|
21
|
+
end
|
22
|
+
|
23
|
+
task :update_durl do
|
24
|
+
puts "Downloading durl.js"
|
25
|
+
puts `curl -o vendor/assets/javascripts/durl.js https://raw.githubusercontent.com/tkasten/durl/master/src/durl.js`
|
26
|
+
|
27
|
+
puts "Updating version.rb"
|
28
|
+
version = false
|
29
|
+
File.foreach('vendor/assets/javascripts/durl.js') do |line|
|
30
|
+
version = line.match(/Version: ([\S]+)/)
|
31
|
+
version = version && version[1]
|
32
|
+
break if version
|
33
|
+
end
|
34
|
+
|
35
|
+
version_path = 'lib/durl/rails/version.rb'
|
36
|
+
lines = IO.readlines(version_path).map do |line|
|
37
|
+
line.gsub(/DURL_VERSION = "([\d\.]+)"/, "DURL_VERSION = \"#{version}\"")
|
38
|
+
end
|
39
|
+
File.open(version_path, 'w') do |file|
|
40
|
+
file.puts lines
|
41
|
+
end
|
42
|
+
|
43
|
+
puts "\e[32mDone!\e[0m"
|
44
|
+
end
|
data/VERSIONS.md
ADDED
data/durl-rails.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/durl/rails/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "durl-rails"
|
6
|
+
s.version = Durl::Rails::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = ["Tyler Kasten"]
|
9
|
+
s.email = ["tyler.kasten@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/tkasten/durl-rails"
|
11
|
+
s.summary = "Use dURL with Rails 3+"
|
12
|
+
s.description = "This gem provides dURL for your Rails 3+ application."
|
13
|
+
s.license = "MIT"
|
14
|
+
|
15
|
+
s.required_rubygems_version = ">= 1.3.6"
|
16
|
+
s.rubyforge_project = "durl-rails"
|
17
|
+
|
18
|
+
s.add_dependency "railties", ">= 3.0", "< 5.0"
|
19
|
+
s.add_dependency "thor", ">= 0.14", "< 2.0"
|
20
|
+
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
23
|
+
s.require_path = 'lib'
|
24
|
+
end
|
data/lib/durl/rails.rb
ADDED
data/lib/durl-rails.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'durl/rails'
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rails'
|
2
|
+
|
3
|
+
# Supply generator for Rails 3.0.x or if asset pipeline is not enabled
|
4
|
+
if ::Rails.version < "3.1" || !::Rails.application.config.assets.enabled
|
5
|
+
module Durl
|
6
|
+
module Generators
|
7
|
+
class InstallGenerator < ::Rails::Generators::Base
|
8
|
+
|
9
|
+
desc "This generator installs dURL #{Durl::Rails::DURL_VERSION}"
|
10
|
+
source_root File.expand_path('../../../../../vendor/assets/javascripts', __FILE__)
|
11
|
+
|
12
|
+
def copy_durl
|
13
|
+
say_status("copying", "dURL (#{Durl::Rails::DURL_VERSION})", :green)
|
14
|
+
copy_file "durl.js", "public/javascripts/durl.js"
|
15
|
+
copy_file "durl.min.js", "public/javascripts/durl.min.js"
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
else
|
22
|
+
module Durl
|
23
|
+
module Generators
|
24
|
+
class InstallGenerator < ::Rails::Generators::Base
|
25
|
+
desc "Just show instructions so people will know what to do when mistakenly using generator for Rails 3.1 apps"
|
26
|
+
|
27
|
+
def do_nothing
|
28
|
+
say_status("deprecated", "You are using Rails 3.1 with the asset pipeline enabled, so this generator is not needed.")
|
29
|
+
say_status("", "The necessary files are already in your asset pipeline.")
|
30
|
+
say_status("", "Just add `//= require durl` to your app/assets/javascripts/application.js")
|
31
|
+
say_status("", "If you do not want the asset pipeline enabled, you may turn it off in application.rb and re-run this generator.")
|
32
|
+
# ok, nothing
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
/*
|
2
|
+
* File: durl.js
|
3
|
+
* Version: 1.0.5
|
4
|
+
* Desc: DURL keeps your i-frame's Deep URL stored in the hash fragment of your parent page
|
5
|
+
* Doc: https://github.com/tkasten/durl
|
6
|
+
* Author: Tyler Kasten tyler.kasten@gmail.com
|
7
|
+
*/
|
8
|
+
|
9
|
+
function Durl(options){
|
10
|
+
this.options = options || {}
|
11
|
+
this.deep_url_var_name = this.options.deep_url_var_name || "durl"
|
12
|
+
this.window = this.options.window
|
13
|
+
this.pm = this.options.postMassage
|
14
|
+
|
15
|
+
if(!this.pm){
|
16
|
+
this.pm = new PostMassage({namespace: 'durl', window: this.window})
|
17
|
+
}
|
18
|
+
|
19
|
+
this.options.producer ? this.bootAsProducer() : this.bootAsConsumer()
|
20
|
+
}
|
21
|
+
|
22
|
+
Durl.prototype.bootAsProducer = function(){
|
23
|
+
if(window != parent.window){
|
24
|
+
this.log("booting: " + window.location.href)
|
25
|
+
this.pm.bind('setDURLFromConsumer', this.setDURLFromConsumer.bind(this))
|
26
|
+
this.pm.call('setDURL', encodeURIComponent(window.location.href))
|
27
|
+
var self = this
|
28
|
+
document.addEventListener("DOMContentLoaded", function(){
|
29
|
+
if("onhashchange" in window.document.body){
|
30
|
+
window.addEventListener("hashchange", function(){
|
31
|
+
self.pm.call('setDURL', encodeURIComponent(window.location.href))
|
32
|
+
})
|
33
|
+
}
|
34
|
+
})
|
35
|
+
}else{
|
36
|
+
this.log("refusing to boot, no parent window detected")
|
37
|
+
}
|
38
|
+
},
|
39
|
+
|
40
|
+
Durl.prototype.bootAsConsumer = function(){
|
41
|
+
this.log("booting")
|
42
|
+
this.pm.bind('setDURL', this.setDURL.bind(this))
|
43
|
+
if("onhashchange" in window.document.body){
|
44
|
+
var self = this
|
45
|
+
window.addEventListener("hashchange", function(){
|
46
|
+
var durl = self.getDeepPath()
|
47
|
+
self.log('sendDURLFromConsumer: ' + durl)
|
48
|
+
self.pm.call('setDURLFromConsumer', durl)
|
49
|
+
})
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
Durl.prototype.matchDeepPath = function(path) {
|
54
|
+
/**
|
55
|
+
*
|
56
|
+
* DURL will store its durl (deep url) in the consumer's hash fragment in the
|
57
|
+
* form of `this.deep_url_var_name=url_encoded_url`
|
58
|
+
*
|
59
|
+
* But we don't know how the consumer is using their hash fragment so we try
|
60
|
+
* to make safe, unobtrusive assumptions about how to integrate our data into
|
61
|
+
* their fragment. Consider the following potential use cases on their end:
|
62
|
+
*
|
63
|
+
* TKK TODO - spec these cases (also need more cases/clean-up etc)...
|
64
|
+
*
|
65
|
+
* Hash Bang style followed with traditional path and url variables
|
66
|
+
* www.example.com/page/path?var1=stuff#!/some/path?p1=v1&durl=value!&p2=v2z
|
67
|
+
* www.example.com/page/path?var1=stuff#!/some/path?p1=v1&durl=value!
|
68
|
+
*
|
69
|
+
* Same as above case but no consumer variables mixed with durl
|
70
|
+
* www.example.com/page/path?vars=stuff#!/some/path?durl=value!
|
71
|
+
*
|
72
|
+
* No Bang(!) just right into the variables
|
73
|
+
* www.example.com/page/path#?p1=v2&durl=value!
|
74
|
+
*
|
75
|
+
* Same as above but no consumer variables mixed with durl
|
76
|
+
* www.example.com/page/path#?durl=value!
|
77
|
+
*
|
78
|
+
*/
|
79
|
+
|
80
|
+
pattern = new RegExp("(\\?|&)" + this.deep_url_var_name + "=([^&\n]*)")
|
81
|
+
return pattern.exec(this.vanillaHash()) || '' // [whole match, joiner, url]
|
82
|
+
}
|
83
|
+
|
84
|
+
Durl.prototype.setDURL = function(new_url) {
|
85
|
+
new_url = new_url || ''
|
86
|
+
hash = this.vanillaHash()
|
87
|
+
|
88
|
+
if(matches = this.matchDeepPath()){
|
89
|
+
if(matches[2] == new_url){
|
90
|
+
return
|
91
|
+
}else{
|
92
|
+
whole = matches[0]
|
93
|
+
joiner = matches[1]
|
94
|
+
hash = hash.replace(whole, joiner + this.deep_url_var_name + "=" + new_url)
|
95
|
+
}
|
96
|
+
}else{
|
97
|
+
hash += hash.indexOf('?') == -1 ? '?' : '&'
|
98
|
+
hash += this.deep_url_var_name + "=" + new_url
|
99
|
+
}
|
100
|
+
|
101
|
+
this.log('replacing location: ' + hash)
|
102
|
+
location.replace('#' + hash)
|
103
|
+
}
|
104
|
+
|
105
|
+
Durl.prototype.getDeepPath = function() {
|
106
|
+
if(matches = this.matchDeepPath())
|
107
|
+
return decodeURIComponent(matches[2])
|
108
|
+
else
|
109
|
+
return ''
|
110
|
+
}
|
111
|
+
|
112
|
+
Durl.prototype.setDURLFromConsumer = function(path) {
|
113
|
+
if(window.location.href != path){
|
114
|
+
this.log('setDURLFromConsumer: ' + path)
|
115
|
+
// this sillyness is in response to receiving a new path from the consumer
|
116
|
+
// that is a double-encoded relative path (has leading encoded '/'). It's
|
117
|
+
// already been decoded once before getting here, and if we still see what
|
118
|
+
// looks like an encoded forward flash, let's decode it again.
|
119
|
+
// Discovered b/c react-router (v 0.11.6) has a double encoding bug:
|
120
|
+
// https://github.com/petehunt/react-router-1/blob/master/CHANGELOG.md
|
121
|
+
if(path.substr(0,3) == "%2F"){
|
122
|
+
path = decodeURIComponent(path)
|
123
|
+
}
|
124
|
+
window.location.replace(path)
|
125
|
+
}else{
|
126
|
+
this.log('refusing to change frame location, path is unchanged: ' + path)
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
Durl.prototype.vanillaHash = function() {
|
131
|
+
// Note that we don't use location.hash because firefox alone decodes it on read.
|
132
|
+
// See http://stackoverflow.com/questions/1703552/encoding-of-window-location-hash
|
133
|
+
return location.href.split("#")[1] || ''
|
134
|
+
}
|
135
|
+
|
136
|
+
Durl.prototype.log = function(message){
|
137
|
+
if(this.options.logging && window.console){
|
138
|
+
loggerId = this.options.producer ? 'producer' : 'consumer'
|
139
|
+
console.log('[' + loggerId + '] ' + message)
|
140
|
+
}
|
141
|
+
}
|
142
|
+
|
143
|
+
function factory(){
|
144
|
+
return Durl
|
145
|
+
}
|
146
|
+
|
147
|
+
if (typeof define === 'function' && define.amd) {
|
148
|
+
define([],factory)
|
149
|
+
} else if (typeof module === 'object' && typeof module.exports === 'object') { //Node for browserfy
|
150
|
+
module.exports = factory()
|
151
|
+
} else {
|
152
|
+
window.Durl = window.Durl || factory()
|
153
|
+
}
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: durl-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tyler Kasten
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: railties
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '5.0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.0'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '5.0'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: thor
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0.14'
|
40
|
+
- - "<"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '2.0'
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0.14'
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '2.0'
|
53
|
+
description: This gem provides dURL for your Rails 3+ application.
|
54
|
+
email:
|
55
|
+
- tyler.kasten@gmail.com
|
56
|
+
executables: []
|
57
|
+
extensions: []
|
58
|
+
extra_rdoc_files: []
|
59
|
+
files:
|
60
|
+
- ".gitignore"
|
61
|
+
- CHANGELOG.md
|
62
|
+
- CONTRIBUTING.md
|
63
|
+
- Gemfile
|
64
|
+
- LICENSE
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- VERSIONS.md
|
68
|
+
- durl-rails.gemspec
|
69
|
+
- lib/durl-rails.rb
|
70
|
+
- lib/durl/rails.rb
|
71
|
+
- lib/durl/rails/engine.rb
|
72
|
+
- lib/durl/rails/version.rb
|
73
|
+
- lib/generators/durl/install/install_generator.rb
|
74
|
+
- vendor/assets/javascripts/durl.js
|
75
|
+
homepage: https://github.com/tkasten/durl-rails
|
76
|
+
licenses:
|
77
|
+
- MIT
|
78
|
+
metadata: {}
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 1.3.6
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project: durl-rails
|
95
|
+
rubygems_version: 2.4.6
|
96
|
+
signing_key:
|
97
|
+
specification_version: 4
|
98
|
+
summary: Use dURL with Rails 3+
|
99
|
+
test_files: []
|