metry 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/History.txt +6 -0
  2. data/Manifest.txt +14 -69
  3. data/TODO +2 -3
  4. data/cucumber.yml +1 -0
  5. data/example/example.rb +1 -1
  6. data/features/psycho/dashboard.feature +17 -0
  7. data/features/psycho/goals.feature +24 -0
  8. data/features/psycho/visitor_tracking.feature +32 -0
  9. data/features/step_definitions/goals.rb +3 -0
  10. data/features/step_definitions/tracking.rb +1 -1
  11. data/features/step_definitions/web.rb +14 -2
  12. data/features/support/env.rb +4 -0
  13. data/lib/metry.rb +4 -6
  14. data/lib/metry/experiment.rb +6 -8
  15. data/lib/metry/psycho.rb +112 -0
  16. data/lib/metry/psycho/dashboard.erb +14 -0
  17. data/lib/metry/psycho/layout.erb +8 -0
  18. data/lib/metry/psycho/new_goal.erb +9 -0
  19. data/lib/metry/psycho/visitor.erb +7 -0
  20. data/lib/metry/rack/tracking.rb +17 -13
  21. data/lib/metry/storage.rb +116 -0
  22. data/radiant/example/features/metry.feature +8 -8
  23. data/radiant/example/features/psycho.feature +13 -0
  24. data/radiant/example/features/step_definitions/experiments.rb +2 -2
  25. data/radiant/example/features/step_definitions/tracking.rb +1 -1
  26. data/radiant/example/features/support/env.rb +3 -0
  27. data/radiant/extension/lib/metry_authenticator.rb +30 -0
  28. data/radiant/extension/lib/metry_tags.rb +2 -1
  29. data/radiant/extension/metry_extension.rb +1 -1
  30. data/test/{test_tokyo.rb → test_storage.rb} +3 -3
  31. metadata +17 -72
  32. data/lib/metry/memory.rb +0 -27
  33. data/lib/metry/tokyo.rb +0 -181
  34. data/vendor/rufus-tokyo/CHANGELOG.txt +0 -112
  35. data/vendor/rufus-tokyo/CREDITS.txt +0 -27
  36. data/vendor/rufus-tokyo/LICENSE.txt +0 -21
  37. data/vendor/rufus-tokyo/README.txt +0 -310
  38. data/vendor/rufus-tokyo/Rakefile +0 -118
  39. data/vendor/rufus-tokyo/TODO.txt +0 -25
  40. data/vendor/rufus-tokyo/doc/decision_table.numbers +0 -0
  41. data/vendor/rufus-tokyo/doc/rdoc-style.css +0 -320
  42. data/vendor/rufus-tokyo/lib/rufus-edo.rb +0 -3
  43. data/vendor/rufus-tokyo/lib/rufus-tokyo.rb +0 -3
  44. data/vendor/rufus-tokyo/lib/rufus/edo.rb +0 -39
  45. data/vendor/rufus-tokyo/lib/rufus/edo/README.txt +0 -106
  46. data/vendor/rufus-tokyo/lib/rufus/edo/cabcore.rb +0 -333
  47. data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/abstract.rb +0 -219
  48. data/vendor/rufus-tokyo/lib/rufus/edo/cabinet/table.rb +0 -159
  49. data/vendor/rufus-tokyo/lib/rufus/edo/error.rb +0 -36
  50. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant.rb +0 -4
  51. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/abstract.rb +0 -137
  52. data/vendor/rufus-tokyo/lib/rufus/edo/ntyrant/table.rb +0 -141
  53. data/vendor/rufus-tokyo/lib/rufus/edo/tabcore.rb +0 -567
  54. data/vendor/rufus-tokyo/lib/rufus/tokyo.rb +0 -58
  55. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/abstract.rb +0 -568
  56. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/lib.rb +0 -230
  57. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/table.rb +0 -753
  58. data/vendor/rufus-tokyo/lib/rufus/tokyo/cabinet/util.rb +0 -425
  59. data/vendor/rufus-tokyo/lib/rufus/tokyo/config.rb +0 -161
  60. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia.rb +0 -43
  61. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/lib.rb +0 -65
  62. data/vendor/rufus-tokyo/lib/rufus/tokyo/dystopia/words.rb +0 -71
  63. data/vendor/rufus-tokyo/lib/rufus/tokyo/hmethods.rb +0 -111
  64. data/vendor/rufus-tokyo/lib/rufus/tokyo/query.rb +0 -102
  65. data/vendor/rufus-tokyo/lib/rufus/tokyo/transactions.rb +0 -74
  66. data/vendor/rufus-tokyo/lib/rufus/tokyo/ttcommons.rb +0 -59
  67. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant.rb +0 -35
  68. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/abstract.rb +0 -146
  69. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/lib.rb +0 -153
  70. data/vendor/rufus-tokyo/lib/rufus/tokyo/tyrant/table.rb +0 -162
  71. data/vendor/rufus-tokyo/rufus-tokyo.gemspec +0 -25
  72. data/vendor/rufus-tokyo/spec/cabinet_spec.rb +0 -472
  73. data/vendor/rufus-tokyo/spec/cabinetconfig_spec.rb +0 -82
  74. data/vendor/rufus-tokyo/spec/edo_cabinet_spec.rb +0 -447
  75. data/vendor/rufus-tokyo/spec/edo_ntyrant_spec.rb +0 -299
  76. data/vendor/rufus-tokyo/spec/edo_ntyrant_table_spec.rb +0 -462
  77. data/vendor/rufus-tokyo/spec/edo_table_spec.rb +0 -560
  78. data/vendor/rufus-tokyo/spec/hmethods_spec.rb +0 -44
  79. data/vendor/rufus-tokyo/spec/incr.lua +0 -20
  80. data/vendor/rufus-tokyo/spec/spec.rb +0 -9
  81. data/vendor/rufus-tokyo/spec/spec_base.rb +0 -23
  82. data/vendor/rufus-tokyo/spec/start_tyrants.sh +0 -26
  83. data/vendor/rufus-tokyo/spec/stop_tyrants.sh +0 -9
  84. data/vendor/rufus-tokyo/spec/table_spec.rb +0 -567
  85. data/vendor/rufus-tokyo/spec/tyrant_spec.rb +0 -309
  86. data/vendor/rufus-tokyo/spec/tyrant_table_spec.rb +0 -479
  87. data/vendor/rufus-tokyo/spec/util_list_spec.rb +0 -200
  88. data/vendor/rufus-tokyo/spec/util_map_spec.rb +0 -132
  89. data/vendor/rufus-tokyo/tasks/dev.rb +0 -70
  90. data/vendor/rufus-tokyo/test/bm0.rb +0 -353
  91. data/vendor/rufus-tokyo/test/bm1_compression.rb +0 -54
  92. data/vendor/rufus-tokyo/test/con0.rb +0 -30
  93. data/vendor/rufus-tokyo/test/mem.rb +0 -49
  94. data/vendor/rufus-tokyo/test/mem1.rb +0 -44
  95. data/vendor/rufus-tokyo/test/readme0.rb +0 -17
  96. data/vendor/rufus-tokyo/test/readme1.rb +0 -21
  97. data/vendor/rufus-tokyo/test/readme2.rb +0 -15
  98. data/vendor/rufus-tokyo/test/readme3.rb +0 -24
  99. 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,8 @@
1
+ <html>
2
+ <head>
3
+ <title>Psycho-Metry</title>
4
+ </head>
5
+ <body>
6
+ <%= yield %>
7
+ </body>
8
+ </html>
@@ -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>
@@ -0,0 +1,7 @@
1
+ <h1>Visitor <%= @visitor.id %></h1>
2
+
3
+ <ol>
4
+ <% @visitor.events.each do |event| %>
5
+ <li><%= event.path %></li>
6
+ <% end %>
7
+ </ol>
@@ -10,40 +10,44 @@ module Metry
10
10
 
11
11
  def call(env)
12
12
  request = ::Rack::Request.new(env)
13
- visitor = find_visitor(request)
14
- env["metry.event"] = event = build_event(visitor, request, env)
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(visitor, request, env)
32
+ def build_event(request)
28
33
  { "event" => "pageview",
29
34
  "path" => request.fullpath,
30
- "time" => Time.now.to_f.to_s.sub(/\.(\d+)/){|m| [$1[0...5].ljust(5, "0")]},
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 find_visitor(request)
40
- (request.cookies[COOKIE] || @storage.next_visitor.to_s)
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.header | control |
55
+ | experiment:header | control |
56
56
  Then there should be a tracking event "2":
57
57
  | key | value |
58
58
  | visitor | 2 |
59
- | experiment.header | grumpy |
59
+ | experiment:header | grumpy |
60
60
  Then there should be a tracking event "3":
61
61
  | key | value |
62
62
  | visitor | 3 |
63
- | experiment.header | dopey |
63
+ | experiment:header | dopey |
64
64
  Then there should be a visitor "1":
65
65
  | key | value |
66
- | experiment.header | control |
66
+ | experiment:header | control |
67
67
  Then there should be a visitor "2":
68
68
  | key | value |
69
- | experiment.header | grumpy |
69
+ | experiment:header | grumpy |
70
70
  Then there should be a visitor "3":
71
71
  | key | value |
72
- | experiment.header | dopey |
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.cached | control |
109
+ | experiment:cached | control |
110
110
  Then there should be a tracking event "2":
111
111
  | key | value |
112
- | experiment.cached | control |
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.#{experiment}"] == alternative}.size
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[id]
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"]
@@ -25,6 +25,9 @@ Webrat.configure do |config|
25
25
  config.mode = :rack_test
26
26
  end
27
27
 
28
+ require 'metry'
29
+ Metry::Storage.predictable_keys = true
30
+
28
31
  def app
29
32
  ActionController::Dispatcher.new
30
33
  end
@@ -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 Metry::Tokyo.new(RAILS_ROOT + '/tracking/tracking')
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
- @tokyo = Metry::Tokyo.new('test')
7
- @tokyo.clear
6
+ @storage = Metry::Storage.new('test')
7
+ @storage.clear
8
8
  end
9
9
 
10
10
  should "be empty" do
11
- assert_equal 0, @tokyo.event_count
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: 1.2.0
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-07-30 00:00:00 -04:00
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/memory.rb
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/tokyo.rb
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/test_tokyo.rb
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/test_tokyo.rb
386
+ - test/test_storage.rb