metry 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +6 -0
- data/Manifest.txt +14 -69
- data/TODO +2 -3
- data/cucumber.yml +1 -0
- data/example/example.rb +1 -1
- data/features/psycho/dashboard.feature +17 -0
- data/features/psycho/goals.feature +24 -0
- data/features/psycho/visitor_tracking.feature +32 -0
- data/features/step_definitions/goals.rb +3 -0
- data/features/step_definitions/tracking.rb +1 -1
- data/features/step_definitions/web.rb +14 -2
- data/features/support/env.rb +4 -0
- data/lib/metry.rb +4 -6
- data/lib/metry/experiment.rb +6 -8
- data/lib/metry/psycho.rb +112 -0
- data/lib/metry/psycho/dashboard.erb +14 -0
- data/lib/metry/psycho/layout.erb +8 -0
- data/lib/metry/psycho/new_goal.erb +9 -0
- data/lib/metry/psycho/visitor.erb +7 -0
- data/lib/metry/rack/tracking.rb +17 -13
- data/lib/metry/storage.rb +116 -0
- data/radiant/example/features/metry.feature +8 -8
- data/radiant/example/features/psycho.feature +13 -0
- data/radiant/example/features/step_definitions/experiments.rb +2 -2
- data/radiant/example/features/step_definitions/tracking.rb +1 -1
- data/radiant/example/features/support/env.rb +3 -0
- data/radiant/extension/lib/metry_authenticator.rb +30 -0
- data/radiant/extension/lib/metry_tags.rb +2 -1
- data/radiant/extension/metry_extension.rb +1 -1
- data/test/{test_tokyo.rb → test_storage.rb} +3 -3
- metadata +17 -72
- data/lib/metry/memory.rb +0 -27
- data/lib/metry/tokyo.rb +0 -181
- data/vendor/rufus-tokyo/CHANGELOG.txt +0 -112
- data/vendor/rufus-tokyo/CREDITS.txt +0 -27
- data/vendor/rufus-tokyo/LICENSE.txt +0 -21
- data/vendor/rufus-tokyo/README.txt +0 -310
- data/vendor/rufus-tokyo/Rakefile +0 -118
- data/vendor/rufus-tokyo/TODO.txt +0 -25
- data/vendor/rufus-tokyo/doc/decision_table.numbers +0 -0
- data/vendor/rufus-tokyo/doc/rdoc-style.css +0 -320
- data/vendor/rufus-tokyo/lib/rufus-edo.rb +0 -3
- data/vendor/rufus-tokyo/lib/rufus-tokyo.rb +0 -3
- data/vendor/rufus-tokyo/lib/rufus/edo.rb +0 -39
- data/vendor/rufus-tokyo/lib/rufus/edo/README.txt +0 -106
- data/vendor/rufus-tokyo/lib/rufus/edo/cabcore.rb +0 -333
- data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/abstract.rb +0 -219
- data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/table.rb +0 -159
- data/vendor/rufus-tokyo/lib/rufus/edo/error.rb +0 -36
- data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant.rb +0 -4
- data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/abstract.rb +0 -137
- data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/table.rb +0 -141
- data/vendor/rufus-tokyo/lib/rufus/edo/tabcore.rb +0 -567
- data/vendor/rufus-tokyo/lib/rufus/tokyo.rb +0 -58
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/abstract.rb +0 -568
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/lib.rb +0 -230
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/table.rb +0 -753
- data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/util.rb +0 -425
- data/vendor/rufus-tokyo/lib/rufus/tokyo/config.rb +0 -161
- data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia.rb +0 -43
- data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/lib.rb +0 -65
- data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/words.rb +0 -71
- data/vendor/rufus-tokyo/lib/rufus/tokyo/hmethods.rb +0 -111
- data/vendor/rufus-tokyo/lib/rufus/tokyo/query.rb +0 -102
- data/vendor/rufus-tokyo/lib/rufus/tokyo/transactions.rb +0 -74
- data/vendor/rufus-tokyo/lib/rufus/tokyo/ttcommons.rb +0 -59
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant.rb +0 -35
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/abstract.rb +0 -146
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/lib.rb +0 -153
- data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/table.rb +0 -162
- data/vendor/rufus-tokyo/rufus-tokyo.gemspec +0 -25
- data/vendor/rufus-tokyo/spec/cabinet_spec.rb +0 -472
- data/vendor/rufus-tokyo/spec/cabinetconfig_spec.rb +0 -82
- data/vendor/rufus-tokyo/spec/edo_cabinet_spec.rb +0 -447
- data/vendor/rufus-tokyo/spec/edo_ntyrant_spec.rb +0 -299
- data/vendor/rufus-tokyo/spec/edo_ntyrant_table_spec.rb +0 -462
- data/vendor/rufus-tokyo/spec/edo_table_spec.rb +0 -560
- data/vendor/rufus-tokyo/spec/hmethods_spec.rb +0 -44
- data/vendor/rufus-tokyo/spec/incr.lua +0 -20
- data/vendor/rufus-tokyo/spec/spec.rb +0 -9
- data/vendor/rufus-tokyo/spec/spec_base.rb +0 -23
- data/vendor/rufus-tokyo/spec/start_tyrants.sh +0 -26
- data/vendor/rufus-tokyo/spec/stop_tyrants.sh +0 -9
- data/vendor/rufus-tokyo/spec/table_spec.rb +0 -567
- data/vendor/rufus-tokyo/spec/tyrant_spec.rb +0 -309
- data/vendor/rufus-tokyo/spec/tyrant_table_spec.rb +0 -479
- data/vendor/rufus-tokyo/spec/util_list_spec.rb +0 -200
- data/vendor/rufus-tokyo/spec/util_map_spec.rb +0 -132
- data/vendor/rufus-tokyo/tasks/dev.rb +0 -70
- data/vendor/rufus-tokyo/test/bm0.rb +0 -353
- data/vendor/rufus-tokyo/test/bm1_compression.rb +0 -54
- data/vendor/rufus-tokyo/test/con0.rb +0 -30
- data/vendor/rufus-tokyo/test/mem.rb +0 -49
- data/vendor/rufus-tokyo/test/mem1.rb +0 -44
- data/vendor/rufus-tokyo/test/readme0.rb +0 -17
- data/vendor/rufus-tokyo/test/readme1.rb +0 -21
- data/vendor/rufus-tokyo/test/readme2.rb +0 -15
- data/vendor/rufus-tokyo/test/readme3.rb +0 -24
- data/vendor/rufus-tokyo/test/readmes_test.sh +0 -17
@@ -0,0 +1,14 @@
|
|
1
|
+
<h1>Goals</h1>
|
2
|
+
<ul id="goals">
|
3
|
+
<% @goals.each do |goal| %>
|
4
|
+
<li class="goal"><%= goal.name %>: <%= goal.visits %> visits</li>
|
5
|
+
<% end %>
|
6
|
+
</ul>
|
7
|
+
<p><a href="<%= url "/goals/new" %>">New Goal</a></p>
|
8
|
+
|
9
|
+
<h1>Recent Visitors</h1>
|
10
|
+
<ul>
|
11
|
+
<% @visitors.each do |v| %>
|
12
|
+
<li><a href="<%= url "/visitor/#{v.id}" %>">Visitor <%= v.id %></a> (<%= v.events.size %> events)</li>
|
13
|
+
<% end %>
|
14
|
+
</ul>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<h1>New Goal</h1>
|
2
|
+
|
3
|
+
<form action="<%= url "/goals" %>" method="POST">
|
4
|
+
<fieldset>
|
5
|
+
<p><label for="name">Name</label><input type="text" name="name" /></p>
|
6
|
+
<p><label for="path">Path</label><input type="text" name="path" /></p>
|
7
|
+
<p><input type="submit" value="Create" /></p>
|
8
|
+
</fieldset>
|
9
|
+
</form>
|
data/lib/metry/rack/tracking.rb
CHANGED
@@ -10,40 +10,44 @@ module Metry
|
|
10
10
|
|
11
11
|
def call(env)
|
12
12
|
request = ::Rack::Request.new(env)
|
13
|
-
visitor =
|
14
|
-
env["metry.
|
13
|
+
visitor = find_or_create_visitor(request)
|
14
|
+
env["metry.visitor"] = visitor
|
15
|
+
env["metry.event"] = event = build_event(request)
|
15
16
|
|
16
17
|
status, headers, body = @app.call(env)
|
17
18
|
|
18
|
-
event["status"] = status.to_s
|
19
|
-
@storage << event
|
20
|
-
|
21
19
|
response = ::Rack::Response.new(body, status, headers)
|
20
|
+
|
22
21
|
save_visitor(response, visitor)
|
23
22
|
|
23
|
+
unless env["metry.ignore"] == "true"
|
24
|
+
event["status"] = status.to_s
|
25
|
+
event["visitor"] = visitor['_id']
|
26
|
+
@storage.add_event(event)
|
27
|
+
end
|
28
|
+
|
24
29
|
response.to_a
|
25
30
|
end
|
26
31
|
|
27
|
-
def build_event(
|
32
|
+
def build_event(request)
|
28
33
|
{ "event" => "pageview",
|
29
34
|
"path" => request.fullpath,
|
30
|
-
"time" => Time.now.to_f
|
31
|
-
"visitor" => visitor,
|
35
|
+
"time" => Time.now.to_f,
|
32
36
|
"ip" => request.ip,
|
33
37
|
"host" => request.host,
|
34
38
|
"method" => request.request_method,
|
35
|
-
"referrer" => env["HTTP_REFERER"],
|
36
|
-
"user_agent" => env["HTTP_USER_AGENT"] }
|
39
|
+
"referrer" => request.env["HTTP_REFERER"],
|
40
|
+
"user_agent" => request.env["HTTP_USER_AGENT"] }
|
37
41
|
end
|
38
42
|
|
39
|
-
def
|
40
|
-
(request.cookies[COOKIE] || @storage.
|
43
|
+
def find_or_create_visitor(request)
|
44
|
+
@storage.visitor(request.cookies[COOKIE]) || @storage.new_visitor
|
41
45
|
end
|
42
46
|
|
43
47
|
def save_visitor(response, visitor)
|
44
48
|
@storage.save_visitor(visitor)
|
45
49
|
response.set_cookie(COOKIE,
|
46
|
-
:value => visitor,
|
50
|
+
:value => visitor['_id'],
|
47
51
|
:expires => (Time.now+(60*60*24*365*20)),
|
48
52
|
:path => '/')
|
49
53
|
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'mongo'
|
2
|
+
|
3
|
+
module Metry
|
4
|
+
class Storage
|
5
|
+
include XGen::Mongo::Driver
|
6
|
+
|
7
|
+
@predictable_keys = false
|
8
|
+
class << self
|
9
|
+
def predictable_keys?
|
10
|
+
@predictable_keys
|
11
|
+
end
|
12
|
+
|
13
|
+
def predictable_keys=(value)
|
14
|
+
@predictable_keys = value
|
15
|
+
Metry.init Metry.current.dbname if Metry.current
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :dbname
|
20
|
+
|
21
|
+
def initialize(dbname)
|
22
|
+
@dbname = dbname
|
23
|
+
options = {}
|
24
|
+
@key_factory = nil
|
25
|
+
if self.class.predictable_keys?
|
26
|
+
@key_factory = PredictableKeyFactory.new
|
27
|
+
options[:pk] = @key_factory
|
28
|
+
end
|
29
|
+
@db = Mongo.new('localhost').db(dbname, options)
|
30
|
+
end
|
31
|
+
|
32
|
+
def visitor(id)
|
33
|
+
@db.collection('visitors').find(:_id => id).next_object
|
34
|
+
end
|
35
|
+
|
36
|
+
def visitor_count
|
37
|
+
@db.collection('visitors').count
|
38
|
+
end
|
39
|
+
|
40
|
+
def visitors
|
41
|
+
@db.collection('visitors').find
|
42
|
+
end
|
43
|
+
|
44
|
+
def new_visitor
|
45
|
+
visitor(@db.collection('visitors').insert({}))
|
46
|
+
end
|
47
|
+
|
48
|
+
def save_visitor(visitor)
|
49
|
+
@db.collection('visitors').repsert({:_id => visitor["_id"]}, visitor)
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_event(event)
|
53
|
+
@db.collection('events') << event
|
54
|
+
end
|
55
|
+
|
56
|
+
def event(id)
|
57
|
+
@db.collection('events').find(:_id => id).next_object
|
58
|
+
end
|
59
|
+
|
60
|
+
def event_count
|
61
|
+
@db.collection('events').count
|
62
|
+
end
|
63
|
+
|
64
|
+
def events_for(visitor)
|
65
|
+
@db.collection('events').find(:visitor => visitor)
|
66
|
+
end
|
67
|
+
|
68
|
+
def last_events(count=1)
|
69
|
+
@db.collection('events').find({}, :limit => count, :sort => {:time => 1}).to_a
|
70
|
+
end
|
71
|
+
|
72
|
+
def all_events(*find_options)
|
73
|
+
@db.collection('events').find(*find_options).to_a
|
74
|
+
end
|
75
|
+
|
76
|
+
def add_goal(goal)
|
77
|
+
@db.collection('goals') << goal
|
78
|
+
end
|
79
|
+
|
80
|
+
def goals
|
81
|
+
@db.collection('goals').find.to_a
|
82
|
+
end
|
83
|
+
|
84
|
+
def clear
|
85
|
+
%w(visitors events goals).each{|e| @db.drop_collection(e)}
|
86
|
+
@key_factory.clear if @key_factory
|
87
|
+
end
|
88
|
+
|
89
|
+
class PredictableKeyFactory
|
90
|
+
def initialize
|
91
|
+
clear
|
92
|
+
end
|
93
|
+
|
94
|
+
def create_pk(row)
|
95
|
+
return row if row[:_id]
|
96
|
+
row.delete(:_id) # in case it exists but the value is nil
|
97
|
+
row['_id'] ||= id_for(row).to_s
|
98
|
+
row
|
99
|
+
end
|
100
|
+
|
101
|
+
def id_for(row)
|
102
|
+
if row["event"]
|
103
|
+
@ids[:event] += 1
|
104
|
+
elsif row["name"] && row["path"]
|
105
|
+
@ids[:goal] += 1
|
106
|
+
else
|
107
|
+
@ids[:visitor] += 1
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def clear
|
112
|
+
@ids = {:event => 0, :goal => 0, :visitor => 0}
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -52,24 +52,24 @@ Feature: Radiant support
|
|
52
52
|
Then there should be a tracking event "1":
|
53
53
|
| key | value |
|
54
54
|
| visitor | 1 |
|
55
|
-
| experiment
|
55
|
+
| experiment:header | control |
|
56
56
|
Then there should be a tracking event "2":
|
57
57
|
| key | value |
|
58
58
|
| visitor | 2 |
|
59
|
-
| experiment
|
59
|
+
| experiment:header | grumpy |
|
60
60
|
Then there should be a tracking event "3":
|
61
61
|
| key | value |
|
62
62
|
| visitor | 3 |
|
63
|
-
| experiment
|
63
|
+
| experiment:header | dopey |
|
64
64
|
Then there should be a visitor "1":
|
65
65
|
| key | value |
|
66
|
-
| experiment
|
66
|
+
| experiment:header | control |
|
67
67
|
Then there should be a visitor "2":
|
68
68
|
| key | value |
|
69
|
-
| experiment
|
69
|
+
| experiment:header | grumpy |
|
70
70
|
Then there should be a visitor "3":
|
71
71
|
| key | value |
|
72
|
-
| experiment
|
72
|
+
| experiment:header | dopey |
|
73
73
|
|
74
74
|
Scenario: Multiple access by same visitor should give same result
|
75
75
|
Given a page at "/" containing:
|
@@ -106,10 +106,10 @@ Feature: Radiant support
|
|
106
106
|
When I view "/" 2 times
|
107
107
|
Then there should be a tracking event "1":
|
108
108
|
| key | value |
|
109
|
-
| experiment
|
109
|
+
| experiment:cached | control |
|
110
110
|
Then there should be a tracking event "2":
|
111
111
|
| key | value |
|
112
|
-
| experiment
|
112
|
+
| experiment:cached | control |
|
113
113
|
|
114
114
|
Scenario: rand method should give reasonable experiment distribution
|
115
115
|
Given a page at "/" containing:
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Feature: Psycho
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I log in as an admin
|
5
|
+
|
6
|
+
Scenario: Is Available
|
7
|
+
When I view "/admin/metry"
|
8
|
+
Then I should see "Visitors"
|
9
|
+
|
10
|
+
Scenario: Requires login
|
11
|
+
When I log out
|
12
|
+
And I view "/admin/metry"
|
13
|
+
Then I should be on "/admin/login"
|
@@ -7,6 +7,6 @@ end
|
|
7
7
|
|
8
8
|
Then /^at least (\d+) should see alternative "([^\"]*)" of experiment "([^\"]*)"$/ do |count, alternative, experiment|
|
9
9
|
events = Metry.current.all_events
|
10
|
-
matching_count = events.select{|e| e["experiment
|
11
|
-
assert matching_count > count.to_i
|
10
|
+
matching_count = events.select{|e| e["experiment:#{experiment}"] == alternative}.size
|
11
|
+
assert matching_count > count.to_i, "#{matching_count} is not great than #{count}"
|
12
12
|
end
|
@@ -11,7 +11,7 @@ Then /^there should be (\d+) visitors$/ do |visitor_count|
|
|
11
11
|
end
|
12
12
|
|
13
13
|
When /^there should be a tracking event "(\d+)":$/ do |id, table|
|
14
|
-
event = Metry.current
|
14
|
+
event = Metry.current.event(id)
|
15
15
|
assert event, "Unable to lookup event #{id}."
|
16
16
|
table.hashes.each do |hash|
|
17
17
|
expected = hash["value"]
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class MetryAuthenticator
|
2
|
+
include ActionController::UrlWriter
|
3
|
+
|
4
|
+
def initialize(env)
|
5
|
+
extend LoginSystem
|
6
|
+
@env = env
|
7
|
+
@request = Rack::Request.new(env)
|
8
|
+
def @request.format
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :request
|
14
|
+
|
15
|
+
def cookies
|
16
|
+
request.cookies
|
17
|
+
end
|
18
|
+
|
19
|
+
def session
|
20
|
+
@env["rack.session"]
|
21
|
+
end
|
22
|
+
|
23
|
+
def authorized?
|
24
|
+
(current_user && current_user.admin?)
|
25
|
+
end
|
26
|
+
|
27
|
+
def redirect
|
28
|
+
[302, {"Location" => login_path}, ""]
|
29
|
+
end
|
30
|
+
end
|
@@ -6,6 +6,7 @@ module MetryTags
|
|
6
6
|
tag.globals.page.metry_active = true
|
7
7
|
tag.locals.alternatives = {}
|
8
8
|
tag.locals.event = tag.globals.page.request.env["metry.event"]
|
9
|
+
tag.locals.visitor = tag.globals.page.request.env["metry.visitor"]
|
9
10
|
tag.expand
|
10
11
|
end
|
11
12
|
|
@@ -13,7 +14,7 @@ module MetryTags
|
|
13
14
|
tag "metry:experiment" do |tag|
|
14
15
|
control = tag.expand
|
15
16
|
options = tag.locals.alternatives.merge("control" => control)
|
16
|
-
Metry::Experiment.new(tag.attr["name"], tag.locals.event).choose(options, tag.attr["method"])
|
17
|
+
Metry::Experiment.new(tag.attr["name"], tag.locals.event, tag.locals.visitor).choose(options, tag.attr["method"])
|
17
18
|
end
|
18
19
|
|
19
20
|
desc %{ Alternatives go in here with a name. }
|
@@ -25,7 +25,7 @@ class MetryExtension < Radiant::Extension
|
|
25
25
|
alias_method_chain :cache?, :metry
|
26
26
|
end
|
27
27
|
|
28
|
-
Metry.init
|
28
|
+
Metry.init 'radiant-tracking'
|
29
29
|
Rails.configuration.middleware.insert_after ActionController::Failsafe, Metry::Rack::Tracking
|
30
30
|
Rails.configuration.middleware.use proc{Metry::Psycho}, {
|
31
31
|
:path => "/admin/metry",
|
@@ -3,12 +3,12 @@ require File.dirname(__FILE__) + '/shared'
|
|
3
3
|
class TestTokyo < Test::Unit::TestCase
|
4
4
|
context "An empty database" do
|
5
5
|
setup do
|
6
|
-
@
|
7
|
-
@
|
6
|
+
@storage = Metry::Storage.new('test')
|
7
|
+
@storage.clear
|
8
8
|
end
|
9
9
|
|
10
10
|
should "be empty" do
|
11
|
-
assert_equal 0, @
|
11
|
+
assert_equal 0, @storage.event_count
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathaniel Talbott
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-08-08 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -40,18 +40,27 @@ files:
|
|
40
40
|
- README.txt
|
41
41
|
- Rakefile
|
42
42
|
- TODO
|
43
|
+
- cucumber.yml
|
43
44
|
- example/example.rb
|
44
45
|
- features/app_tracking.feature
|
45
46
|
- features/basic_tracking.feature
|
47
|
+
- features/psycho/dashboard.feature
|
48
|
+
- features/psycho/goals.feature
|
49
|
+
- features/psycho/visitor_tracking.feature
|
46
50
|
- features/sample_application.feature
|
51
|
+
- features/step_definitions/goals.rb
|
47
52
|
- features/step_definitions/tracking.rb
|
48
53
|
- features/step_definitions/web.rb
|
49
54
|
- features/support/env.rb
|
50
55
|
- lib/metry.rb
|
51
56
|
- lib/metry/experiment.rb
|
52
|
-
- lib/metry/
|
57
|
+
- lib/metry/psycho.rb
|
58
|
+
- lib/metry/psycho/dashboard.erb
|
59
|
+
- lib/metry/psycho/layout.erb
|
60
|
+
- lib/metry/psycho/new_goal.erb
|
61
|
+
- lib/metry/psycho/visitor.erb
|
53
62
|
- lib/metry/rack/tracking.rb
|
54
|
-
- lib/metry/
|
63
|
+
- lib/metry/storage.rb
|
55
64
|
- radiant/example/CHANGELOG
|
56
65
|
- radiant/example/CONTRIBUTORS
|
57
66
|
- radiant/example/INSTALL
|
@@ -68,6 +77,7 @@ files:
|
|
68
77
|
- radiant/example/config/routes.rb
|
69
78
|
- radiant/example/db/schema.rb
|
70
79
|
- radiant/example/features/metry.feature
|
80
|
+
- radiant/example/features/psycho.feature
|
71
81
|
- radiant/example/features/step_definitions/experiments.rb
|
72
82
|
- radiant/example/features/step_definitions/radiant.rb
|
73
83
|
- radiant/example/features/step_definitions/tracking.rb
|
@@ -134,77 +144,12 @@ files:
|
|
134
144
|
- radiant/example/script/version
|
135
145
|
- radiant/extension/README
|
136
146
|
- radiant/extension/Rakefile
|
147
|
+
- radiant/extension/lib/metry_authenticator.rb
|
137
148
|
- radiant/extension/lib/metry_tags.rb
|
138
149
|
- radiant/extension/lib/tasks/metry_extension_tasks.rake
|
139
150
|
- radiant/extension/metry_extension.rb
|
140
151
|
- test/shared.rb
|
141
|
-
- test/
|
142
|
-
- vendor/rufus-tokyo/CHANGELOG.txt
|
143
|
-
- vendor/rufus-tokyo/CREDITS.txt
|
144
|
-
- vendor/rufus-tokyo/LICENSE.txt
|
145
|
-
- vendor/rufus-tokyo/README.txt
|
146
|
-
- vendor/rufus-tokyo/Rakefile
|
147
|
-
- vendor/rufus-tokyo/TODO.txt
|
148
|
-
- vendor/rufus-tokyo/doc/decision_table.numbers
|
149
|
-
- vendor/rufus-tokyo/doc/rdoc-style.css
|
150
|
-
- vendor/rufus-tokyo/lib/rufus-edo.rb
|
151
|
-
- vendor/rufus-tokyo/lib/rufus-tokyo.rb
|
152
|
-
- vendor/rufus-tokyo/lib/rufus/edo.rb
|
153
|
-
- vendor/rufus-tokyo/lib/rufus/edo/README.txt
|
154
|
-
- vendor/rufus-tokyo/lib/rufus/edo/cabcore.rb
|
155
|
-
- vendor/rufus-tokyo/lib/rufus/edo/cabinet/abstract.rb
|
156
|
-
- vendor/rufus-tokyo/lib/rufus/edo/cabinet/table.rb
|
157
|
-
- vendor/rufus-tokyo/lib/rufus/edo/error.rb
|
158
|
-
- vendor/rufus-tokyo/lib/rufus/edo/ntyrant.rb
|
159
|
-
- vendor/rufus-tokyo/lib/rufus/edo/ntyrant/abstract.rb
|
160
|
-
- vendor/rufus-tokyo/lib/rufus/edo/ntyrant/table.rb
|
161
|
-
- vendor/rufus-tokyo/lib/rufus/edo/tabcore.rb
|
162
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo.rb
|
163
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/abstract.rb
|
164
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/lib.rb
|
165
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/table.rb
|
166
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/util.rb
|
167
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/config.rb
|
168
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/dystopia.rb
|
169
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/lib.rb
|
170
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/words.rb
|
171
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/hmethods.rb
|
172
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/query.rb
|
173
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/transactions.rb
|
174
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/ttcommons.rb
|
175
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/tyrant.rb
|
176
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/abstract.rb
|
177
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/lib.rb
|
178
|
-
- vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/table.rb
|
179
|
-
- vendor/rufus-tokyo/rufus-tokyo.gemspec
|
180
|
-
- vendor/rufus-tokyo/spec/cabinet_spec.rb
|
181
|
-
- vendor/rufus-tokyo/spec/cabinetconfig_spec.rb
|
182
|
-
- vendor/rufus-tokyo/spec/edo_cabinet_spec.rb
|
183
|
-
- vendor/rufus-tokyo/spec/edo_ntyrant_spec.rb
|
184
|
-
- vendor/rufus-tokyo/spec/edo_ntyrant_table_spec.rb
|
185
|
-
- vendor/rufus-tokyo/spec/edo_table_spec.rb
|
186
|
-
- vendor/rufus-tokyo/spec/hmethods_spec.rb
|
187
|
-
- vendor/rufus-tokyo/spec/incr.lua
|
188
|
-
- vendor/rufus-tokyo/spec/spec.rb
|
189
|
-
- vendor/rufus-tokyo/spec/spec_base.rb
|
190
|
-
- vendor/rufus-tokyo/spec/start_tyrants.sh
|
191
|
-
- vendor/rufus-tokyo/spec/stop_tyrants.sh
|
192
|
-
- vendor/rufus-tokyo/spec/table_spec.rb
|
193
|
-
- vendor/rufus-tokyo/spec/tyrant_spec.rb
|
194
|
-
- vendor/rufus-tokyo/spec/tyrant_table_spec.rb
|
195
|
-
- vendor/rufus-tokyo/spec/util_list_spec.rb
|
196
|
-
- vendor/rufus-tokyo/spec/util_map_spec.rb
|
197
|
-
- vendor/rufus-tokyo/tasks/dev.rb
|
198
|
-
- vendor/rufus-tokyo/test/bm0.rb
|
199
|
-
- vendor/rufus-tokyo/test/bm1_compression.rb
|
200
|
-
- vendor/rufus-tokyo/test/con0.rb
|
201
|
-
- vendor/rufus-tokyo/test/mem.rb
|
202
|
-
- vendor/rufus-tokyo/test/mem1.rb
|
203
|
-
- vendor/rufus-tokyo/test/readme0.rb
|
204
|
-
- vendor/rufus-tokyo/test/readme1.rb
|
205
|
-
- vendor/rufus-tokyo/test/readme2.rb
|
206
|
-
- vendor/rufus-tokyo/test/readme3.rb
|
207
|
-
- vendor/rufus-tokyo/test/readmes_test.sh
|
152
|
+
- test/test_storage.rb
|
208
153
|
- vendor/webrat/.document
|
209
154
|
- vendor/webrat/History.txt
|
210
155
|
- vendor/webrat/MIT-LICENSE.txt
|
@@ -438,4 +383,4 @@ signing_key:
|
|
438
383
|
specification_version: 2
|
439
384
|
summary: Metry aims to close the gap between knowing you ought to be making decisions based on hard data about how visitors are using your site, and actually doing it
|
440
385
|
test_files:
|
441
|
-
- test/
|
386
|
+
- test/test_storage.rb
|