mousereco 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/LICENSE.txt +22 -0
- data/README.md +34 -0
- data/Rakefile +34 -0
- data/app/assets/javascripts/mousereco/mousereco.js +15 -0
- data/app/assets/javascripts/mousereco/pageviews.js +244 -0
- data/app/assets/javascripts/mousereco/tracker.js.erb +312 -0
- data/app/assets/stylesheets/mousereco/bootstrap.min.css +9 -0
- data/app/assets/stylesheets/mousereco/mousereco.css +39 -0
- data/app/controllers/mousereco/api/v1/application_controller.rb +18 -0
- data/app/controllers/mousereco/api/v1/events_controller.rb +17 -0
- data/app/controllers/mousereco/api/v1/pageviews_controller.rb +21 -0
- data/app/controllers/mousereco/application_controller.rb +5 -0
- data/app/controllers/mousereco/pageviews_controller.rb +8 -0
- data/app/controllers/mousereco/trackers_controller.rb +6 -0
- data/app/controllers/mousereco/visitors_controller.rb +5 -0
- data/app/helpers/mousereco/application_helper.rb +4 -0
- data/app/helpers/mousereco/pageview_helper.rb +7 -0
- data/app/models/mousereco/click.rb +4 -0
- data/app/models/mousereco/event.rb +13 -0
- data/app/models/mousereco/mousemove.rb +4 -0
- data/app/models/mousereco/pageview.rb +15 -0
- data/app/models/mousereco/scroll.rb +4 -0
- data/app/models/mousereco/visitor.rb +13 -0
- data/app/services/mousereco/events_service.rb +21 -0
- data/app/services/mousereco/pageviews_service.rb +14 -0
- data/app/views/layouts/mousereco/application.html.haml +21 -0
- data/app/views/mousereco/pageviews/page_html.html.haml +1 -0
- data/app/views/mousereco/pageviews/show.html.haml +18 -0
- data/app/views/mousereco/visitors/index.html.haml +12 -0
- data/config/routes.rb +25 -0
- data/db/migrate/20140128001612_create_mousereco_events.rb +14 -0
- data/db/migrate/20140128001832_create_mousereco_pageviews.rb +17 -0
- data/db/migrate/20140128001950_create_mousereco_visitors.rb +9 -0
- data/db/migrate/20140130215132_add_limit_to_timestamps.rb +12 -0
- data/lib/generators/mousereco/install/install_generator.rb +22 -0
- data/lib/mousereco/engine.rb +9 -0
- data/lib/mousereco/version.rb +3 -0
- data/lib/mousereco.rb +4 -0
- data/lib/tasks/mousereco_tasks.rake +4 -0
- data/spec/api/mousereco/events_api_spec.rb +37 -0
- data/spec/api/mousereco/pageviews_api_spec.rb +58 -0
- data/spec/controllers/mousereco/pageviews_controller_spec.rb +12 -0
- data/spec/controllers/mousereco/visitors_controller_spec.rb +12 -0
- data/spec/dummy/Gemfile +31 -0
- data/spec/dummy/Gemfile.lock +174 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +14 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/home_controller.rb +4 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/home/index.html.haml +2 -0
- data/spec/dummy/app/views/layouts/application.html.haml +17 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config/application.rb +27 -0
- data/spec/dummy/config/boot.rb +4 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +7 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20140128221416_create_mousereco_events.mousereco.rb +15 -0
- data/spec/dummy/db/migrate/20140128221417_create_mousereco_pageviews.mousereco.rb +18 -0
- data/spec/dummy/db/migrate/20140128221418_create_mousereco_visitors.mousereco.rb +10 -0
- data/spec/dummy/db/migrate/20140130215835_add_limit_to_timestamps.mousereco.rb +13 -0
- data/spec/dummy/db/schema.rb +48 -0
- data/spec/dummy/db/seeds.rb +7 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +13721 -0
- data/spec/dummy/log/test.log +13232 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/robots.txt +5 -0
- data/spec/dummy/public/test.html +59 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1510a9c9dc22b2be9eed26a8ed2dabe8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/16d2919a6d361fd8c6e82b279d64067d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1d3e49d5614179160c0b571a9927dcc1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/1de21ea3d9fadc1a1c3269614b19495b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2533caf6d0459a8624fd40d33cddde85 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/29cde272ab8d39abcb99bfc3cba51e1b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2fd3dabf7baee6c0702bc29f86d2a70c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2ffb0b37de65c4bc12c9759935bcfa4a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/40091f436d9a77d1d9a9de7f3da46098 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/48139bef1023ab80e22b4891191c5c3a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/4ea33e825e6e38bd22dccab488a0255b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/54d5f50daadb633077b6cd9dd9fb72cc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5817965bb0355e7b0da40f9b36153ef6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5cbf24a4616e0252f26d7949679a42fe +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5d1aff6b78ca0eab106290139d3410a3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6d498a2bfb1bc8566133e4eb5c0ccd35 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/727930fb0f32b87625179e6a77770d16 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7be9086c960bb4384c9d23a52e489f29 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7cd76d5e9ba9b8658678d1455acfab74 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7d94acf804831ce74c7bf5455c1782f0 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8f8936f164170e095c5ca2d0c2ae6127 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/912559948251ede2d7fcd0cbd58654da +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9d48f1ca00d652a327f6e8f7c7fc0d40 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a9cf04e553d11e0103cf1c870e363d7d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b02bb55c99ea1e7b80cf52548ee0d1c5 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b9b341a8be874e4eee26dce66499bc80 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c6793056549a28ef6b4d0a4a8929f7e3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cac5a12e0a520ce86636e0443f3da875 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cb21171d87e8bb8b243a86594263deff +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cc5195a4891bb336aeb52b296f4971e9 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d44cfedd9e50cf9fd20463a31bad4ce3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e6c6c2db7ca06e62d0b8d81c9ee3fcf0 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e73e1a39e822bb2763fbb90a3d41498f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/eae4c7b940819b55676cea6e03251739 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f6f1db9d7bdcc747aae3fe9f3ec43dab +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/fe8b16f9af7353e9609c7fe6259d6912 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/1d3e49d5614179160c0b571a9927dcc1 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2154a1002f636a71bd688ee3b7a40295 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2ffb0b37de65c4bc12c9759935bcfa4a +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/40091f436d9a77d1d9a9de7f3da46098 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/417edfca088d0fa2811b10666b3adea4 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/48139bef1023ab80e22b4891191c5c3a +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/4ea33e825e6e38bd22dccab488a0255b +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/54d5f50daadb633077b6cd9dd9fb72cc +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5817965bb0355e7b0da40f9b36153ef6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/5cbf24a4616e0252f26d7949679a42fe +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6d498a2bfb1bc8566133e4eb5c0ccd35 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/7be9086c960bb4384c9d23a52e489f29 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/7d94acf804831ce74c7bf5455c1782f0 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/9fe452757d2a02edb37d0d7901709d9c +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a9cf04e553d11e0103cf1c870e363d7d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/b02bb55c99ea1e7b80cf52548ee0d1c5 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/b9b341a8be874e4eee26dce66499bc80 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/c7cac2711d4e453b8698081414f6bc73 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cac5a12e0a520ce86636e0443f3da875 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cb21171d87e8bb8b243a86594263deff +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cc5195a4891bb336aeb52b296f4971e9 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/e6c6c2db7ca06e62d0b8d81c9ee3fcf0 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f6f1db9d7bdcc747aae3fe9f3ec43dab +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/fe8b16f9af7353e9609c7fe6259d6912 +0 -0
- data/spec/dummy/tmp/pids/server.pid +1 -0
- data/spec/fabricators/pageview.rb +3 -0
- data/spec/fabricators/visitor.rb +3 -0
- data/spec/spec_helper.rb +20 -0
- metadata +393 -0
@@ -0,0 +1,12 @@
|
|
1
|
+
class AddLimitToTimestamps < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
#these probably should be stored as timestamp type, not integers. not refactoring yet
|
4
|
+
change_column :mousereco_events, :timestamp, :integer, limit: 5
|
5
|
+
change_column :mousereco_pageviews, :timestamp, :integer, limit: 5
|
6
|
+
end
|
7
|
+
|
8
|
+
def down
|
9
|
+
change_column :mousereco_events, :timestamp, :integer
|
10
|
+
change_column :mousereco_pageviews, :timestamp, :integer
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Mousereco
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
desc "This generator installs Mousereco"
|
5
|
+
|
6
|
+
def add_assets
|
7
|
+
js_manifest = 'app/assets/javascripts/application.js'
|
8
|
+
|
9
|
+
inject_into_file js_manifest, "//= require mousereco/tracker\n", :before => '//= require_tree .'
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_routes
|
13
|
+
route "mount Mousereco::Engine, at: \"/mousereco\"\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
def run_migrations
|
17
|
+
rake "mousereco:install:migrations"
|
18
|
+
rake "db:migrate"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/mousereco.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mousereco::Api::V1::EventsController, type: :controller do
|
4
|
+
routes { Mousereco::Engine.routes }
|
5
|
+
|
6
|
+
subject { post "/mousereco/api/v1/events", data; response }
|
7
|
+
let(:data) {
|
8
|
+
{"url" => "http://test.com",
|
9
|
+
"pageview_key" => pageview.key,
|
10
|
+
"visitor_key" => pageview.visitor.key,
|
11
|
+
"events" =>
|
12
|
+
{"0" => {"x" => "123.0", "y" => "321.4", "timestamp" => "123456671"},
|
13
|
+
"1" => {"x" => "125.0", "y" => "323.4", "timestamp" => "123456678", "type" => "scroll"},
|
14
|
+
"2" => {"x" => "125.0", "y" => "323.4", "timestamp" => "123456771", "type" => "scroll"},
|
15
|
+
"3" => {"x" => "125.0", "y" => "323.4", "timestamp" => "123456872", "type" => "mousemove"},
|
16
|
+
"4" => {"x" => "125.0", "y" => "323.4", "timestamp" => "123456973", "type" => "click"}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
let(:pageview) { Fabricate(:pageview) }
|
21
|
+
|
22
|
+
its(:status) { should eq 200 }
|
23
|
+
|
24
|
+
it 'saves events' do
|
25
|
+
subject
|
26
|
+
Mousereco::Visitor.count.should eq 1
|
27
|
+
Mousereco::Pageview.count.should eq 1
|
28
|
+
visitor = Mousereco::Visitor.last
|
29
|
+
visitor.clicks.count.should eq 2
|
30
|
+
visitor.mousemoves.count.should eq 1
|
31
|
+
visitor.pageviews.count.should eq 1
|
32
|
+
visitor.scrolls.count.should eq 2
|
33
|
+
visitor.events.count.should eq data["events"].count
|
34
|
+
Mousereco::Pageview.last.events.count.should eq data["events"].count
|
35
|
+
Mousereco::Event.count.should eq data["events"].count
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Mousereco::Api::V1::PageviewsController, type: :controller do
|
6
|
+
routes { Mousereco::Engine.routes }
|
7
|
+
|
8
|
+
describe '#preflight' do
|
9
|
+
subject { post "/mousereco/api/v1/pageviews/preflight", data; response }
|
10
|
+
let(:data) {
|
11
|
+
{"url" => "http://test.com",
|
12
|
+
"pageview_key" => "3kjn234jk23n4tk4her",
|
13
|
+
"visitor_key" => "49tuhiarf9q834tn34k3t",
|
14
|
+
"timestamp" => "123456671"
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
its(:status) { should eq 200 }
|
19
|
+
|
20
|
+
it 'returns success' do
|
21
|
+
json_response = JSON.parse(subject.body)
|
22
|
+
json_response.keys.should include('success')
|
23
|
+
json_response.keys.should include('send_html')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#create' do
|
28
|
+
subject { post "/mousereco/api/v1/pageviews", data; response }
|
29
|
+
let(:data) {
|
30
|
+
{"url" => "http://test.com",
|
31
|
+
"pageview_key" => "3kjn234jk23n4tk4her",
|
32
|
+
"visitor_key" => "49tuhiarf9q834tn34k3t",
|
33
|
+
"window_width" => "1200",
|
34
|
+
"window_height" => "900",
|
35
|
+
"timestamp" => "123456671",
|
36
|
+
"page_html" => <<EOS
|
37
|
+
<html lang="en-us"><head> <meta charset="utf-8"> <title>HTML5 Boilerplate: The web's most popular front-end template</title> <meta name="description" content="HTML5 Boilerplate is a professional front-end template for building fast, robust, and adaptable web apps or sites. Spend more time developing and less time reinventing the wheel."> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Open Sans:400,700"> <link rel="stylesheet" href="css/main-7b3fecba68527e3c683b5ffed5a0c131.min.css"> <script src="//www.google-analytics.com/ga.js"></script><script id="twitter-wjs" src="http://platform.twitter.com/widgets.js"></script><script src="js/html5.js"></script> <style type="text/css"></style></head> <body style="zoom: 1;" data-twttr-rendered="true"> <div class="container"> <header class="site-header cf" role="banner"> <div class="site-logo"> HTML5 <span class="star">★</span> Boilerplate </div> <ul class="site-nav inline-block-list"> <li><a href="https://github.com/h5bp/html5-boilerplate" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label="Source code">Source code</a></li> <li><a href="https://github.com/h5bp/html5-boilerplate/blob/v4.3.0/doc/TOC.md" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label="Docs">Docs</a></li> <li><a href="http://h5bp.github.com" data-ga-category="Outbound links" data-ga-action="Nav click" data-ga-label="Other projects">Other projects</a></li> </ul> </header><!-- end site-header --> <div class="site-promo"> <h1>The web’s most popular front-end template</h1> <p class="description">HTML5 Boilerplate helps you build <strong>fast</strong>, <strong>robust</strong>, and <strong>adaptable</strong> web apps or sites. Kick-start your project with the combined knowledge and effort of 100s of developers, all in one little package.</p> <div class="cta-option"> <a class="btn-download" href="https://github.com/h5bp/html5-boilerplate/zipball/v4.3.0" data-ga-category="Download" data-ga-action="Download - top" data-ga-label="v4.3.0"> <strong>Download</strong> <span class="version">v4.3.0</span> </a> <a class="last-update" href="https://github.com/h5bp/html5-boilerplate/blob/v4.3.0/CHANGELOG.md"> See the CHANGELOG </a> </div> <div class="cta-option"> <a class="btn-download btn-download-alt" href="http://initializr.com" data-ga-category="Outbound links" data-ga-action="Get custom build" data-ga-label="v4.3.0"> Get a custom build </a> </div> </div><!-- end site-promo --> </div> <div class="site-content"> <div class="container"> <h2>Save time. Create with confidence.</h2> <div class="grid"> <div class="grid-cell"> <h3><span class="star">★</span> Analytics, icons, and more</h3> <p>A lean, mobile-friendly HTML template; optimized Google Analytics snippet; placeholder touch-device icons; and docs covering dozens of extra tips and tricks.</p> </div> <div class="grid-cell"> <h3><span class="star">★</span> Normalize.css and helpers</h3> <p>Includes <a href="http://necolas.github.com/normalize.css/">Normalize.css</a> v1 — a modern, HTML5-ready alternative to CSS resets — and further base styles, helpers, media queries, and print styles.</p> </div> <div class="grid-cell"> <h3><span class="star">★</span> jQuery and Modernizr</h3> <p>Get the latest minified versions of two best-of-breed libraries: <a href="http://jquery.org/">jQuery</a> (via Google’s CDN, with local fallback) and the <a href="http://modernizr.com/">Modernizr</a> feature detection library.</p> </div> <div class="grid-cell"> <h3><span class="star">★</span> High performance</h3> <p>Apache settings to help you deliver excellent site performance. We independently maintain <a href="https://github.com/h5bp/server-configs">server configs</a>, a <a href="https://github.com/h5bp/node-build-script">node build script</a>, and an <a href="https://github.com/h5bp/ant-build-script">ant build script</a>.</p> </div> </div> <div class="flex-embed"> <iframe width="720" height="540" src="http://www.youtube.com/embed/WkLO-q2wC80?theme=light" frameborder="0" allowfullscreen=""></iframe> </div> <h2>Who uses HTML5 Boilerplate?</h2> <p class="in-the-wild"> <a href="http://www.projectrebrief.com/">Google</a>, <a href="http://www.microsoft.com/surface/">Microsoft</a>, <a href="http://data.nasa.gov/">NASA</a>, <a href="http://www.nikeskateboarding.com/">Nike</a>, <a href="http://www.barackobama.com/">Barack Obama</a>, <a href="http://a-class.mercedes-benz.com/">Mercedes-Benz</a>, <a href="http://www.itv.com/news/">ITV News</a>, <a href="http://www.astuteclass.com/">BAE Systems</a>, <a href="http://creativecommons.org/">Creative Commons</a>, <a href="http://auspost.com.au/">Australia Post</a>, <a href="http://www.ew.com/">Entertainment Weekly</a>, <a href="http://www.racinggreen.co.uk/">Racing Green</a>, and <a href="https://github.com/h5bp/html5-boilerplate/wiki/sites">many more</a>. </p> <div class="cta-option"> <a class="btn-download" href="https://github.com/h5bp/html5-boilerplate/zipball/v4.3.0" data-ga-category="Download" data-ga-action="Download - bottom" data-ga-label="v4.3.0"> <strong>Download</strong> <span class="version">v4.3.0</span> </a> </div> </div> </div> <aside class="aside"> <div class="container"> <ul class="inline-block-list"> <li><a href="https://github.com/h5bp/html5-boilerplate/issues" data-ga-category="Outbound links" data-ga-action="Footer click" data-ga-label="Report issues"> <img class="icon" src="http://www.google.com/s2/favicons?domain=github.com" alt=""> Report issues </a></li> <li><a href="http://stackoverflow.com/questions/tagged/html5boilerplate" data-ga-category="Outbound links" data-ga-action="Footer click" data-ga-label="Help on Stack Overflow"> <img class="icon" src="http://www.google.com/s2/favicons?domain=stackoverflow.com" alt=""> Help on Stack Overflow </a></li> <li><a href="http://h5bp.net" data-ga-category="Outbound links" data-ga-action="Footer click" data-ga-label="View the showcase"> <img class="icon" src="http://24.media.tumblr.com/avatar_c11b98176b89_16.png" alt=""> View the showcase </a></li> </ul> </div> </aside><!-- end aside --> <footer class="site-footer" role="contentinfo"> <div class="container"> <p> <iframe id="twitter-widget-0" scrolling="no" frameborder="0" allowtransparency="true" src="http://platform.twitter.com/widgets/tweet_button.1382126667.html#_=1382262711246
|
38
|
+
EOS
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
its(:status) { should eq 200 }
|
43
|
+
|
44
|
+
it 'returns success' do
|
45
|
+
json_response = JSON.parse(subject.body)
|
46
|
+
json_response.keys.should include('success')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'creates pageview' do
|
50
|
+
subject
|
51
|
+
Mousereco::Pageview.count.should eq 1
|
52
|
+
Mousereco::Pageview.last.page_html.should eq data["page_html"]
|
53
|
+
Mousereco::Pageview.last.window_width.should eq 1200
|
54
|
+
Mousereco::Pageview.last.window_height.should eq 900
|
55
|
+
Mousereco::Pageview.last.timestamp.should eq 123456671
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mousereco::PageviewsController do
|
4
|
+
routes { Mousereco::Engine.routes }
|
5
|
+
|
6
|
+
describe '#show' do
|
7
|
+
let(:pageview) { Fabricate(:pageview) }
|
8
|
+
subject { get :show, {id: pageview.id}; response }
|
9
|
+
|
10
|
+
its(:status) { should eq 200 }
|
11
|
+
end
|
12
|
+
end
|
data/spec/dummy/Gemfile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
ruby '2.0.0'
|
2
|
+
source 'https://rubygems.org'
|
3
|
+
|
4
|
+
gem 'rails', '4.0.0'
|
5
|
+
gem 'sass-rails', '~> 4.0.0'
|
6
|
+
gem 'uglifier', '>= 1.3.0'
|
7
|
+
gem 'coffee-rails', '~> 4.0.0'
|
8
|
+
gem 'jquery-rails'
|
9
|
+
#gem 'turbolinks'
|
10
|
+
gem 'jbuilder', '~> 1.2'
|
11
|
+
gem 'therubyracer', platforms: :ruby
|
12
|
+
|
13
|
+
group :development, :test do
|
14
|
+
gem 'pry'
|
15
|
+
gem 'rspec'
|
16
|
+
gem 'rspec-rails'
|
17
|
+
end
|
18
|
+
|
19
|
+
group :development do
|
20
|
+
gem 'sqlite3'
|
21
|
+
end
|
22
|
+
|
23
|
+
group :production do
|
24
|
+
gem 'pg'
|
25
|
+
gem 'rails_12factor'
|
26
|
+
end
|
27
|
+
|
28
|
+
gem 'haml'
|
29
|
+
gem 'inherited_resources'
|
30
|
+
gem 'fabrication'
|
31
|
+
gem 'mousereco', path: '../../'
|
@@ -0,0 +1,174 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../../
|
3
|
+
specs:
|
4
|
+
mousereco (0.0.2)
|
5
|
+
inherited_resources
|
6
|
+
jquery-rails
|
7
|
+
rails (~> 4.0)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
actionmailer (4.0.0)
|
13
|
+
actionpack (= 4.0.0)
|
14
|
+
mail (~> 2.5.3)
|
15
|
+
actionpack (4.0.0)
|
16
|
+
activesupport (= 4.0.0)
|
17
|
+
builder (~> 3.1.0)
|
18
|
+
erubis (~> 2.7.0)
|
19
|
+
rack (~> 1.5.2)
|
20
|
+
rack-test (~> 0.6.2)
|
21
|
+
activemodel (4.0.0)
|
22
|
+
activesupport (= 4.0.0)
|
23
|
+
builder (~> 3.1.0)
|
24
|
+
activerecord (4.0.0)
|
25
|
+
activemodel (= 4.0.0)
|
26
|
+
activerecord-deprecated_finders (~> 1.0.2)
|
27
|
+
activesupport (= 4.0.0)
|
28
|
+
arel (~> 4.0.0)
|
29
|
+
activerecord-deprecated_finders (1.0.3)
|
30
|
+
activesupport (4.0.0)
|
31
|
+
i18n (~> 0.6, >= 0.6.4)
|
32
|
+
minitest (~> 4.2)
|
33
|
+
multi_json (~> 1.3)
|
34
|
+
thread_safe (~> 0.1)
|
35
|
+
tzinfo (~> 0.3.37)
|
36
|
+
arel (4.0.1)
|
37
|
+
atomic (1.1.14)
|
38
|
+
builder (3.1.4)
|
39
|
+
coderay (1.1.0)
|
40
|
+
coffee-rails (4.0.1)
|
41
|
+
coffee-script (>= 2.2.0)
|
42
|
+
railties (>= 4.0.0, < 5.0)
|
43
|
+
coffee-script (2.2.0)
|
44
|
+
coffee-script-source
|
45
|
+
execjs
|
46
|
+
coffee-script-source (1.6.3)
|
47
|
+
diff-lcs (1.2.5)
|
48
|
+
erubis (2.7.0)
|
49
|
+
execjs (2.0.2)
|
50
|
+
fabrication (2.9.6)
|
51
|
+
haml (4.0.5)
|
52
|
+
tilt
|
53
|
+
has_scope (0.6.0.rc)
|
54
|
+
actionpack (>= 3.2, < 5)
|
55
|
+
activesupport (>= 3.2, < 5)
|
56
|
+
hike (1.2.3)
|
57
|
+
i18n (0.6.9)
|
58
|
+
inherited_resources (1.4.1)
|
59
|
+
has_scope (~> 0.6.0.rc)
|
60
|
+
responders (~> 1.0.0.rc)
|
61
|
+
jbuilder (1.5.3)
|
62
|
+
activesupport (>= 3.0.0)
|
63
|
+
multi_json (>= 1.2.0)
|
64
|
+
jquery-rails (3.0.4)
|
65
|
+
railties (>= 3.0, < 5.0)
|
66
|
+
thor (>= 0.14, < 2.0)
|
67
|
+
json (1.8.1)
|
68
|
+
libv8 (3.16.14.3)
|
69
|
+
mail (2.5.4)
|
70
|
+
mime-types (~> 1.16)
|
71
|
+
treetop (~> 1.4.8)
|
72
|
+
method_source (0.8.2)
|
73
|
+
mime-types (1.25.1)
|
74
|
+
minitest (4.7.5)
|
75
|
+
multi_json (1.8.4)
|
76
|
+
pg (0.17.1)
|
77
|
+
polyglot (0.3.3)
|
78
|
+
pry (0.9.12.4)
|
79
|
+
coderay (~> 1.0)
|
80
|
+
method_source (~> 0.8)
|
81
|
+
slop (~> 3.4)
|
82
|
+
rack (1.5.2)
|
83
|
+
rack-test (0.6.2)
|
84
|
+
rack (>= 1.0)
|
85
|
+
rails (4.0.0)
|
86
|
+
actionmailer (= 4.0.0)
|
87
|
+
actionpack (= 4.0.0)
|
88
|
+
activerecord (= 4.0.0)
|
89
|
+
activesupport (= 4.0.0)
|
90
|
+
bundler (>= 1.3.0, < 2.0)
|
91
|
+
railties (= 4.0.0)
|
92
|
+
sprockets-rails (~> 2.0.0)
|
93
|
+
rails_12factor (0.0.2)
|
94
|
+
rails_serve_static_assets
|
95
|
+
rails_stdout_logging
|
96
|
+
rails_serve_static_assets (0.0.2)
|
97
|
+
rails_stdout_logging (0.0.3)
|
98
|
+
railties (4.0.0)
|
99
|
+
actionpack (= 4.0.0)
|
100
|
+
activesupport (= 4.0.0)
|
101
|
+
rake (>= 0.8.7)
|
102
|
+
thor (>= 0.18.1, < 2.0)
|
103
|
+
rake (10.1.1)
|
104
|
+
ref (1.0.5)
|
105
|
+
responders (1.0.0)
|
106
|
+
railties (>= 3.2, < 5)
|
107
|
+
rspec (2.14.1)
|
108
|
+
rspec-core (~> 2.14.0)
|
109
|
+
rspec-expectations (~> 2.14.0)
|
110
|
+
rspec-mocks (~> 2.14.0)
|
111
|
+
rspec-core (2.14.7)
|
112
|
+
rspec-expectations (2.14.4)
|
113
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
114
|
+
rspec-mocks (2.14.4)
|
115
|
+
rspec-rails (2.14.1)
|
116
|
+
actionpack (>= 3.0)
|
117
|
+
activemodel (>= 3.0)
|
118
|
+
activesupport (>= 3.0)
|
119
|
+
railties (>= 3.0)
|
120
|
+
rspec-core (~> 2.14.0)
|
121
|
+
rspec-expectations (~> 2.14.0)
|
122
|
+
rspec-mocks (~> 2.14.0)
|
123
|
+
sass (3.2.14)
|
124
|
+
sass-rails (4.0.1)
|
125
|
+
railties (>= 4.0.0, < 5.0)
|
126
|
+
sass (>= 3.1.10)
|
127
|
+
sprockets-rails (~> 2.0.0)
|
128
|
+
slop (3.4.7)
|
129
|
+
sprockets (2.10.1)
|
130
|
+
hike (~> 1.2)
|
131
|
+
multi_json (~> 1.0)
|
132
|
+
rack (~> 1.0)
|
133
|
+
tilt (~> 1.1, != 1.3.0)
|
134
|
+
sprockets-rails (2.0.1)
|
135
|
+
actionpack (>= 3.0)
|
136
|
+
activesupport (>= 3.0)
|
137
|
+
sprockets (~> 2.8)
|
138
|
+
sqlite3 (1.3.8)
|
139
|
+
therubyracer (0.12.0)
|
140
|
+
libv8 (~> 3.16.14.0)
|
141
|
+
ref
|
142
|
+
thor (0.18.1)
|
143
|
+
thread_safe (0.1.3)
|
144
|
+
atomic
|
145
|
+
tilt (1.4.1)
|
146
|
+
treetop (1.4.15)
|
147
|
+
polyglot
|
148
|
+
polyglot (>= 0.3.1)
|
149
|
+
tzinfo (0.3.38)
|
150
|
+
uglifier (2.4.0)
|
151
|
+
execjs (>= 0.3.0)
|
152
|
+
json (>= 1.8.0)
|
153
|
+
|
154
|
+
PLATFORMS
|
155
|
+
ruby
|
156
|
+
|
157
|
+
DEPENDENCIES
|
158
|
+
coffee-rails (~> 4.0.0)
|
159
|
+
fabrication
|
160
|
+
haml
|
161
|
+
inherited_resources
|
162
|
+
jbuilder (~> 1.2)
|
163
|
+
jquery-rails
|
164
|
+
mousereco!
|
165
|
+
pg
|
166
|
+
pry
|
167
|
+
rails (= 4.0.0)
|
168
|
+
rails_12factor
|
169
|
+
rspec
|
170
|
+
rspec-rails
|
171
|
+
sass-rails (~> 4.0.0)
|
172
|
+
sqlite3
|
173
|
+
therubyracer
|
174
|
+
uglifier (>= 1.3.0)
|
data/spec/dummy/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
// This is a manifest file that'll be compiled into application.js, which will include all the files
|
2
|
+
// listed below.
|
3
|
+
//
|
4
|
+
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
|
5
|
+
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
|
6
|
+
//
|
7
|
+
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
|
8
|
+
// compiled file.
|
9
|
+
//
|
10
|
+
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
|
11
|
+
// about supported directives.
|
12
|
+
//
|
13
|
+
//= require mousereco/tracker
|
14
|
+
//= require_tree .
|
@@ -0,0 +1,13 @@
|
|
1
|
+
/*
|
2
|
+
* This is a manifest file that'll be compiled into application.css, which will include all the files
|
3
|
+
* listed below.
|
4
|
+
*
|
5
|
+
* Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
|
6
|
+
* or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
|
7
|
+
*
|
8
|
+
* You're free to add application-wide styles to this file and they'll appear at the top of the
|
9
|
+
* compiled file, but it's generally better to create a new file per style scope.
|
10
|
+
*
|
11
|
+
*= require_self
|
12
|
+
*= require_tree .
|
13
|
+
*/
|
@@ -0,0 +1,17 @@
|
|
1
|
+
!!!
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%meta{name: "viewport", content: "width=device-width, initial-scale=1.0"}
|
5
|
+
%title= "Mouse recorder"
|
6
|
+
= stylesheet_link_tag "application"
|
7
|
+
= javascript_include_tag "application"
|
8
|
+
= csrf_meta_tag
|
9
|
+
%body{class: controller_name}
|
10
|
+
.navbar.navbar-inverse.navbar-fixed-top
|
11
|
+
.container
|
12
|
+
.navbar-header
|
13
|
+
= link_to 'Dummy App', root_path, class: 'navbar-brand'
|
14
|
+
.container.main-container
|
15
|
+
.row
|
16
|
+
.col-md-12
|
17
|
+
= yield
|
data/spec/dummy/bin/rake
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.expand_path('../boot', __FILE__)
|
2
|
+
|
3
|
+
require 'rails/all'
|
4
|
+
|
5
|
+
# Require the gems listed in Gemfile, including any gems
|
6
|
+
# you've limited to :test, :development, or :production.
|
7
|
+
Bundler.require(:default, Rails.env)
|
8
|
+
|
9
|
+
module MouseRecorder
|
10
|
+
class Application < Rails::Application
|
11
|
+
# Settings in config/environments/* take precedence over those specified here.
|
12
|
+
# Application configuration should go into files in config/initializers
|
13
|
+
# -- all .rb files in that directory are automatically loaded.
|
14
|
+
|
15
|
+
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
16
|
+
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
17
|
+
# config.time_zone = 'Central Time (US & Canada)'
|
18
|
+
|
19
|
+
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
20
|
+
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
21
|
+
# config.i18n.default_locale = :de
|
22
|
+
|
23
|
+
config.paths.add "app/api", glob: "**/*.rb"
|
24
|
+
config.autoload_paths += Dir["#{Rails.root}/app/api/*"]
|
25
|
+
config.i18n.enforce_available_locales = true
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# SQLite version 3.x
|
2
|
+
# gem install sqlite3
|
3
|
+
#
|
4
|
+
# Ensure the SQLite 3 gem is defined in your Gemfile
|
5
|
+
# gem 'sqlite3'
|
6
|
+
development:
|
7
|
+
adapter: sqlite3
|
8
|
+
database: db/development.sqlite3
|
9
|
+
pool: 5
|
10
|
+
timeout: 5000
|
11
|
+
|
12
|
+
# Warning: The database defined as "test" will be erased and
|
13
|
+
# re-generated from your development database when you run "rake".
|
14
|
+
# Do not set this db to the same as development or production.
|
15
|
+
test:
|
16
|
+
adapter: sqlite3
|
17
|
+
database: db/test.sqlite3
|
18
|
+
pool: 5
|
19
|
+
timeout: 5000
|
20
|
+
|
21
|
+
production:
|
22
|
+
adapter: sqlite3
|
23
|
+
database: db/production.sqlite3
|
24
|
+
pool: 5
|
25
|
+
timeout: 5000
|
@@ -0,0 +1,29 @@
|
|
1
|
+
MouseRecorder::Application.configure do
|
2
|
+
# Settings specified here will take precedence over those in config/application.rb.
|
3
|
+
|
4
|
+
# In the development environment your application's code is reloaded on
|
5
|
+
# every request. This slows down response time but is perfect for development
|
6
|
+
# since you don't have to restart the web server when you make code changes.
|
7
|
+
config.cache_classes = false
|
8
|
+
|
9
|
+
# Do not eager load code on boot.
|
10
|
+
config.eager_load = false
|
11
|
+
|
12
|
+
# Show full error reports and disable caching.
|
13
|
+
config.consider_all_requests_local = true
|
14
|
+
config.action_controller.perform_caching = false
|
15
|
+
|
16
|
+
# Don't care if the mailer can't send.
|
17
|
+
config.action_mailer.raise_delivery_errors = false
|
18
|
+
|
19
|
+
# Print deprecation notices to the Rails logger.
|
20
|
+
config.active_support.deprecation = :log
|
21
|
+
|
22
|
+
# Raise an error on page load if there are pending migrations
|
23
|
+
config.active_record.migration_error = :page_load
|
24
|
+
|
25
|
+
# Debug mode disables concatenation and preprocessing of assets.
|
26
|
+
# This option may cause significant delays in view rendering with a large
|
27
|
+
# number of complex assets.
|
28
|
+
config.assets.debug = true
|
29
|
+
end
|