wiselinks 0.5.6 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +51 -0
- data/Gemfile +2 -19
- data/Gemfile.lock +30 -10
- data/README.md +22 -5
- data/Rakefile +4 -39
- data/lib/assets/javascripts/_form.js.coffee +50 -0
- data/lib/assets/javascripts/_link.js.coffee +20 -0
- data/lib/assets/javascripts/_page.js.coffee +88 -0
- data/lib/assets/javascripts/_request_manager.js.coffee +85 -0
- data/lib/assets/javascripts/{_history.adapter.jquery.js → lib/_history.adapter.jquery.js} +0 -0
- data/lib/assets/javascripts/{_history.html4.js → lib/_history.html4.js} +0 -0
- data/lib/assets/javascripts/{_history.js → lib/_history.js} +0 -0
- data/lib/assets/javascripts/{_json2.js → lib/_json2.js} +0 -0
- data/lib/assets/javascripts/wiselinks.js.coffee +17 -179
- data/lib/wiselinks/version.rb +12 -0
- data/spec/dummy/log/test.log +15 -0
- data/spec/factories/requests.rb +3 -3
- data/wiselinks.gemspec +33 -129
- metadata +260 -13
data/.gitignore
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# rcov generated
|
2
|
+
coverage
|
3
|
+
coverage.data
|
4
|
+
|
5
|
+
# rdoc generated
|
6
|
+
rdoc
|
7
|
+
|
8
|
+
# yard generated
|
9
|
+
doc
|
10
|
+
.yardoc
|
11
|
+
|
12
|
+
# bundler
|
13
|
+
.bundle
|
14
|
+
|
15
|
+
# jeweler generated
|
16
|
+
pkg
|
17
|
+
|
18
|
+
spec/dummy/log/test.log
|
19
|
+
|
20
|
+
# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
|
21
|
+
#
|
22
|
+
# * Create a file at ~/.gitignore
|
23
|
+
# * Include files you want ignored
|
24
|
+
# * Run: git config --global core.excludesfile ~/.gitignore
|
25
|
+
#
|
26
|
+
# After doing this, these files will be ignored in all your git projects,
|
27
|
+
# saving you from having to 'pollute' every project you touch with them
|
28
|
+
#
|
29
|
+
# Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
|
30
|
+
#
|
31
|
+
# For MacOS:
|
32
|
+
#
|
33
|
+
#.DS_Store
|
34
|
+
|
35
|
+
# For TextMate
|
36
|
+
#*.tmproj
|
37
|
+
#tmtags
|
38
|
+
|
39
|
+
# For emacs:
|
40
|
+
#*~
|
41
|
+
#\#*
|
42
|
+
#.\#*
|
43
|
+
|
44
|
+
# For vim:
|
45
|
+
#*.swp
|
46
|
+
|
47
|
+
# For redcar:
|
48
|
+
#.redcar
|
49
|
+
|
50
|
+
# For rubinius:
|
51
|
+
#*.rbc
|
data/Gemfile
CHANGED
@@ -1,20 +1,3 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
|
-
|
4
|
-
gem "shoulda"
|
5
|
-
gem "rdoc"
|
6
|
-
gem "bundler"
|
7
|
-
gem "jeweler"
|
8
|
-
end
|
9
|
-
|
10
|
-
group :test do
|
11
|
-
gem 'sqlite3'
|
12
|
-
gem 'rspec'
|
13
|
-
gem 'rspec-rails'
|
14
|
-
gem 'factory_girl'
|
15
|
-
gem 'faker'
|
16
|
-
gem 'capybara'
|
17
|
-
gem 'coffee-rails'
|
18
|
-
|
19
|
-
gem 'rails', '>= 3.2.0'
|
20
|
-
end
|
3
|
+
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,5 +1,10 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
wiselinks (0.6.0)
|
5
|
+
|
1
6
|
GEM
|
2
|
-
remote:
|
7
|
+
remote: https://rubygems.org/
|
3
8
|
specs:
|
4
9
|
actionmailer (3.2.12)
|
5
10
|
actionpack (= 3.2.12)
|
@@ -28,6 +33,7 @@ GEM
|
|
28
33
|
activesupport (3.2.12)
|
29
34
|
i18n (~> 0.6)
|
30
35
|
multi_json (~> 1.0)
|
36
|
+
addressable (2.3.4)
|
31
37
|
arel (3.0.2)
|
32
38
|
bourne (1.1.2)
|
33
39
|
mocha (= 0.10.5)
|
@@ -48,6 +54,14 @@ GEM
|
|
48
54
|
coffee-script-source
|
49
55
|
execjs
|
50
56
|
coffee-script-source (1.5.0)
|
57
|
+
colorize (0.5.8)
|
58
|
+
coveralls (0.6.7)
|
59
|
+
colorize
|
60
|
+
multi_json (~> 1.3)
|
61
|
+
rest-client
|
62
|
+
simplecov (>= 0.7)
|
63
|
+
thor
|
64
|
+
crack (0.3.2)
|
51
65
|
diff-lcs (1.2.1)
|
52
66
|
erubis (2.7.0)
|
53
67
|
execjs (1.4.0)
|
@@ -57,14 +71,8 @@ GEM
|
|
57
71
|
faker (1.1.2)
|
58
72
|
i18n (~> 0.5)
|
59
73
|
ffi (1.4.0)
|
60
|
-
git (1.2.5)
|
61
74
|
hike (1.2.1)
|
62
75
|
i18n (0.6.4)
|
63
|
-
jeweler (1.8.4)
|
64
|
-
bundler (~> 1.0)
|
65
|
-
git (>= 1.2.5)
|
66
|
-
rake
|
67
|
-
rdoc
|
68
76
|
journey (1.0.4)
|
69
77
|
json (1.7.7)
|
70
78
|
mail (2.4.4)
|
@@ -103,6 +111,8 @@ GEM
|
|
103
111
|
rake (10.0.3)
|
104
112
|
rdoc (3.12.2)
|
105
113
|
json (~> 1.4)
|
114
|
+
rest-client (1.6.7)
|
115
|
+
mime-types (>= 1.16)
|
106
116
|
rspec (2.13.0)
|
107
117
|
rspec-core (~> 2.13.0)
|
108
118
|
rspec-expectations (~> 2.13.0)
|
@@ -131,6 +141,10 @@ GEM
|
|
131
141
|
shoulda-matchers (1.4.2)
|
132
142
|
activesupport (>= 3.0.0)
|
133
143
|
bourne (~> 1.1.2)
|
144
|
+
simplecov (0.7.1)
|
145
|
+
multi_json (~> 1.0)
|
146
|
+
simplecov-html (~> 0.7.1)
|
147
|
+
simplecov-html (0.7.1)
|
134
148
|
sprockets (2.2.2)
|
135
149
|
hike (~> 1.2)
|
136
150
|
multi_json (~> 1.0)
|
@@ -142,7 +156,10 @@ GEM
|
|
142
156
|
treetop (1.4.12)
|
143
157
|
polyglot
|
144
158
|
polyglot (>= 0.3.1)
|
145
|
-
tzinfo (0.3.
|
159
|
+
tzinfo (0.3.37)
|
160
|
+
webmock (1.9.3)
|
161
|
+
addressable (>= 2.2.7)
|
162
|
+
crack (>= 0.3.2)
|
146
163
|
websocket (1.0.7)
|
147
164
|
xpath (1.0.0)
|
148
165
|
nokogiri (~> 1.3)
|
@@ -154,12 +171,15 @@ DEPENDENCIES
|
|
154
171
|
bundler
|
155
172
|
capybara
|
156
173
|
coffee-rails
|
174
|
+
coveralls
|
157
175
|
factory_girl
|
158
176
|
faker
|
159
|
-
jeweler
|
160
177
|
rails (>= 3.2.0)
|
161
|
-
|
178
|
+
rake
|
162
179
|
rspec
|
163
180
|
rspec-rails
|
164
181
|
shoulda
|
182
|
+
simplecov
|
165
183
|
sqlite3
|
184
|
+
webmock (~> 1.9.0)
|
185
|
+
wiselinks!
|
data/README.md
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
[![
|
2
|
-
[![
|
1
|
+
[![Build Status](https://travis-ci.org/igor-alexandrov/wiselinks.png)](https://travis-ci.org/igor-alexandrov/wiselinks)
|
2
|
+
[![Code Climate](https://codeclimate.com/github/igor-alexandrov/wiselinks.png)](https://codeclimate.com/github/igor-alexandrov/wiselinks)
|
3
|
+
[![Coverage Status](https://coveralls.io/repos/igor-alexandrov/wiselinks/badge.png)](https://coveralls.io/r/igor-alexandrov/wiselinks)
|
3
4
|
[![Dependency Status](https://gemnasium.com/igor-alexandrov/wiselinks.png)](https://gemnasium.com/igor-alexandrov/wiselinks)
|
4
|
-
|
5
|
-
|
6
|
-
[![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/igor-alexandrov/wiselinks)
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/wiselinks.png)](http://badge.fury.io/rb/wiselinks)
|
7
6
|
|
8
7
|
|
9
8
|
#Wiselinks
|
@@ -358,6 +357,24 @@ Of course you can use `wiselinks_title` helper in your own helpers too.
|
|
358
357
|
|
359
358
|
Wiselinks follows 30x HTTP redirects. Location is updated in browser with `X-Wiselinks-Url` header that is setting up automatically (in Rails) on every wiselinks request.
|
360
359
|
|
360
|
+
### Target missing handling
|
361
|
+
|
362
|
+
By default, if Wiselinks cannot find target that you specified during initialization, it will fail silently. But you can override this behaviour:
|
363
|
+
|
364
|
+
```coffeescript
|
365
|
+
#= require jquery
|
366
|
+
#= require wiselinks
|
367
|
+
|
368
|
+
$(document).ready ->
|
369
|
+
window.wiselinks = new Wiselinks(
|
370
|
+
$('something that does not exist'),
|
371
|
+
target_missing: 'exception'
|
372
|
+
)
|
373
|
+
```
|
374
|
+
|
375
|
+
`[Wiselinks] Target missing` exception will be thrown. This also works for `data-target` attributes.
|
376
|
+
|
377
|
+
|
361
378
|
### Google Analytics and Yandex Metrika
|
362
379
|
|
363
380
|
If you want to handle these analytics tools, then you should add handler to `page:done` event.
|
data/Rakefile
CHANGED
@@ -1,43 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
begin
|
6
|
-
Bundler.setup(:default, :development)
|
7
|
-
rescue Bundler::BundlerError => e
|
8
|
-
$stderr.puts e.message
|
9
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
10
|
-
exit e.status_code
|
11
|
-
end
|
12
|
-
require 'rake'
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rspec/core/rake_task'
|
13
5
|
|
14
|
-
|
15
|
-
Jeweler::Tasks.new do |gem|
|
16
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
-
gem.name = "wiselinks"
|
18
|
-
gem.homepage = "http://github.com/igor-alexandrov/wiselinks"
|
19
|
-
gem.license = "MIT"
|
20
|
-
gem.summary = %Q{Wiselinks makes following links and submitting some forms in your web application smarter and faster}
|
21
|
-
gem.email = "igor.alexandrov@gmail.com"
|
22
|
-
gem.authors = ['Igor Alexandrov', 'Alexey Solilin', 'Julia Egorova']
|
23
|
-
end
|
24
|
-
Jeweler::RubygemsDotOrgTasks.new
|
6
|
+
RSpec::Core::RakeTask.new('spec')
|
25
7
|
|
26
|
-
|
27
|
-
Rake::TestTask.new(:test) do |test|
|
28
|
-
test.libs << 'lib' << 'test'
|
29
|
-
test.pattern = 'test/**/*_test.rb'
|
30
|
-
test.verbose = true
|
31
|
-
end
|
32
|
-
|
33
|
-
task :default => :test
|
34
|
-
|
35
|
-
require 'rdoc/task'
|
36
|
-
Rake::RDocTask.new do |rdoc|
|
37
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
38
|
-
|
39
|
-
rdoc.rdoc_dir = 'rdoc'
|
40
|
-
rdoc.title = "wiselinks #{version}"
|
41
|
-
rdoc.rdoc_files.include('README*')
|
42
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
43
|
-
end
|
8
|
+
task :default => :spec
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class Form
|
2
|
+
constructor: (@page, @$form) ->
|
3
|
+
|
4
|
+
process: ->
|
5
|
+
$disable = @$form.find('select:not(:disabled),input:not(:disabled)').filter(-> !$(this).val())
|
6
|
+
|
7
|
+
$disable.attr('disabled', true)
|
8
|
+
url = this._url()
|
9
|
+
$disable.attr('disabled', false)
|
10
|
+
|
11
|
+
@page.load(url, @$form.attr("data-target"), this._type())
|
12
|
+
|
13
|
+
_params: ->
|
14
|
+
hash = {}
|
15
|
+
|
16
|
+
for item in @$form.serializeArray()
|
17
|
+
if item.name != 'utf8'
|
18
|
+
# if name ends with [], then we try to optimize it
|
19
|
+
name = if item.name.indexOf('[]', item.name.length - '[]'.length) != -1
|
20
|
+
item.name.substr(0, item.name.length - 2)
|
21
|
+
else
|
22
|
+
item.name
|
23
|
+
|
24
|
+
if hash[name]?
|
25
|
+
hash[name] = hash[name] + ",#{item.value}"
|
26
|
+
else
|
27
|
+
hash[name] = item.value
|
28
|
+
|
29
|
+
hash
|
30
|
+
|
31
|
+
_type: ->
|
32
|
+
if (@$form.attr("data-push") == 'partial') then 'partial' else 'template'
|
33
|
+
|
34
|
+
_url: ->
|
35
|
+
serialized = []
|
36
|
+
|
37
|
+
# To find out why encodeURIComponent should be used, follow the link:
|
38
|
+
# http://stackoverflow.com/questions/75980/best-practice-escape-or-encodeuri-encodeuricomponent
|
39
|
+
#
|
40
|
+
for key, value of this._params()
|
41
|
+
serialized.push("#{key}=#{encodeURIComponent(value)}")
|
42
|
+
|
43
|
+
serialized = serialized.join('&')
|
44
|
+
|
45
|
+
url = @$form.attr("action")
|
46
|
+
url += "?#{serialized}" if serialized.length > 0
|
47
|
+
url
|
48
|
+
|
49
|
+
window._Wiselinks = {} if window._Wiselinks == undefined
|
50
|
+
window._Wiselinks.Form = Form
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Link
|
2
|
+
constructor: (@page, @$link) ->
|
3
|
+
|
4
|
+
allows_process: (event) ->
|
5
|
+
!(this._cross_origin_link(event.currentTarget) || this._non_standard_click(event))
|
6
|
+
|
7
|
+
process: ->
|
8
|
+
type = if (@$link.attr("data-push") == 'partial') then 'partial' else 'template'
|
9
|
+
@page.load(@$link.attr("href"), @$link.attr("data-target"), type)
|
10
|
+
|
11
|
+
# We split host because IE returns host with port and other browsers not
|
12
|
+
#
|
13
|
+
_cross_origin_link: (link) ->
|
14
|
+
(location.protocol != link.protocol) || (location.host.split(':')[0] != link.host.split(':')[0])
|
15
|
+
|
16
|
+
_non_standard_click: (event) ->
|
17
|
+
event.metaKey || event.ctrlKey || event.shiftKey || event.altKey
|
18
|
+
|
19
|
+
window._Wiselinks = {} if window._Wiselinks == undefined
|
20
|
+
window._Wiselinks.Link = Link
|
@@ -0,0 +1,88 @@
|
|
1
|
+
#= require _request_manager
|
2
|
+
|
3
|
+
class Page
|
4
|
+
constructor: (@$target, @options) ->
|
5
|
+
self = this
|
6
|
+
|
7
|
+
@template_id = new Date().getTime()
|
8
|
+
@request_manager = new _Wiselinks.RequestManager(@options)
|
9
|
+
|
10
|
+
self._try_target(@$target)
|
11
|
+
|
12
|
+
if History.emulated.pushState && @options.html4 == true
|
13
|
+
if window.location.href.indexOf('#!') == -1 && @options.html4_root_path != null && window.location.pathname != @options.html4_root_path
|
14
|
+
window.location.href = "#{window.location.protocol}//#{window.location.host}#{@options.html4_root_path}#!#{window.location.pathname}"
|
15
|
+
|
16
|
+
if window.location.hash.indexOf('#!') != -1
|
17
|
+
self._call(self._make_state(window.location.hash.substring(2)))
|
18
|
+
|
19
|
+
History.Adapter.bind(
|
20
|
+
window,
|
21
|
+
"statechange"
|
22
|
+
(event, data) ->
|
23
|
+
state = History.getState()
|
24
|
+
|
25
|
+
if self._template_id_changed(state)
|
26
|
+
self._call(self._reset_state(state))
|
27
|
+
else
|
28
|
+
self._call(state)
|
29
|
+
)
|
30
|
+
|
31
|
+
$(document).on(
|
32
|
+
'click', 'a[data-push], a[data-replace]'
|
33
|
+
(event) ->
|
34
|
+
if (link = new _Wiselinks.Link(self, $(this))).allows_process(event)
|
35
|
+
event.preventDefault()
|
36
|
+
link.process()
|
37
|
+
|
38
|
+
return false
|
39
|
+
)
|
40
|
+
|
41
|
+
$(document).on(
|
42
|
+
'submit', 'form[data-push], form[data-replace]'
|
43
|
+
(event) ->
|
44
|
+
if (form = new _Wiselinks.Form(self, $(this)))
|
45
|
+
event.preventDefault()
|
46
|
+
form.process()
|
47
|
+
|
48
|
+
return false
|
49
|
+
)
|
50
|
+
|
51
|
+
load: (url, target, render = 'template') ->
|
52
|
+
@template_id = new Date().getTime() if render != 'partial'
|
53
|
+
|
54
|
+
if target?
|
55
|
+
this._try_target($(target))
|
56
|
+
|
57
|
+
History.pushState({ timestamp: (new Date().getTime()), template_id: @template_id, render: render, target: target, referer: window.location.href }, document.title, url )
|
58
|
+
|
59
|
+
reload: () ->
|
60
|
+
History.replaceState({ timestamp: (new Date().getTime()), template_id: @template_id, render: 'template', referer: window.location.href }, document.title, History.getState().url )
|
61
|
+
|
62
|
+
_call: (state) ->
|
63
|
+
$target = if state.data.target? then $(state.data.target) else @$target
|
64
|
+
this.request_manager.call($target, state)
|
65
|
+
|
66
|
+
_template_id_changed: (state) ->
|
67
|
+
!state.data.template_id? || state.data.template_id != @template_id
|
68
|
+
|
69
|
+
_make_state: (url, target, render = 'template', referer) ->
|
70
|
+
{
|
71
|
+
url: url
|
72
|
+
data:
|
73
|
+
target: target
|
74
|
+
render: render
|
75
|
+
referer: referer
|
76
|
+
}
|
77
|
+
|
78
|
+
_reset_state: (state) ->
|
79
|
+
state.data = {} unless state.data?
|
80
|
+
state.data.target = null
|
81
|
+
state.data.render = 'template'
|
82
|
+
state
|
83
|
+
|
84
|
+
_try_target: ($target) ->
|
85
|
+
throw "[Wiselinks] Target missing: `#{$target.selector}`" if $target.length == 0 && @options.target_missing == 'exception'
|
86
|
+
|
87
|
+
window._Wiselinks = {} if window._Wiselinks == undefined
|
88
|
+
window._Wiselinks.Page = Page
|
@@ -0,0 +1,85 @@
|
|
1
|
+
class RequestManager
|
2
|
+
constructor: (@options = {}) ->
|
3
|
+
|
4
|
+
call: ($target, state) ->
|
5
|
+
self = this
|
6
|
+
|
7
|
+
# If been redirected, just trigger event and exit
|
8
|
+
#
|
9
|
+
if @redirected
|
10
|
+
self._handle_redirect($target, state)
|
11
|
+
return
|
12
|
+
|
13
|
+
# Trigger loading event
|
14
|
+
#
|
15
|
+
self._loading($target, state)
|
16
|
+
|
17
|
+
# Perform XHtmlHttpRequest
|
18
|
+
#
|
19
|
+
$.ajax(
|
20
|
+
url: state.url
|
21
|
+
headers:
|
22
|
+
'X-Wiselinks': state.data.render
|
23
|
+
'X-Wiselinks-Referer': state.data.referer
|
24
|
+
|
25
|
+
dataType: "html"
|
26
|
+
).done(
|
27
|
+
(data, status, xhr) ->
|
28
|
+
url = xhr.getResponseHeader('X-Wiselinks-Url')
|
29
|
+
|
30
|
+
if self._assets_changed(xhr.getResponseHeader('X-Wiselinks-Assets-Digest'))
|
31
|
+
window.location.reload(true)
|
32
|
+
else
|
33
|
+
if url? && url != window.location.href
|
34
|
+
self._redirect_to(url, xhr)
|
35
|
+
|
36
|
+
$target.html(data)
|
37
|
+
|
38
|
+
self._title(xhr.getResponseHeader('X-Wiselinks-Title'))
|
39
|
+
self._done($target, status, state.url, data)
|
40
|
+
).fail(
|
41
|
+
(xhr, status, error) ->
|
42
|
+
self._fail($target, status, state.url, error)
|
43
|
+
).always(
|
44
|
+
(data_or_xhr, status, xhr_or_error)->
|
45
|
+
self._always($target, status, state.url)
|
46
|
+
)
|
47
|
+
|
48
|
+
_assets_changed: (digest) ->
|
49
|
+
@options.assets_digest? && @options.assets_digest != digest
|
50
|
+
|
51
|
+
_handle_redirect: ($target, state) ->
|
52
|
+
$(document).trigger('page:redirected', [$target, state.data.render, state.url])
|
53
|
+
@redirected = null
|
54
|
+
|
55
|
+
_redirect_to: (url, xhr) ->
|
56
|
+
if ( xhr && xhr.readyState < 4)
|
57
|
+
xhr.onreadystatechange = $.noop
|
58
|
+
xhr.abort()
|
59
|
+
|
60
|
+
@redirected = true
|
61
|
+
|
62
|
+
this._title('Redirecting…')
|
63
|
+
History.replaceState(History.getState().data, document.title, url )
|
64
|
+
|
65
|
+
|
66
|
+
_loading: ($target, state) ->
|
67
|
+
$(document).trigger('page:loading', [$target, state.data.render, state.url])
|
68
|
+
|
69
|
+
_done: ($target, status, state, data) ->
|
70
|
+
$(document).trigger('page:done', [$target, status, state.url, data])
|
71
|
+
|
72
|
+
_fail: ($target, status, state, error) ->
|
73
|
+
$(document).trigger('page:fail', [$target, status, state.url, error])
|
74
|
+
|
75
|
+
_always: ($target, status, state) ->
|
76
|
+
$(document).trigger('page:always', [$target, status, state.url])
|
77
|
+
|
78
|
+
_title: (value) ->
|
79
|
+
if value?
|
80
|
+
$(document).trigger('page:title', decodeURI(value))
|
81
|
+
document.title = decodeURI(value) if value?
|
82
|
+
|
83
|
+
|
84
|
+
window._Wiselinks = {} if window._Wiselinks == undefined
|
85
|
+
window._Wiselinks.RequestManager = RequestManager
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,195 +1,33 @@
|
|
1
|
-
#=
|
2
|
-
#= require _history
|
3
|
-
#= require _history.html4
|
4
|
-
#= require _history.adapter.jquery.js
|
1
|
+
#= require_tree ./lib
|
5
2
|
|
6
|
-
|
7
|
-
|
3
|
+
#= require _page
|
4
|
+
#= require _link
|
5
|
+
#= require _form
|
8
6
|
|
9
7
|
class Wiselinks
|
10
|
-
constructor: (
|
11
|
-
|
12
|
-
throw "Load jQuery to use Wiselinks" unless window.jQuery?
|
8
|
+
constructor: ($target = $('body'), options = {}) ->
|
9
|
+
this._try_jquery()
|
13
10
|
|
14
|
-
|
11
|
+
if this.enabled()
|
12
|
+
options = $.extend(this._defaults(), options)
|
13
|
+
@page = new _Wiselinks.Page($target, options)
|
15
14
|
|
16
|
-
@options = jQuery.extend(self._defaults(), @options);
|
17
|
-
@template_id = new Date().getTime()
|
18
|
-
|
19
|
-
if self.enabled()
|
20
|
-
@assets_digest = $("meta[name='assets-digest']").attr("content")
|
21
|
-
|
22
|
-
if History.emulated.pushState && @options.html4 == true
|
23
|
-
if window.location.href.indexOf('#!') == -1 && @options.html4_root_path != null && window.location.pathname != @options.html4_root_path
|
24
|
-
window.location.href = "#{window.location.protocol}//#{window.location.host}#{@options.html4_root_path}#!#{window.location.pathname}"
|
25
|
-
|
26
|
-
if window.location.hash.indexOf('#!') != -1
|
27
|
-
self._call(self._make_state(window.location.hash.substring(2)))
|
28
|
-
|
29
|
-
History.Adapter.bind(
|
30
|
-
window,
|
31
|
-
"statechange"
|
32
|
-
(event, data) ->
|
33
|
-
state = History.getState()
|
34
|
-
|
35
|
-
if self._template_id_changed(state)
|
36
|
-
self._call(self._reset_state(state))
|
37
|
-
else
|
38
|
-
self._call(state)
|
39
|
-
)
|
40
|
-
|
41
|
-
$(document).on(
|
42
|
-
"submit", "form[data-push], form[data-replace]"
|
43
|
-
(event) ->
|
44
|
-
self._process_form($(this))
|
45
|
-
|
46
|
-
event.preventDefault()
|
47
|
-
return false
|
48
|
-
)
|
49
|
-
|
50
|
-
$(document).on(
|
51
|
-
"click", "a[data-push], a[data-replace]"
|
52
|
-
(event) ->
|
53
|
-
if self._cross_origin_link(event.currentTarget) || self._non_standard_click(event)
|
54
|
-
return true;
|
55
|
-
self._process_link($(this))
|
56
|
-
|
57
|
-
event.preventDefault()
|
58
|
-
return false
|
59
|
-
)
|
60
|
-
|
61
15
|
enabled: ->
|
62
16
|
!History.emulated.pushState || @options.html4 == true
|
63
17
|
|
64
|
-
load: (url, target, render = 'template') ->
|
65
|
-
@
|
66
|
-
History.pushState({ timestamp: (new Date().getTime()), template_id: @template_id, render: render, target: target, referer: window.location.href }, document.title, url )
|
18
|
+
load: (url, target, render = 'template') ->
|
19
|
+
@page.load(url, target, render)
|
67
20
|
|
68
21
|
reload: () ->
|
69
|
-
|
70
|
-
|
22
|
+
@page.reload()
|
23
|
+
|
71
24
|
_defaults: ->
|
72
25
|
html4: true
|
73
26
|
html4_root_path: '/'
|
27
|
+
target_missing: null
|
28
|
+
assets_digest: $("meta[name='assets-digest']").attr("content")
|
74
29
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
$target = if state.data.target? then $(state.data.target) else self.$target
|
79
|
-
$document = $(document)
|
80
|
-
|
81
|
-
if @redirected
|
82
|
-
$document.trigger('page:redirected', [$target, state.data.render, state.url])
|
83
|
-
@redirected = null
|
84
|
-
return
|
85
|
-
|
86
|
-
$document.trigger('page:loading', [$target, state.data.render, state.url])
|
87
|
-
|
88
|
-
$.ajax(
|
89
|
-
url: state.url
|
90
|
-
headers:
|
91
|
-
'X-Wiselinks': state.data.render
|
92
|
-
'X-Wiselinks-Referer': state.data.referer
|
93
|
-
|
94
|
-
dataType: "html"
|
95
|
-
).done(
|
96
|
-
(data, status, xhr) ->
|
97
|
-
url = xhr.getResponseHeader('X-Wiselinks-Url')
|
98
|
-
|
99
|
-
if self._assets_changed(xhr.getResponseHeader('X-Wiselinks-Assets-Digest'))
|
100
|
-
window.location.reload(true)
|
101
|
-
else
|
102
|
-
self._set_title(xhr)
|
103
|
-
|
104
|
-
if url? && url != window.location.href
|
105
|
-
if ( xhr && xhr.readyState < 4)
|
106
|
-
xhr.onreadystatechange = $.noop
|
107
|
-
xhr.abort()
|
108
|
-
self.redirected = true
|
109
|
-
History.replaceState(History.getState().data, document.title, url )
|
110
|
-
|
111
|
-
$target.html(data)
|
112
|
-
$document.trigger('page:done', [$target, status, state.ur, data])
|
113
|
-
).fail(
|
114
|
-
(xhr, status, error) ->
|
115
|
-
$document.trigger('page:fail', [$target, status, state.ur, error])
|
116
|
-
).always(
|
117
|
-
(data_or_xhr, status, xhr_or_error)->
|
118
|
-
$document.trigger('page:always', [$target, status, state.ur])
|
119
|
-
)
|
120
|
-
|
121
|
-
_process_form: ($form) ->
|
122
|
-
self = this
|
123
|
-
|
124
|
-
$disable = $form.find(':input[value=""]:not(:disabled)')
|
125
|
-
$disable.attr('disabled', true);
|
126
|
-
|
127
|
-
params = {}
|
128
|
-
|
129
|
-
for item in $form.serializeArray()
|
130
|
-
if item.name != 'utf8'
|
131
|
-
name = if item.name.ends_with('[]')
|
132
|
-
item.name.substr(0, item.name.length - 2)
|
133
|
-
else
|
134
|
-
item.name
|
30
|
+
_try_jquery: ->
|
31
|
+
throw "[Wiselinks] jQuery is not loaded" unless window.jQuery?
|
135
32
|
|
136
|
-
if params[name]?
|
137
|
-
params[name] = params[name] + ",#{item.value}"
|
138
|
-
else
|
139
|
-
params[name] = item.value
|
140
|
-
|
141
|
-
serialized = []
|
142
|
-
for key of params
|
143
|
-
serialized.push("#{key}=#{params[key]}")
|
144
|
-
|
145
|
-
serialized = serialized.join('&').replace(/%|!/g, '')
|
146
|
-
|
147
|
-
url = $form.attr("action")
|
148
|
-
url += "?#{serialized}" if serialized.length > 0
|
149
|
-
|
150
|
-
$disable.attr('disabled', false);
|
151
|
-
|
152
|
-
type = if ($form.attr("data-push") == 'partial') then 'partial' else 'template'
|
153
|
-
|
154
|
-
self.load(url, $form.attr("data-target"), type)
|
155
|
-
|
156
|
-
_process_link: ($link) ->
|
157
|
-
self = this
|
158
|
-
|
159
|
-
type = if ($link.attr("data-push") == 'partial') then 'partial' else 'template'
|
160
|
-
|
161
|
-
self.load($link.attr("href"), $link.attr("data-target"), type)
|
162
|
-
|
163
|
-
_cross_origin_link: (link) ->
|
164
|
-
# we split host because IE returns host with port and other browsers not
|
165
|
-
(location.protocol != link.protocol) || (location.host.split(':')[0] != link.host.split(':')[0])
|
166
|
-
|
167
|
-
_non_standard_click: (event) ->
|
168
|
-
event.metaKey || event.ctrlKey || event.shiftKey || event.altKey
|
169
|
-
|
170
|
-
_assets_changed: (digest) ->
|
171
|
-
@assets_digest? && @assets_digest != digest
|
172
|
-
|
173
|
-
_template_id_changed: (state) ->
|
174
|
-
!state.data.template_id? || state.data.template_id != @template_id
|
175
|
-
|
176
|
-
_set_title: (xhr) ->
|
177
|
-
value = xhr.getResponseHeader('X-Wiselinks-Title')
|
178
|
-
document.title = decodeURI(value) if value?
|
179
|
-
|
180
|
-
_make_state: (url, target, render = 'template', referer) ->
|
181
|
-
{
|
182
|
-
url: url
|
183
|
-
data:
|
184
|
-
target: target
|
185
|
-
render: render
|
186
|
-
referer: referer
|
187
|
-
}
|
188
|
-
|
189
|
-
_reset_state: (state) ->
|
190
|
-
state.data = {} unless state.data?
|
191
|
-
state.data.target = null
|
192
|
-
state.data.render = 'template'
|
193
|
-
state
|
194
|
-
|
195
33
|
window.Wiselinks = Wiselinks
|
data/spec/dummy/log/test.log
CHANGED
@@ -52399,3 +52399,18 @@ Connecting to database specified by database.yml
|
|
52399
52399
|
Processing by ApplicationController#index as HTML
|
52400
52400
|
Rendered application/index.html.erb within layouts/application (3.9ms)
|
52401
52401
|
Completed 200 OK in 24ms (Views: 23.1ms | ActiveRecord: 0.0ms)
|
52402
|
+
Started GET "/" for 127.0.0.1 at 2013-05-27 13:05:21 +0400
|
52403
|
+
Connecting to database specified by database.yml
|
52404
|
+
Processing by ApplicationController#index as HTML
|
52405
|
+
Rendered application/index.html.erb within layouts/application (5.1ms)
|
52406
|
+
Completed 200 OK in 64ms (Views: 28.3ms | ActiveRecord: 0.0ms)
|
52407
|
+
Started GET "/" for 127.0.0.1 at 2013-05-27 13:11:42 +0400
|
52408
|
+
Connecting to database specified by database.yml
|
52409
|
+
Processing by ApplicationController#index as HTML
|
52410
|
+
Rendered application/index.html.erb within layouts/application (4.6ms)
|
52411
|
+
Completed 200 OK in 25ms (Views: 24.6ms | ActiveRecord: 0.0ms)
|
52412
|
+
Started GET "/" for 127.0.0.1 at 2013-06-01 11:22:33 +0400
|
52413
|
+
Connecting to database specified by database.yml
|
52414
|
+
Processing by ApplicationController#index as HTML
|
52415
|
+
Rendered application/index.html.erb within layouts/application (4.4ms)
|
52416
|
+
Completed 200 OK in 26ms (Views: 25.7ms | ActiveRecord: 0.0ms)
|
data/spec/factories/requests.rb
CHANGED
@@ -4,19 +4,19 @@ FactoryGirl.define do
|
|
4
4
|
factory :request, :class => ActionDispatch::Request do |r|
|
5
5
|
trait :wiselinks do
|
6
6
|
after(:build) do |obj|
|
7
|
-
obj.env['X-
|
7
|
+
obj.env['X-Wiselinks'] = Faker::Lorem.characters(10)
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
11
|
trait :wiselinks_template do
|
12
12
|
after(:build) do |obj|
|
13
|
-
obj.env['X-
|
13
|
+
obj.env['X-Wiselinks'] = 'template'
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
trait :wiselinks_partial do
|
18
18
|
after(:build) do |obj|
|
19
|
-
obj.env['X-
|
19
|
+
obj.env['X-Wiselinks'] = 'partial'
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
data/wiselinks.gemspec
CHANGED
@@ -1,134 +1,38 @@
|
|
1
|
-
#
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
-
# -*- encoding: utf-8 -*-
|
1
|
+
# encoding: utf-8
|
5
2
|
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'wiselinks/version'
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
]
|
18
|
-
s.files = [
|
19
|
-
".document",
|
20
|
-
".rspec",
|
21
|
-
"Gemfile",
|
22
|
-
"Gemfile.lock",
|
23
|
-
"LICENSE",
|
24
|
-
"README.md",
|
25
|
-
"Rakefile",
|
26
|
-
"VERSION",
|
27
|
-
"app/views/layouts/wiselinks.html.erb",
|
28
|
-
"lib/assets/javascripts/_history.adapter.jquery.js",
|
29
|
-
"lib/assets/javascripts/_history.html4.js",
|
30
|
-
"lib/assets/javascripts/_history.js",
|
31
|
-
"lib/assets/javascripts/_json2.js",
|
32
|
-
"lib/assets/javascripts/wiselinks.js.coffee",
|
33
|
-
"lib/wiselinks.rb",
|
34
|
-
"lib/wiselinks/controller_methods.rb",
|
35
|
-
"lib/wiselinks/helpers.rb",
|
36
|
-
"lib/wiselinks/logger.rb",
|
37
|
-
"lib/wiselinks/rails.rb",
|
38
|
-
"lib/wiselinks/rendering.rb",
|
39
|
-
"lib/wiselinks/request.rb",
|
40
|
-
"spec/cases/helpers_spec.rb",
|
41
|
-
"spec/cases/request_spec.rb",
|
42
|
-
"spec/dummy/README.rdoc",
|
43
|
-
"spec/dummy/Rakefile",
|
44
|
-
"spec/dummy/app/assets/javascripts/application.js.coffee",
|
45
|
-
"spec/dummy/app/assets/stylesheets/application.css",
|
46
|
-
"spec/dummy/app/controllers/application_controller.rb",
|
47
|
-
"spec/dummy/app/helpers/application_helper.rb",
|
48
|
-
"spec/dummy/app/mailers/.gitkeep",
|
49
|
-
"spec/dummy/app/models/.gitkeep",
|
50
|
-
"spec/dummy/app/views/application/index.html.erb",
|
51
|
-
"spec/dummy/app/views/layouts/application.html.erb",
|
52
|
-
"spec/dummy/config.ru",
|
53
|
-
"spec/dummy/config/application.rb",
|
54
|
-
"spec/dummy/config/boot.rb",
|
55
|
-
"spec/dummy/config/database.yml",
|
56
|
-
"spec/dummy/config/environment.rb",
|
57
|
-
"spec/dummy/config/environments/development.rb",
|
58
|
-
"spec/dummy/config/environments/production.rb",
|
59
|
-
"spec/dummy/config/environments/test.rb",
|
60
|
-
"spec/dummy/config/initializers/backtrace_silencers.rb",
|
61
|
-
"spec/dummy/config/initializers/inflections.rb",
|
62
|
-
"spec/dummy/config/initializers/mime_types.rb",
|
63
|
-
"spec/dummy/config/initializers/secret_token.rb",
|
64
|
-
"spec/dummy/config/initializers/session_store.rb",
|
65
|
-
"spec/dummy/config/initializers/wrap_parameters.rb",
|
66
|
-
"spec/dummy/config/locales/en.yml",
|
67
|
-
"spec/dummy/config/routes.rb",
|
68
|
-
"spec/dummy/lib/assets/.gitkeep",
|
69
|
-
"spec/dummy/log/.gitkeep",
|
70
|
-
"spec/dummy/log/development.log",
|
71
|
-
"spec/dummy/log/test.log",
|
72
|
-
"spec/dummy/public/404.html",
|
73
|
-
"spec/dummy/public/422.html",
|
74
|
-
"spec/dummy/public/500.html",
|
75
|
-
"spec/dummy/public/assets/application-a98e47eb93026a340a766faf55214702.js",
|
76
|
-
"spec/dummy/public/assets/application-a98e47eb93026a340a766faf55214702.js.gz",
|
77
|
-
"spec/dummy/public/assets/application-ecf5beebe0b79251c8be40f0443074f2.css",
|
78
|
-
"spec/dummy/public/assets/application-ecf5beebe0b79251c8be40f0443074f2.css.gz",
|
79
|
-
"spec/dummy/public/assets/application.css",
|
80
|
-
"spec/dummy/public/assets/application.css.gz",
|
81
|
-
"spec/dummy/public/assets/application.js",
|
82
|
-
"spec/dummy/public/assets/application.js.gz",
|
83
|
-
"spec/dummy/public/assets/manifest.yml",
|
84
|
-
"spec/dummy/public/favicon.ico",
|
85
|
-
"spec/dummy/public/javascripts/wisepdf.js",
|
86
|
-
"spec/dummy/public/stylesheets/wisepdf.css",
|
87
|
-
"spec/dummy/script/rails",
|
88
|
-
"spec/dummy/tmp/cache/assets/C26/0A0/sprockets%2F52456508a38f02f4559064b24980c87a",
|
89
|
-
"spec/dummy/tmp/cache/assets/C5E/890/sprockets%2Ffb6525457b6873e6905e2d522548091f",
|
90
|
-
"spec/dummy/tmp/cache/assets/C80/150/sprockets%2F0d3881005b0646df783d5c24683d34f5",
|
91
|
-
"spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953",
|
92
|
-
"spec/dummy/tmp/cache/assets/CF3/250/sprockets%2F7edb1809ce839a3d290508f935c89f42",
|
93
|
-
"spec/dummy/tmp/cache/assets/D09/C40/sprockets%2Fcf317b95ed0500b7277e950a9c0c82e0",
|
94
|
-
"spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705",
|
95
|
-
"spec/dummy/tmp/cache/assets/D45/760/sprockets%2Fbc659a6e09b5025e8be539b0b68f71f2",
|
96
|
-
"spec/dummy/tmp/cache/assets/D4E/D00/sprockets%2F1a6846f0a837ae2524e2f9ec89e6ef43",
|
97
|
-
"spec/dummy/tmp/cache/assets/D55/090/sprockets%2F4a21bc343a4696b7603ea4cc25c3c3ba",
|
98
|
-
"spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6",
|
99
|
-
"spec/dummy/tmp/cache/assets/DC2/EB0/sprockets%2F75b4716f479a2acfac51b258fba0c2bd",
|
100
|
-
"spec/dummy/tmp/cache/assets/DF1/B80/sprockets%2Fcd0ee4f742908cb7223a1e7be4a4ccbc",
|
101
|
-
"spec/dummy/tmp/cache/assets/E11/4E0/sprockets%2F86e145a39f85cceeaffdff91ebb61449",
|
102
|
-
"spec/factories/requests.rb",
|
103
|
-
"spec/helper.rb",
|
104
|
-
"travis.yml",
|
105
|
-
"wiselinks.gemspec"
|
106
|
-
]
|
107
|
-
s.homepage = "http://github.com/igor-alexandrov/wiselinks"
|
108
|
-
s.licenses = ["MIT"]
|
109
|
-
s.require_paths = ["lib"]
|
110
|
-
s.rubygems_version = "1.8.24"
|
111
|
-
s.summary = "Wiselinks makes following links and submitting some forms in your web application smarter and faster"
|
7
|
+
Gem::Specification.new do |gem|
|
8
|
+
gem.name = 'wiselinks'
|
9
|
+
gem.version = Wiselinks::Version::STRING
|
10
|
+
gem.authors = ['Igor Alexandrov', 'Alexey Solilin', 'Julia Egorova']
|
11
|
+
gem.email = 'igor.alexandrov@gmail.com'
|
12
|
+
gem.summary = 'Wiselinks makes following links and submitting some forms in your web application smarter and faster'
|
13
|
+
gem.homepage = 'http://github.com/igor-alexandrov/wiselinks'
|
14
|
+
gem.licenses = ['MIT']
|
112
15
|
|
113
|
-
|
114
|
-
|
16
|
+
gem.files = `git ls-files`.split($/)
|
17
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
|
+
gem.require_paths = ["lib"]
|
115
20
|
|
116
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
117
|
-
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
118
|
-
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
119
|
-
s.add_development_dependency(%q<bundler>, [">= 0"])
|
120
|
-
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
121
|
-
else
|
122
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
123
|
-
s.add_dependency(%q<rdoc>, [">= 0"])
|
124
|
-
s.add_dependency(%q<bundler>, [">= 0"])
|
125
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
126
|
-
end
|
127
|
-
else
|
128
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
129
|
-
s.add_dependency(%q<rdoc>, [">= 0"])
|
130
|
-
s.add_dependency(%q<bundler>, [">= 0"])
|
131
|
-
s.add_dependency(%q<jeweler>, [">= 0"])
|
132
|
-
end
|
133
|
-
end
|
134
21
|
|
22
|
+
gem.add_development_dependency 'rspec'
|
23
|
+
gem.add_development_dependency 'webmock', '~> 1.9.0'
|
24
|
+
gem.add_development_dependency 'shoulda'
|
25
|
+
gem.add_development_dependency 'simplecov'
|
26
|
+
gem.add_development_dependency 'coveralls'
|
27
|
+
gem.add_development_dependency 'rake'
|
28
|
+
gem.add_development_dependency 'bundler'
|
29
|
+
gem.add_development_dependency 'sqlite3'
|
30
|
+
gem.add_development_dependency 'rspec'
|
31
|
+
gem.add_development_dependency 'rspec-rails'
|
32
|
+
gem.add_development_dependency 'factory_girl'
|
33
|
+
gem.add_development_dependency 'faker'
|
34
|
+
gem.add_development_dependency 'capybara'
|
35
|
+
|
36
|
+
gem.add_development_dependency 'rails', '>= 3.2.0'
|
37
|
+
gem.add_development_dependency 'coffee-rails'
|
38
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wiselinks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,8 +11,40 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-
|
14
|
+
date: 2013-06-01 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: rspec
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '0'
|
24
|
+
type: :development
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ! '>='
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: '0'
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: webmock
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
36
|
+
requirements:
|
37
|
+
- - ~>
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 1.9.0
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.9.0
|
16
48
|
- !ruby/object:Gem::Dependency
|
17
49
|
name: shoulda
|
18
50
|
requirement: !ruby/object:Gem::Requirement
|
@@ -30,7 +62,39 @@ dependencies:
|
|
30
62
|
- !ruby/object:Gem::Version
|
31
63
|
version: '0'
|
32
64
|
- !ruby/object:Gem::Dependency
|
33
|
-
name:
|
65
|
+
name: simplecov
|
66
|
+
requirement: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
type: :development
|
73
|
+
prerelease: false
|
74
|
+
version_requirements: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: coveralls
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
92
|
+
requirements:
|
93
|
+
- - ! '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: rake
|
34
98
|
requirement: !ruby/object:Gem::Requirement
|
35
99
|
none: false
|
36
100
|
requirements:
|
@@ -62,7 +126,119 @@ dependencies:
|
|
62
126
|
- !ruby/object:Gem::Version
|
63
127
|
version: '0'
|
64
128
|
- !ruby/object:Gem::Dependency
|
65
|
-
name:
|
129
|
+
name: sqlite3
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
132
|
+
requirements:
|
133
|
+
- - ! '>='
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
type: :development
|
137
|
+
prerelease: false
|
138
|
+
version_requirements: !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
140
|
+
requirements:
|
141
|
+
- - ! '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
- !ruby/object:Gem::Dependency
|
145
|
+
name: rspec
|
146
|
+
requirement: !ruby/object:Gem::Requirement
|
147
|
+
none: false
|
148
|
+
requirements:
|
149
|
+
- - ! '>='
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
type: :development
|
153
|
+
prerelease: false
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
none: false
|
156
|
+
requirements:
|
157
|
+
- - ! '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
- !ruby/object:Gem::Dependency
|
161
|
+
name: rspec-rails
|
162
|
+
requirement: !ruby/object:Gem::Requirement
|
163
|
+
none: false
|
164
|
+
requirements:
|
165
|
+
- - ! '>='
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
type: :development
|
169
|
+
prerelease: false
|
170
|
+
version_requirements: !ruby/object:Gem::Requirement
|
171
|
+
none: false
|
172
|
+
requirements:
|
173
|
+
- - ! '>='
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '0'
|
176
|
+
- !ruby/object:Gem::Dependency
|
177
|
+
name: factory_girl
|
178
|
+
requirement: !ruby/object:Gem::Requirement
|
179
|
+
none: false
|
180
|
+
requirements:
|
181
|
+
- - ! '>='
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: '0'
|
184
|
+
type: :development
|
185
|
+
prerelease: false
|
186
|
+
version_requirements: !ruby/object:Gem::Requirement
|
187
|
+
none: false
|
188
|
+
requirements:
|
189
|
+
- - ! '>='
|
190
|
+
- !ruby/object:Gem::Version
|
191
|
+
version: '0'
|
192
|
+
- !ruby/object:Gem::Dependency
|
193
|
+
name: faker
|
194
|
+
requirement: !ruby/object:Gem::Requirement
|
195
|
+
none: false
|
196
|
+
requirements:
|
197
|
+
- - ! '>='
|
198
|
+
- !ruby/object:Gem::Version
|
199
|
+
version: '0'
|
200
|
+
type: :development
|
201
|
+
prerelease: false
|
202
|
+
version_requirements: !ruby/object:Gem::Requirement
|
203
|
+
none: false
|
204
|
+
requirements:
|
205
|
+
- - ! '>='
|
206
|
+
- !ruby/object:Gem::Version
|
207
|
+
version: '0'
|
208
|
+
- !ruby/object:Gem::Dependency
|
209
|
+
name: capybara
|
210
|
+
requirement: !ruby/object:Gem::Requirement
|
211
|
+
none: false
|
212
|
+
requirements:
|
213
|
+
- - ! '>='
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '0'
|
216
|
+
type: :development
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
none: false
|
220
|
+
requirements:
|
221
|
+
- - ! '>='
|
222
|
+
- !ruby/object:Gem::Version
|
223
|
+
version: '0'
|
224
|
+
- !ruby/object:Gem::Dependency
|
225
|
+
name: rails
|
226
|
+
requirement: !ruby/object:Gem::Requirement
|
227
|
+
none: false
|
228
|
+
requirements:
|
229
|
+
- - ! '>='
|
230
|
+
- !ruby/object:Gem::Version
|
231
|
+
version: 3.2.0
|
232
|
+
type: :development
|
233
|
+
prerelease: false
|
234
|
+
version_requirements: !ruby/object:Gem::Requirement
|
235
|
+
none: false
|
236
|
+
requirements:
|
237
|
+
- - ! '>='
|
238
|
+
- !ruby/object:Gem::Version
|
239
|
+
version: 3.2.0
|
240
|
+
- !ruby/object:Gem::Dependency
|
241
|
+
name: coffee-rails
|
66
242
|
requirement: !ruby/object:Gem::Requirement
|
67
243
|
none: false
|
68
244
|
requirements:
|
@@ -81,11 +257,10 @@ description:
|
|
81
257
|
email: igor.alexandrov@gmail.com
|
82
258
|
executables: []
|
83
259
|
extensions: []
|
84
|
-
extra_rdoc_files:
|
85
|
-
- LICENSE
|
86
|
-
- README.md
|
260
|
+
extra_rdoc_files: []
|
87
261
|
files:
|
88
262
|
- .document
|
263
|
+
- .gitignore
|
89
264
|
- .rspec
|
90
265
|
- Gemfile
|
91
266
|
- Gemfile.lock
|
@@ -94,10 +269,14 @@ files:
|
|
94
269
|
- Rakefile
|
95
270
|
- VERSION
|
96
271
|
- app/views/layouts/wiselinks.html.erb
|
97
|
-
- lib/assets/javascripts/
|
98
|
-
- lib/assets/javascripts/
|
99
|
-
- lib/assets/javascripts/
|
100
|
-
- lib/assets/javascripts/
|
272
|
+
- lib/assets/javascripts/_form.js.coffee
|
273
|
+
- lib/assets/javascripts/_link.js.coffee
|
274
|
+
- lib/assets/javascripts/_page.js.coffee
|
275
|
+
- lib/assets/javascripts/_request_manager.js.coffee
|
276
|
+
- lib/assets/javascripts/lib/_history.adapter.jquery.js
|
277
|
+
- lib/assets/javascripts/lib/_history.html4.js
|
278
|
+
- lib/assets/javascripts/lib/_history.js
|
279
|
+
- lib/assets/javascripts/lib/_json2.js
|
101
280
|
- lib/assets/javascripts/wiselinks.js.coffee
|
102
281
|
- lib/wiselinks.rb
|
103
282
|
- lib/wiselinks/controller_methods.rb
|
@@ -106,6 +285,7 @@ files:
|
|
106
285
|
- lib/wiselinks/rails.rb
|
107
286
|
- lib/wiselinks/rendering.rb
|
108
287
|
- lib/wiselinks/request.rb
|
288
|
+
- lib/wiselinks/version.rb
|
109
289
|
- spec/cases/helpers_spec.rb
|
110
290
|
- spec/cases/request_spec.rb
|
111
291
|
- spec/dummy/README.rdoc
|
@@ -187,13 +367,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
187
367
|
version: '0'
|
188
368
|
segments:
|
189
369
|
- 0
|
190
|
-
hash: -
|
370
|
+
hash: -4102542331087791928
|
191
371
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
372
|
none: false
|
193
373
|
requirements:
|
194
374
|
- - ! '>='
|
195
375
|
- !ruby/object:Gem::Version
|
196
376
|
version: '0'
|
377
|
+
segments:
|
378
|
+
- 0
|
379
|
+
hash: -4102542331087791928
|
197
380
|
requirements: []
|
198
381
|
rubyforge_project:
|
199
382
|
rubygems_version: 1.8.24
|
@@ -201,4 +384,68 @@ signing_key:
|
|
201
384
|
specification_version: 3
|
202
385
|
summary: Wiselinks makes following links and submitting some forms in your web application
|
203
386
|
smarter and faster
|
204
|
-
test_files:
|
387
|
+
test_files:
|
388
|
+
- spec/cases/helpers_spec.rb
|
389
|
+
- spec/cases/request_spec.rb
|
390
|
+
- spec/dummy/README.rdoc
|
391
|
+
- spec/dummy/Rakefile
|
392
|
+
- spec/dummy/app/assets/javascripts/application.js.coffee
|
393
|
+
- spec/dummy/app/assets/stylesheets/application.css
|
394
|
+
- spec/dummy/app/controllers/application_controller.rb
|
395
|
+
- spec/dummy/app/helpers/application_helper.rb
|
396
|
+
- spec/dummy/app/mailers/.gitkeep
|
397
|
+
- spec/dummy/app/models/.gitkeep
|
398
|
+
- spec/dummy/app/views/application/index.html.erb
|
399
|
+
- spec/dummy/app/views/layouts/application.html.erb
|
400
|
+
- spec/dummy/config.ru
|
401
|
+
- spec/dummy/config/application.rb
|
402
|
+
- spec/dummy/config/boot.rb
|
403
|
+
- spec/dummy/config/database.yml
|
404
|
+
- spec/dummy/config/environment.rb
|
405
|
+
- spec/dummy/config/environments/development.rb
|
406
|
+
- spec/dummy/config/environments/production.rb
|
407
|
+
- spec/dummy/config/environments/test.rb
|
408
|
+
- spec/dummy/config/initializers/backtrace_silencers.rb
|
409
|
+
- spec/dummy/config/initializers/inflections.rb
|
410
|
+
- spec/dummy/config/initializers/mime_types.rb
|
411
|
+
- spec/dummy/config/initializers/secret_token.rb
|
412
|
+
- spec/dummy/config/initializers/session_store.rb
|
413
|
+
- spec/dummy/config/initializers/wrap_parameters.rb
|
414
|
+
- spec/dummy/config/locales/en.yml
|
415
|
+
- spec/dummy/config/routes.rb
|
416
|
+
- spec/dummy/lib/assets/.gitkeep
|
417
|
+
- spec/dummy/log/.gitkeep
|
418
|
+
- spec/dummy/log/development.log
|
419
|
+
- spec/dummy/log/test.log
|
420
|
+
- spec/dummy/public/404.html
|
421
|
+
- spec/dummy/public/422.html
|
422
|
+
- spec/dummy/public/500.html
|
423
|
+
- spec/dummy/public/assets/application-a98e47eb93026a340a766faf55214702.js
|
424
|
+
- spec/dummy/public/assets/application-a98e47eb93026a340a766faf55214702.js.gz
|
425
|
+
- spec/dummy/public/assets/application-ecf5beebe0b79251c8be40f0443074f2.css
|
426
|
+
- spec/dummy/public/assets/application-ecf5beebe0b79251c8be40f0443074f2.css.gz
|
427
|
+
- spec/dummy/public/assets/application.css
|
428
|
+
- spec/dummy/public/assets/application.css.gz
|
429
|
+
- spec/dummy/public/assets/application.js
|
430
|
+
- spec/dummy/public/assets/application.js.gz
|
431
|
+
- spec/dummy/public/assets/manifest.yml
|
432
|
+
- spec/dummy/public/favicon.ico
|
433
|
+
- spec/dummy/public/javascripts/wisepdf.js
|
434
|
+
- spec/dummy/public/stylesheets/wisepdf.css
|
435
|
+
- spec/dummy/script/rails
|
436
|
+
- spec/dummy/tmp/cache/assets/C26/0A0/sprockets%2F52456508a38f02f4559064b24980c87a
|
437
|
+
- spec/dummy/tmp/cache/assets/C5E/890/sprockets%2Ffb6525457b6873e6905e2d522548091f
|
438
|
+
- spec/dummy/tmp/cache/assets/C80/150/sprockets%2F0d3881005b0646df783d5c24683d34f5
|
439
|
+
- spec/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953
|
440
|
+
- spec/dummy/tmp/cache/assets/CF3/250/sprockets%2F7edb1809ce839a3d290508f935c89f42
|
441
|
+
- spec/dummy/tmp/cache/assets/D09/C40/sprockets%2Fcf317b95ed0500b7277e950a9c0c82e0
|
442
|
+
- spec/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705
|
443
|
+
- spec/dummy/tmp/cache/assets/D45/760/sprockets%2Fbc659a6e09b5025e8be539b0b68f71f2
|
444
|
+
- spec/dummy/tmp/cache/assets/D4E/D00/sprockets%2F1a6846f0a837ae2524e2f9ec89e6ef43
|
445
|
+
- spec/dummy/tmp/cache/assets/D55/090/sprockets%2F4a21bc343a4696b7603ea4cc25c3c3ba
|
446
|
+
- spec/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6
|
447
|
+
- spec/dummy/tmp/cache/assets/DC2/EB0/sprockets%2F75b4716f479a2acfac51b258fba0c2bd
|
448
|
+
- spec/dummy/tmp/cache/assets/DF1/B80/sprockets%2Fcd0ee4f742908cb7223a1e7be4a4ccbc
|
449
|
+
- spec/dummy/tmp/cache/assets/E11/4E0/sprockets%2F86e145a39f85cceeaffdff91ebb61449
|
450
|
+
- spec/factories/requests.rb
|
451
|
+
- spec/helper.rb
|