durl-rails 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|