evercookie 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +59 -71
- data/config/routes.rb +7 -7
- data/lib/evercookie/controller.rb +40 -31
- data/lib/evercookie/engine.rb +1 -1
- data/lib/evercookie/version.rb +1 -1
- data/test/dummy/config/environments/production.rb +1 -1
- data/test/dummy4/Gemfile +19 -0
- data/test/dummy4/Gemfile.lock +119 -0
- data/test/dummy4/README.rdoc +28 -0
- data/test/dummy4/Rakefile +6 -0
- data/test/dummy4/app/assets/images/rails.png +0 -0
- data/test/dummy4/app/assets/javascripts/application.js +16 -0
- data/test/dummy4/app/assets/stylesheets/application.css +13 -0
- data/test/dummy4/app/controllers/application_controller.rb +5 -0
- data/test/dummy4/app/controllers/index_controller.rb +24 -0
- data/test/dummy4/app/helpers/application_helper.rb +2 -0
- data/test/dummy4/app/views/index/get.html.erb +5 -0
- data/test/dummy4/app/views/index/get_detailed.html.erb +26 -0
- data/test/dummy4/app/views/index/index.html.erb +36 -0
- data/test/dummy4/app/views/index/set.html.erb +3 -0
- data/test/dummy4/app/views/layouts/application.html.erb +14 -0
- data/test/dummy4/bin/bundle +3 -0
- data/test/dummy4/bin/rails +4 -0
- data/test/dummy4/bin/rake +4 -0
- data/test/dummy4/config.ru +4 -0
- data/test/dummy4/config/application.rb +22 -0
- data/test/dummy4/config/boot.rb +4 -0
- data/test/dummy4/config/database.yml +25 -0
- data/test/dummy4/config/environment.rb +5 -0
- data/test/dummy4/config/environments/development.rb +27 -0
- data/test/dummy4/config/environments/production.rb +80 -0
- data/test/dummy4/config/environments/test.rb +36 -0
- data/test/dummy4/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy4/config/initializers/evercookie.rb +8 -0
- data/test/dummy4/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy4/config/initializers/inflections.rb +16 -0
- data/test/dummy4/config/initializers/mime_types.rb +5 -0
- data/test/dummy4/config/initializers/secret_token.rb +12 -0
- data/test/dummy4/config/initializers/session_store.rb +3 -0
- data/test/dummy4/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy4/config/locales/en.yml +23 -0
- data/test/dummy4/config/routes.rb +10 -0
- data/test/dummy4/db/seeds.rb +7 -0
- data/test/dummy4/public/404.html +27 -0
- data/test/dummy4/public/422.html +26 -0
- data/test/dummy4/public/500.html +26 -0
- data/test/dummy4/public/favicon.ico +0 -0
- data/test/dummy4/public/robots.txt +5 -0
- data/test/dummy4/test/test_helper.rb +15 -0
- metadata +94 -8
data/README.rdoc
CHANGED
@@ -1,129 +1,117 @@
|
|
1
|
-
|
1
|
+
== Evercookie
|
2
2
|
|
3
|
-
{<img src="https://
|
3
|
+
{<img src="https://travis-ci.org/daddyz/evercookie.png?branch=master" alt="Build Status" />}[http://travis-ci.org/daddyz/evercookie]
|
4
|
+
{<img src="https://badge.fury.io/rb/evercookie.png" alt="Gem Version" />}[http://badge.fury.io/rb/evercookie]
|
5
|
+
{<img src="https://codeclimate.com/github/daddyz/evercookie.png" />}[https://codeclimate.com/github/daddyz/evercookie]
|
4
6
|
|
5
7
|
Evercookie is a gem allowing you to use very persistent cookies on your rails project to track existing users on your system.
|
6
8
|
It's javascript is based on https://github.com/samyk/evercookie javascript.
|
7
9
|
Please note, that evercookie can't be fully reliable for detecting previous visiting of your site/application. For people who know the job it's simple enough to override it.
|
8
10
|
|
9
|
-
As written on original javascript site
|
10
|
-
* Standard
|
11
|
-
*
|
12
|
-
*
|
11
|
+
As written on original javascript {site}[http://samy.pl/evercookie/], when creating a new cookie, it uses the following storage mechanisms when available:
|
12
|
+
* Standard {HTTP Cookies}[http://en.wikipedia.org/wiki/HTTP_cookie]
|
13
|
+
* {Local Shared Objects}[http://en.wikipedia.org/wiki/Local_Shared_Object] (Flash Cookies)
|
14
|
+
* {Isolated Storage}[http://www.silverlight.net/learn/quickstarts/isolatedstorage/] Silverlight (removed in gem)
|
13
15
|
* Storing cookies in RGB values of auto-generated, force-cached PNGs using HTML5 Canvas tag to read pixels (cookies) back out
|
14
|
-
* Storing cookies in and reading out
|
15
|
-
* Storing cookies in HTTP [
|
16
|
-
* Storing cookies in
|
17
|
-
*
|
18
|
-
* Internet Explorer [
|
19
|
-
* HTML5
|
20
|
-
* HTML5
|
21
|
-
* HTML5
|
22
|
-
* HTML5
|
16
|
+
* Storing cookies in and reading out {Web History}[http://samy.pl/csshack/] (removed in gem)
|
17
|
+
* Storing cookies in HTTP {ETags}[http://en.wikipedia.org/wiki/HTTP_ETag]
|
18
|
+
* Storing cookies in {Web cache}[http://en.wikipedia.org/wiki/Web_cache]
|
19
|
+
* {window.name}[http://en.wikipedia.org/wiki/HTTP_cookie=window.name] caching
|
20
|
+
* Internet Explorer {userData}[http://msdn.microsoft.com/en-us/library/ms531424(VS.85).aspx] storage
|
21
|
+
* HTML5 {Session Storage}[http://dev.w3.org/html5/webstorage/=the-sessionstorage-attribute]
|
22
|
+
* HTML5 {Local Storage}[http://dev.w3.org/html5/webstorage/=dom-localstorage]
|
23
|
+
* HTML5 {Global Storage}[https://developer.mozilla.org/en/dom/storage=globalStorage]
|
24
|
+
* HTML5 {Database Storage}[http://dev.w3.org/html5/webdatabase] via SQLite
|
23
25
|
|
24
|
-
|
26
|
+
== Information
|
25
27
|
|
26
|
-
|
28
|
+
=== RDoc
|
27
29
|
|
28
30
|
RDoc documentation can be found here
|
29
31
|
http://rubydoc.info/github/daddyz/evercookie/master/frames
|
30
32
|
|
31
|
-
|
33
|
+
=== Bug reports
|
32
34
|
|
33
35
|
If you discover a problem with Evercookie gem, let us know about it.
|
34
36
|
https://github.com/daddyz/evercookie/issues
|
35
37
|
|
36
|
-
|
38
|
+
=== Example application
|
37
39
|
|
38
40
|
You can see an example of evercookie working in test/dummy application of this gem
|
39
41
|
|
40
|
-
|
42
|
+
== Getting started
|
41
43
|
|
42
44
|
Evercookie works was written and tested on Rails 3.2. You can add in to your Gemfile with:
|
43
45
|
|
44
|
-
|
45
|
-
gem 'evercookie'
|
46
|
-
```
|
46
|
+
gem 'evercookie'
|
47
47
|
|
48
48
|
Run the bundle command to install it.
|
49
49
|
|
50
|
-
|
50
|
+
=== View helpers
|
51
51
|
|
52
52
|
View helper that adds javascript for setting the evercookie for client:
|
53
53
|
|
54
|
-
|
55
|
-
set_evercookie(:key, :value)
|
56
|
-
```
|
54
|
+
set_evercookie(:key, :value)
|
57
55
|
|
58
56
|
View helper that checks whether the cookie was set on client side and resets if some of cookies were deleted:
|
59
57
|
|
60
|
-
|
61
|
-
check_evercookie(:key)
|
62
|
-
```
|
58
|
+
check_evercookie(:key)
|
63
59
|
|
64
|
-
|
60
|
+
=== Controller helpers
|
65
61
|
|
66
62
|
Controller helper that gets the value of evercookie by key:
|
67
63
|
|
68
|
-
|
69
|
-
evercookie_get_value(:key)
|
70
|
-
```
|
64
|
+
evercookie_get_value(:key)
|
71
65
|
|
72
66
|
Controller helper that checks if specific evercookie was set:
|
73
67
|
|
74
|
-
|
75
|
-
evercookie_is_set?(:key)
|
76
|
-
evercookie_is_set?(:key, :value)
|
77
|
-
```
|
68
|
+
evercookie_is_set?(:key)
|
69
|
+
evercookie_is_set?(:key, :value)
|
78
70
|
|
79
|
-
|
71
|
+
=== How it works
|
80
72
|
|
81
73
|
When you are calling:
|
82
|
-
*
|
83
|
-
*
|
84
|
-
*
|
85
|
-
*
|
74
|
+
* <tt>set_evercookie</tt> helper it adds javascript to set evercookie values in all available storage mechanisms.
|
75
|
+
* <tt>check_evercookie</tt> helper it adds javascript to get evercookie values from all storage mechanisms where it possible and resets their values where it was removed (like if user removed individual cookies it sets them back) and after that it calls it's controller action to save evercookie value in rails session
|
76
|
+
* <tt>evercookie_get_value</tt> helper in controller it checks evercookie's session for provided 'key' value and returns it if exists
|
77
|
+
* <tt>evercookie_is_set?</tt> helper in controller it checks if there is a provided 'key' in evercookie's session
|
86
78
|
|
87
|
-
|
79
|
+
=== How this gem should be used
|
88
80
|
|
89
81
|
The main idea of this gem is to set somewhere in application an evercookie to track that this client already visited your application.
|
90
82
|
I used it to track multiple registrations in such scenario:
|
91
83
|
* After user was registered he was passed to specific view where I called set_evercookie helper:
|
92
|
-
|
93
|
-
set_evercookie(:uid, user_unique_id)
|
94
|
-
|
84
|
+
|
85
|
+
set_evercookie(:uid, user_unique_id)
|
86
|
+
|
95
87
|
* In user sign up page view I called check_evercookie helper:
|
96
|
-
|
97
|
-
check_evercookie(:uid)
|
98
|
-
|
88
|
+
|
89
|
+
check_evercookie(:uid)
|
90
|
+
|
99
91
|
* In controller that was handling new user creation process I was running evercookie_get_value helper to check if previously I got evercookie value from user, and if I got it I was showing an error:
|
100
|
-
```ruby
|
101
|
-
evercookie_get_value(:uid)
|
102
|
-
```
|
103
92
|
|
104
|
-
|
93
|
+
evercookie_get_value(:uid)
|
105
94
|
|
106
|
-
|
95
|
+
=== Configuring the gem
|
107
96
|
|
108
|
-
|
109
|
-
Evercookie.setup do |config|
|
110
|
-
# path for evercookie controller
|
111
|
-
config.namespace = :evercookie
|
97
|
+
You can create the initializer for evercookie gem in your Rails application initializers folder:
|
112
98
|
|
113
|
-
|
114
|
-
|
99
|
+
Evercookie.setup do |config|
|
100
|
+
# path for evercookie controller
|
101
|
+
config.namespace = :evercookie
|
115
102
|
|
116
|
-
|
117
|
-
|
103
|
+
# name of javascript class to be used for evercookie
|
104
|
+
config.js_class = :evercookie
|
118
105
|
|
119
|
-
|
120
|
-
|
106
|
+
# hash name base for session storage variables
|
107
|
+
config.hash_name = :evercookie
|
121
108
|
|
122
|
-
|
123
|
-
|
109
|
+
# cookie name for cache storage
|
110
|
+
config.cookie_cache = :evercookie_cache
|
124
111
|
|
125
|
-
|
126
|
-
|
127
|
-
end
|
128
|
-
```
|
112
|
+
# cookie name for png storage
|
113
|
+
config.cookie_png = :evercookie_png
|
129
114
|
|
115
|
+
# cookie name for etag storage
|
116
|
+
config.cookie_etag = :evercookie_etag
|
117
|
+
end
|
data/config/routes.rb
CHANGED
@@ -3,18 +3,18 @@ Rails.application.routes.draw do
|
|
3
3
|
# Adds routes for evercookie under namespace (path)
|
4
4
|
scope "#{Evercookie.get_namespace}" do
|
5
5
|
# route for js file to set cookie
|
6
|
-
|
6
|
+
get 'set' => "evercookie/evercookie#set", as: :evercookie_set
|
7
7
|
# route for js file to get cookie
|
8
|
-
|
8
|
+
get 'get' => "evercookie/evercookie#get", as: :evercookie_get
|
9
9
|
# route for save action to save cookie value to session
|
10
|
-
|
10
|
+
get 'save' => "evercookie/evercookie#save", as: :evercookie_save
|
11
11
|
|
12
12
|
# route to png image to be tracked by js script
|
13
|
-
|
13
|
+
get 'ec_png' => "evercookie/evercookie#ec_png", as: :evercookie_png
|
14
14
|
# route to etag action to be tracked by js script
|
15
|
-
|
15
|
+
get 'ec_etag' => "evercookie/evercookie#ec_etag", as: :evercookie_etag
|
16
16
|
# route to cache action to be tracked by js script
|
17
|
-
|
17
|
+
get 'ec_cache' => "evercookie/evercookie#ec_cache", as: :evercookie_cache
|
18
18
|
end
|
19
19
|
|
20
|
-
end
|
20
|
+
end
|
@@ -14,6 +14,16 @@ module Evercookie
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
# Set evercookie value to session
|
18
|
+
# == Examples:
|
19
|
+
# set_evercookie(:key, :value)
|
20
|
+
#
|
21
|
+
def set_evercookie(key, value)
|
22
|
+
session[Evercookie.hash_name_for_saved] = {} unless
|
23
|
+
session[Evercookie.hash_name_for_saved].present?
|
24
|
+
session[Evercookie.hash_name_for_saved][key] = value
|
25
|
+
end
|
26
|
+
|
17
27
|
# Checks whether the evercookie with specific key was defined
|
18
28
|
# == Examples:
|
19
29
|
# evercookie_is_set?(:key)
|
@@ -44,14 +54,10 @@ module Evercookie
|
|
44
54
|
|
45
55
|
# Saves current evercookie value to session
|
46
56
|
def save
|
47
|
-
if session[Evercookie.hash_name_for_get]
|
48
|
-
data
|
49
|
-
|
50
|
-
|
51
|
-
session[Evercookie.hash_name_for_saved].present?
|
52
|
-
|
53
|
-
session[Evercookie.hash_name_for_saved][data[:key]] =
|
54
|
-
cookies[data[:key]]
|
57
|
+
if data = session[Evercookie.hash_name_for_get]
|
58
|
+
if data[:key] && cookies[data[:key]]
|
59
|
+
session[Evercookie.hash_name_for_saved] =
|
60
|
+
{ data[:key] => cookies[data[:key]] }
|
55
61
|
end
|
56
62
|
end
|
57
63
|
render nothing: true
|
@@ -64,33 +70,12 @@ module Evercookie
|
|
64
70
|
return true
|
65
71
|
end
|
66
72
|
|
67
|
-
value = cookies[Evercookie.cookie_png]
|
68
|
-
|
69
|
-
require 'chunky_png'
|
70
|
-
image = ChunkyPNG::Image.new(200, 1, ChunkyPNG::Color::BLACK)
|
71
|
-
|
72
|
-
pixel = 0
|
73
|
-
while (index = pixel * 3) < value.length
|
74
|
-
red = value[index] ? value[index].ord : 0
|
75
|
-
green = value[index + 1] ? value[index + 1].ord : 0
|
76
|
-
blue = value[index + 2] ? value[index + 2].ord : 0
|
77
|
-
|
78
|
-
image[pixel, 0] = ChunkyPNG::Color.rgb(red, green, blue)
|
79
|
-
|
80
|
-
pixel += 1
|
81
|
-
end
|
82
|
-
|
83
73
|
response.headers["Content-Type"] = "image/png"
|
84
74
|
response.headers["Last-Modified"] = "Wed, 30 Jun 2010 21:36:48 GMT"
|
85
75
|
response.headers["Expires"] = "Tue, 31 Dec 2030 23:30:45 GMT"
|
86
76
|
response.headers["Cache-Control"] = "private, max-age=630720000"
|
87
77
|
|
88
|
-
|
89
|
-
{color_mode: ChunkyPNG::COLOR_TRUECOLOR,
|
90
|
-
compression: Zlib::DEFAULT_COMPRESSION}
|
91
|
-
)
|
92
|
-
|
93
|
-
render text: img_blob, status: 200, content_type: 'image/png'
|
78
|
+
render text: get_blob_png, status: 200, content_type: 'image/png'
|
94
79
|
end
|
95
80
|
|
96
81
|
# Renders page with etag header for evercookie js script
|
@@ -118,5 +103,29 @@ module Evercookie
|
|
118
103
|
|
119
104
|
render text: cookies[Evercookie.cookie_cache]
|
120
105
|
end
|
106
|
+
|
107
|
+
private
|
108
|
+
def get_blob_png
|
109
|
+
value = cookies[Evercookie.cookie_png]
|
110
|
+
|
111
|
+
require 'chunky_png'
|
112
|
+
image = ChunkyPNG::Image.new(200, 1, ChunkyPNG::Color::BLACK)
|
113
|
+
|
114
|
+
pixel = 0
|
115
|
+
while (index = pixel * 3) < value.length
|
116
|
+
red = value[index] ? value[index].ord : 0
|
117
|
+
green = value[index + 1] ? value[index + 1].ord : 0
|
118
|
+
blue = value[index + 2] ? value[index + 2].ord : 0
|
119
|
+
|
120
|
+
image[pixel, 0] = ChunkyPNG::Color.rgb(red, green, blue)
|
121
|
+
|
122
|
+
pixel += 1
|
123
|
+
end
|
124
|
+
|
125
|
+
image.to_blob(
|
126
|
+
{color_mode: ChunkyPNG::COLOR_TRUECOLOR,
|
127
|
+
compression: Zlib::DEFAULT_COMPRESSION}
|
128
|
+
)
|
129
|
+
end
|
121
130
|
end
|
122
|
-
end
|
131
|
+
end
|
data/lib/evercookie/engine.rb
CHANGED
data/lib/evercookie/version.rb
CHANGED
@@ -12,7 +12,7 @@ Dummy::Application.configure do
|
|
12
12
|
config.serve_static_assets = false
|
13
13
|
|
14
14
|
# Compress JavaScripts and CSS
|
15
|
-
config.assets.compress =
|
15
|
+
config.assets.compress = false
|
16
16
|
|
17
17
|
# Don't fallback to assets pipeline if a precompiled asset is missed
|
18
18
|
config.assets.compile = false
|
data/test/dummy4/Gemfile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
|
4
|
+
gem 'rails', '4.0.0.beta1'
|
5
|
+
gem 'sqlite3'
|
6
|
+
|
7
|
+
group :assets do
|
8
|
+
gem 'uglifier', '>= 1.0.3'
|
9
|
+
end
|
10
|
+
|
11
|
+
gem 'jquery-rails'
|
12
|
+
|
13
|
+
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
|
14
|
+
gem 'turbolinks'
|
15
|
+
|
16
|
+
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
|
17
|
+
gem 'jbuilder', '~> 1.0.1'
|
18
|
+
|
19
|
+
gem 'evercookie', path: '../../'
|
@@ -0,0 +1,119 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../../
|
3
|
+
specs:
|
4
|
+
evercookie (0.0.4)
|
5
|
+
chunky_png
|
6
|
+
rails (>= 3.1)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
actionmailer (4.0.0.beta1)
|
12
|
+
actionpack (= 4.0.0.beta1)
|
13
|
+
mail (~> 2.5.3)
|
14
|
+
actionpack (4.0.0.beta1)
|
15
|
+
activesupport (= 4.0.0.beta1)
|
16
|
+
builder (~> 3.1.0)
|
17
|
+
erubis (~> 2.7.0)
|
18
|
+
rack (~> 1.5.2)
|
19
|
+
rack-test (~> 0.6.2)
|
20
|
+
activemodel (4.0.0.beta1)
|
21
|
+
activesupport (= 4.0.0.beta1)
|
22
|
+
builder (~> 3.1.0)
|
23
|
+
activerecord (4.0.0.beta1)
|
24
|
+
activemodel (= 4.0.0.beta1)
|
25
|
+
activerecord-deprecated_finders (~> 0.0.3)
|
26
|
+
activesupport (= 4.0.0.beta1)
|
27
|
+
arel (~> 4.0.0.beta1)
|
28
|
+
activerecord-deprecated_finders (0.0.3)
|
29
|
+
activesupport (4.0.0.beta1)
|
30
|
+
i18n (~> 0.6.2)
|
31
|
+
minitest (~> 4.2)
|
32
|
+
multi_json (~> 1.3)
|
33
|
+
thread_safe (~> 0.1)
|
34
|
+
tzinfo (~> 0.3.33)
|
35
|
+
arel (4.0.0)
|
36
|
+
atomic (1.1.8)
|
37
|
+
builder (3.1.4)
|
38
|
+
chunky_png (1.2.8)
|
39
|
+
coffee-rails (4.0.0)
|
40
|
+
coffee-script (>= 2.2.0)
|
41
|
+
railties (>= 4.0.0.beta, < 5.0)
|
42
|
+
coffee-script (2.2.0)
|
43
|
+
coffee-script-source
|
44
|
+
execjs
|
45
|
+
coffee-script-source (1.6.2)
|
46
|
+
erubis (2.7.0)
|
47
|
+
execjs (1.4.0)
|
48
|
+
multi_json (~> 1.0)
|
49
|
+
hike (1.2.2)
|
50
|
+
i18n (0.6.4)
|
51
|
+
jbuilder (1.0.2)
|
52
|
+
activesupport (>= 3.0.0)
|
53
|
+
jquery-rails (2.2.1)
|
54
|
+
railties (>= 3.0, < 5.0)
|
55
|
+
thor (>= 0.14, < 2.0)
|
56
|
+
json (1.7.7)
|
57
|
+
mail (2.5.3)
|
58
|
+
i18n (>= 0.4.0)
|
59
|
+
mime-types (~> 1.16)
|
60
|
+
treetop (~> 1.4.8)
|
61
|
+
mime-types (1.23)
|
62
|
+
minitest (4.7.3)
|
63
|
+
multi_json (1.7.2)
|
64
|
+
polyglot (0.3.3)
|
65
|
+
rack (1.5.2)
|
66
|
+
rack-test (0.6.2)
|
67
|
+
rack (>= 1.0)
|
68
|
+
rails (4.0.0.beta1)
|
69
|
+
actionmailer (= 4.0.0.beta1)
|
70
|
+
actionpack (= 4.0.0.beta1)
|
71
|
+
activerecord (= 4.0.0.beta1)
|
72
|
+
activesupport (= 4.0.0.beta1)
|
73
|
+
bundler (>= 1.3.0, < 2.0)
|
74
|
+
railties (= 4.0.0.beta1)
|
75
|
+
sprockets-rails (~> 2.0.0.rc3)
|
76
|
+
railties (4.0.0.beta1)
|
77
|
+
actionpack (= 4.0.0.beta1)
|
78
|
+
activesupport (= 4.0.0.beta1)
|
79
|
+
rake (>= 0.8.7)
|
80
|
+
rdoc (~> 3.4)
|
81
|
+
thor (>= 0.17.0, < 2.0)
|
82
|
+
rake (10.0.4)
|
83
|
+
rdoc (3.12.2)
|
84
|
+
json (~> 1.4)
|
85
|
+
sprockets (2.9.3)
|
86
|
+
hike (~> 1.2)
|
87
|
+
multi_json (~> 1.0)
|
88
|
+
rack (~> 1.0)
|
89
|
+
tilt (~> 1.1, != 1.3.0)
|
90
|
+
sprockets-rails (2.0.0.rc4)
|
91
|
+
actionpack (>= 3.0)
|
92
|
+
activesupport (>= 3.0)
|
93
|
+
sprockets (~> 2.8)
|
94
|
+
sqlite3 (1.3.7)
|
95
|
+
thor (0.18.1)
|
96
|
+
thread_safe (0.1.0)
|
97
|
+
atomic
|
98
|
+
tilt (1.3.7)
|
99
|
+
treetop (1.4.12)
|
100
|
+
polyglot
|
101
|
+
polyglot (>= 0.3.1)
|
102
|
+
turbolinks (1.1.1)
|
103
|
+
coffee-rails
|
104
|
+
tzinfo (0.3.37)
|
105
|
+
uglifier (2.0.1)
|
106
|
+
execjs (>= 0.3.0)
|
107
|
+
multi_json (~> 1.0, >= 1.0.2)
|
108
|
+
|
109
|
+
PLATFORMS
|
110
|
+
ruby
|
111
|
+
|
112
|
+
DEPENDENCIES
|
113
|
+
evercookie!
|
114
|
+
jbuilder (~> 1.0.1)
|
115
|
+
jquery-rails
|
116
|
+
rails (= 4.0.0.beta1)
|
117
|
+
sqlite3
|
118
|
+
turbolinks
|
119
|
+
uglifier (>= 1.0.3)
|