keen 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. data/.gitignore +9 -0
  2. data/.rvmrc +2 -0
  3. data/Gemfile +5 -0
  4. data/README.md +7 -0
  5. data/bin/keen_send +45 -0
  6. data/conf/cacert.pem +3376 -0
  7. data/examples.rb +26 -0
  8. data/examples/rails_2/.rvmrc +2 -0
  9. data/examples/rails_2/CoolForums/README +243 -0
  10. data/examples/rails_2/CoolForums/Rakefile +10 -0
  11. data/examples/rails_2/CoolForums/app/controllers/application_controller.rb +30 -0
  12. data/examples/rails_2/CoolForums/app/controllers/forums_controller.rb +83 -0
  13. data/examples/rails_2/CoolForums/app/controllers/users_controller.rb +83 -0
  14. data/examples/rails_2/CoolForums/app/helpers/application_helper.rb +3 -0
  15. data/examples/rails_2/CoolForums/app/helpers/forums_helper.rb +2 -0
  16. data/examples/rails_2/CoolForums/app/helpers/users_helper.rb +2 -0
  17. data/examples/rails_2/CoolForums/app/models/forum.rb +2 -0
  18. data/examples/rails_2/CoolForums/app/models/user.rb +2 -0
  19. data/examples/rails_2/CoolForums/app/views/forums/edit.html.erb +16 -0
  20. data/examples/rails_2/CoolForums/app/views/forums/index.html.erb +20 -0
  21. data/examples/rails_2/CoolForums/app/views/forums/new.html.erb +15 -0
  22. data/examples/rails_2/CoolForums/app/views/forums/show.html.erb +8 -0
  23. data/examples/rails_2/CoolForums/app/views/layouts/forums.html.erb +17 -0
  24. data/examples/rails_2/CoolForums/app/views/layouts/users.html.erb +17 -0
  25. data/examples/rails_2/CoolForums/app/views/users/edit.html.erb +20 -0
  26. data/examples/rails_2/CoolForums/app/views/users/index.html.erb +22 -0
  27. data/examples/rails_2/CoolForums/app/views/users/new.html.erb +19 -0
  28. data/examples/rails_2/CoolForums/app/views/users/show.html.erb +13 -0
  29. data/examples/rails_2/CoolForums/config/boot.rb +114 -0
  30. data/examples/rails_2/CoolForums/config/database.yml +22 -0
  31. data/examples/rails_2/CoolForums/config/environment.rb +41 -0
  32. data/examples/rails_2/CoolForums/config/environments/development.rb +17 -0
  33. data/examples/rails_2/CoolForums/config/environments/production.rb +28 -0
  34. data/examples/rails_2/CoolForums/config/environments/test.rb +28 -0
  35. data/examples/rails_2/CoolForums/config/initializers/backtrace_silencers.rb +7 -0
  36. data/examples/rails_2/CoolForums/config/initializers/cookie_verification_secret.rb +7 -0
  37. data/examples/rails_2/CoolForums/config/initializers/inflections.rb +10 -0
  38. data/examples/rails_2/CoolForums/config/initializers/mime_types.rb +5 -0
  39. data/examples/rails_2/CoolForums/config/initializers/new_rails_defaults.rb +21 -0
  40. data/examples/rails_2/CoolForums/config/initializers/session_store.rb +15 -0
  41. data/examples/rails_2/CoolForums/config/locales/en.yml +5 -0
  42. data/examples/rails_2/CoolForums/config/routes.rb +53 -0
  43. data/examples/rails_2/CoolForums/db/migrate/20120317012301_create_users.rb +15 -0
  44. data/examples/rails_2/CoolForums/db/migrate/20120317012444_create_forums.rb +14 -0
  45. data/examples/rails_2/CoolForums/db/schema.rb +28 -0
  46. data/examples/rails_2/CoolForums/db/seeds.rb +7 -0
  47. data/examples/rails_2/CoolForums/doc/README_FOR_APP +2 -0
  48. data/examples/rails_2/CoolForums/public/404.html +30 -0
  49. data/examples/rails_2/CoolForums/public/422.html +30 -0
  50. data/examples/rails_2/CoolForums/public/500.html +30 -0
  51. data/examples/rails_2/CoolForums/public/favicon.ico +0 -0
  52. data/examples/rails_2/CoolForums/public/images/rails.png +0 -0
  53. data/examples/rails_2/CoolForums/public/index.html +275 -0
  54. data/examples/rails_2/CoolForums/public/javascripts/application.js +2 -0
  55. data/examples/rails_2/CoolForums/public/javascripts/controls.js +963 -0
  56. data/examples/rails_2/CoolForums/public/javascripts/dragdrop.js +973 -0
  57. data/examples/rails_2/CoolForums/public/javascripts/effects.js +1128 -0
  58. data/examples/rails_2/CoolForums/public/javascripts/prototype.js +4320 -0
  59. data/examples/rails_2/CoolForums/public/robots.txt +5 -0
  60. data/examples/rails_2/CoolForums/public/stylesheets/scaffold.css +54 -0
  61. data/examples/rails_2/CoolForums/script/about +4 -0
  62. data/examples/rails_2/CoolForums/script/console +3 -0
  63. data/examples/rails_2/CoolForums/script/dbconsole +3 -0
  64. data/examples/rails_2/CoolForums/script/destroy +3 -0
  65. data/examples/rails_2/CoolForums/script/generate +3 -0
  66. data/examples/rails_2/CoolForums/script/performance/benchmarker +3 -0
  67. data/examples/rails_2/CoolForums/script/performance/profiler +3 -0
  68. data/examples/rails_2/CoolForums/script/plugin +3 -0
  69. data/examples/rails_2/CoolForums/script/runner +3 -0
  70. data/examples/rails_2/CoolForums/script/server +3 -0
  71. data/examples/rails_2/CoolForums/test/fixtures/forums.yml +9 -0
  72. data/examples/rails_2/CoolForums/test/fixtures/users.yml +11 -0
  73. data/examples/rails_2/CoolForums/test/functional/forums_controller_test.rb +45 -0
  74. data/examples/rails_2/CoolForums/test/functional/users_controller_test.rb +45 -0
  75. data/examples/rails_2/CoolForums/test/performance/browsing_test.rb +9 -0
  76. data/examples/rails_2/CoolForums/test/test_helper.rb +38 -0
  77. data/examples/rails_2/CoolForums/test/unit/forum_test.rb +8 -0
  78. data/examples/rails_2/CoolForums/test/unit/helpers/forums_helper_test.rb +4 -0
  79. data/examples/rails_2/CoolForums/test/unit/helpers/users_helper_test.rb +4 -0
  80. data/examples/rails_2/CoolForums/test/unit/user_test.rb +8 -0
  81. data/examples/rails_2/Gemfile +4 -0
  82. data/keen.gemspec +37 -0
  83. data/lib/keen.rb +3 -0
  84. data/lib/keen/client.rb +123 -0
  85. data/lib/keen/storage/flat_file_handler.rb +55 -0
  86. data/lib/keen/storage/redis_handler.rb +155 -0
  87. data/lib/keen/version.rb +3 -0
  88. data/test/keen_spec.rb +26 -0
  89. metadata +234 -0
@@ -0,0 +1,55 @@
1
+ require 'fileutils'
2
+ require 'base64'
3
+ require 'zlib'
4
+
5
+
6
+
7
+ module Keen
8
+ module Storage
9
+ class FlatFileHandler
10
+
11
+ # Paths
12
+ # -----
13
+
14
+ # Where new events go as they come in:
15
+ ACTIVE = "active.txt"
16
+
17
+ # The temporary file that will store records during processing:
18
+ PROCESSING = "processing.txt"
19
+
20
+ # Records are put here if processing fails:
21
+ FAILED = "failed.txt"
22
+
23
+ def initialize(filepath)
24
+ @filepath = filepath
25
+
26
+ is_directory?
27
+ is_writable?
28
+ is_readable?
29
+ end
30
+
31
+ def dump_contents
32
+ # move
33
+ end
34
+
35
+ def is_writable?
36
+ if not FileTest.writable? @filepath
37
+ raise "Can't write to file: " + @filepath
38
+ end
39
+ end
40
+
41
+ def is_readable?
42
+ if not FileTest.readable? @filepath
43
+ raise "Can't read from file: " + @filepath
44
+ end
45
+ end
46
+
47
+ def is_directory?
48
+ if not FileTest.directory? @filepath
49
+ raise "Can't read from file: " + @filepath
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,155 @@
1
+ require 'fileutils'
2
+ require 'redis'
3
+ require 'json'
4
+
5
+ module Keen
6
+ module Storage
7
+ class Item
8
+ # Represents one item in the Redis queue.
9
+
10
+ def to_json(options)
11
+ @event_body.to_json
12
+ end
13
+
14
+ def to_s
15
+ self.to_json
16
+ end
17
+
18
+ def auth_token
19
+ @auth_token
20
+ end
21
+
22
+ def initialize(definition={})
23
+ @project_id = definition[:project_id]
24
+ @auth_token = definition[:auth_token]
25
+ @collection_name = definition[:collection_name]
26
+ @event_body = definition[:event_body]
27
+
28
+ # TODO: type checking?
29
+ end
30
+
31
+ def save
32
+ handler = Keen::Storage::RedisHandler.new
33
+ handler.add_event(self)
34
+ end
35
+
36
+ end
37
+
38
+ class ProjectBatch
39
+ # Represents a batch of records (for a given project)
40
+ def initialize(project_id, auth_token)
41
+ @project_id = project_id
42
+ @auth_token = auth_token
43
+ @items = []
44
+ end
45
+
46
+ def add_item(item)
47
+ @items.push(item)
48
+ end
49
+ end
50
+
51
+ class RedisHandler
52
+
53
+ # Keys
54
+ # ----
55
+
56
+ def global_key_prefix
57
+ "keen-" + Keen::VERSION
58
+ end
59
+
60
+ def active_queue_key
61
+ "#{global_key_prefix}.active_queue_key"
62
+ end
63
+
64
+ def processing_queue_key
65
+ "#{global_key_prefix}.processing_queue_key"
66
+ end
67
+
68
+ def failed_queue_key
69
+ "#{global_key_prefix}.failed_queue_key"
70
+ end
71
+
72
+ def lock_active_queue_key
73
+ "lock" + active_queue_key
74
+ end
75
+
76
+ def lock_active_queue
77
+ # TODO: add locking
78
+ key = lock_active_queue_key
79
+ end
80
+
81
+ def unlock_active_queue
82
+ # TODO: add locking
83
+ key = lock_active_queue_key
84
+ end
85
+
86
+ def record_event(collection_name, event_body)
87
+ # TODO this is the main public method!
88
+ # must write..
89
+ end
90
+
91
+ def handle_prior_failures
92
+ # TODO consume the failed_queue and do something with it (loggly? retry? flat file?)
93
+ end
94
+
95
+ def initialize
96
+ @redis = Redis.new
97
+ end
98
+
99
+ def get_active_queue_contents
100
+ # get the list of jsonified hashes back:
101
+ list = @redis.get active_queue_key
102
+
103
+ if not list
104
+ []
105
+ end
106
+ end
107
+
108
+ def flush_active_queue
109
+ @redis.del active_queue_key
110
+ end
111
+
112
+ def set_processing_queue(queue)
113
+ end
114
+
115
+ def process_queue
116
+ handle_prior_failures
117
+
118
+ lock_active_queue
119
+
120
+ queue = get_active_queue_contents
121
+
122
+ flush_active_queue
123
+
124
+ set_processing_queue(queue)
125
+
126
+ unlock_active_queue
127
+
128
+ # translate the queue strings into Items
129
+ items = queue.map {|json| Keen::Storage::Item.new(JSON.parse json)}.compact
130
+
131
+ collated = collate_items(items)
132
+ end
133
+
134
+ def collate_items(queue)
135
+ collated = {}
136
+
137
+ # traverse backwards so the most recent auth tokens take precedent:
138
+ queue.reverse_each do |item_hash|
139
+ if not collated.has_key? item.project_id
140
+ collated[item.project_id] = {}
141
+ end
142
+
143
+ if not collated[item.project_id].has_key? item.collection_name
144
+ collated[item.project_id][item.collection_name] = Keen::Storage::ProjectBatch.new
145
+ end
146
+
147
+ collated[item.project_id][item.collection_name].add_item(item)
148
+ end
149
+
150
+ collated
151
+ end
152
+
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,3 @@
1
+ module Keen
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,26 @@
1
+ $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
2
+
3
+ require 'keen'
4
+ require 'fakeweb'
5
+
6
+ describe Keen::Client do
7
+
8
+ # Make it so that we don't actually hit keen server during tests:
9
+ before :all do
10
+ FakeWeb.register_uri(:any, %r/https:\/\/api.keen.io\//, :body => '{"message": "You tried to reach Keen"}')
11
+ end
12
+
13
+ # TODO spec it out, lazy bones!
14
+ #
15
+ #
16
+ # Each time an event is logged, we'll store a json-serialized, base64-
17
+ # encoded, and gzipped hash that loos like this:
18
+ #
19
+ # {
20
+ # :project_id => "alsdjfaldskfjadskladsklj",
21
+ # :auth_token => "aslkjflk3wjfaklsjdflkasdjflkadjflakdj211",
22
+ # :collection_name => "purchases",
23
+ # :event_body => {:prop1 => "val1", :prop2 => "val2"},
24
+ # }
25
+
26
+ end
metadata ADDED
@@ -0,0 +1,234 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: keen
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Kyle Wild
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-03-16 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: multi_json
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 17
30
+ segments:
31
+ - 1
32
+ - 0
33
+ - 3
34
+ version: 1.0.3
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ name: fakeweb
39
+ prerelease: false
40
+ requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 27
46
+ segments:
47
+ - 1
48
+ - 3
49
+ - 0
50
+ version: 1.3.0
51
+ type: :runtime
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: system_timer
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 23
62
+ segments:
63
+ - 1
64
+ - 2
65
+ - 4
66
+ version: 1.2.4
67
+ type: :runtime
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: httparty
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ hash: 61
78
+ segments:
79
+ - 0
80
+ - 8
81
+ - 1
82
+ version: 0.8.1
83
+ type: :runtime
84
+ version_requirements: *id004
85
+ - !ruby/object:Gem::Dependency
86
+ name: redis
87
+ prerelease: false
88
+ requirement: &id005 !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ hash: 3
94
+ segments:
95
+ - 2
96
+ - 2
97
+ - 2
98
+ version: 2.2.2
99
+ type: :runtime
100
+ version_requirements: *id005
101
+ description: See the github repo or examples.rb for usage information.
102
+ email:
103
+ - kyle@keen.io
104
+ executables:
105
+ - keen_send
106
+ extensions: []
107
+
108
+ extra_rdoc_files: []
109
+
110
+ files:
111
+ - .gitignore
112
+ - .rvmrc
113
+ - Gemfile
114
+ - README.md
115
+ - bin/keen_send
116
+ - conf/cacert.pem
117
+ - examples.rb
118
+ - examples/rails_2/.rvmrc
119
+ - examples/rails_2/CoolForums/README
120
+ - examples/rails_2/CoolForums/Rakefile
121
+ - examples/rails_2/CoolForums/app/controllers/application_controller.rb
122
+ - examples/rails_2/CoolForums/app/controllers/forums_controller.rb
123
+ - examples/rails_2/CoolForums/app/controllers/users_controller.rb
124
+ - examples/rails_2/CoolForums/app/helpers/application_helper.rb
125
+ - examples/rails_2/CoolForums/app/helpers/forums_helper.rb
126
+ - examples/rails_2/CoolForums/app/helpers/users_helper.rb
127
+ - examples/rails_2/CoolForums/app/models/forum.rb
128
+ - examples/rails_2/CoolForums/app/models/user.rb
129
+ - examples/rails_2/CoolForums/app/views/forums/edit.html.erb
130
+ - examples/rails_2/CoolForums/app/views/forums/index.html.erb
131
+ - examples/rails_2/CoolForums/app/views/forums/new.html.erb
132
+ - examples/rails_2/CoolForums/app/views/forums/show.html.erb
133
+ - examples/rails_2/CoolForums/app/views/layouts/forums.html.erb
134
+ - examples/rails_2/CoolForums/app/views/layouts/users.html.erb
135
+ - examples/rails_2/CoolForums/app/views/users/edit.html.erb
136
+ - examples/rails_2/CoolForums/app/views/users/index.html.erb
137
+ - examples/rails_2/CoolForums/app/views/users/new.html.erb
138
+ - examples/rails_2/CoolForums/app/views/users/show.html.erb
139
+ - examples/rails_2/CoolForums/config/boot.rb
140
+ - examples/rails_2/CoolForums/config/database.yml
141
+ - examples/rails_2/CoolForums/config/environment.rb
142
+ - examples/rails_2/CoolForums/config/environments/development.rb
143
+ - examples/rails_2/CoolForums/config/environments/production.rb
144
+ - examples/rails_2/CoolForums/config/environments/test.rb
145
+ - examples/rails_2/CoolForums/config/initializers/backtrace_silencers.rb
146
+ - examples/rails_2/CoolForums/config/initializers/cookie_verification_secret.rb
147
+ - examples/rails_2/CoolForums/config/initializers/inflections.rb
148
+ - examples/rails_2/CoolForums/config/initializers/mime_types.rb
149
+ - examples/rails_2/CoolForums/config/initializers/new_rails_defaults.rb
150
+ - examples/rails_2/CoolForums/config/initializers/session_store.rb
151
+ - examples/rails_2/CoolForums/config/locales/en.yml
152
+ - examples/rails_2/CoolForums/config/routes.rb
153
+ - examples/rails_2/CoolForums/db/migrate/20120317012301_create_users.rb
154
+ - examples/rails_2/CoolForums/db/migrate/20120317012444_create_forums.rb
155
+ - examples/rails_2/CoolForums/db/schema.rb
156
+ - examples/rails_2/CoolForums/db/seeds.rb
157
+ - examples/rails_2/CoolForums/doc/README_FOR_APP
158
+ - examples/rails_2/CoolForums/public/404.html
159
+ - examples/rails_2/CoolForums/public/422.html
160
+ - examples/rails_2/CoolForums/public/500.html
161
+ - examples/rails_2/CoolForums/public/favicon.ico
162
+ - examples/rails_2/CoolForums/public/images/rails.png
163
+ - examples/rails_2/CoolForums/public/index.html
164
+ - examples/rails_2/CoolForums/public/javascripts/application.js
165
+ - examples/rails_2/CoolForums/public/javascripts/controls.js
166
+ - examples/rails_2/CoolForums/public/javascripts/dragdrop.js
167
+ - examples/rails_2/CoolForums/public/javascripts/effects.js
168
+ - examples/rails_2/CoolForums/public/javascripts/prototype.js
169
+ - examples/rails_2/CoolForums/public/robots.txt
170
+ - examples/rails_2/CoolForums/public/stylesheets/scaffold.css
171
+ - examples/rails_2/CoolForums/script/about
172
+ - examples/rails_2/CoolForums/script/console
173
+ - examples/rails_2/CoolForums/script/dbconsole
174
+ - examples/rails_2/CoolForums/script/destroy
175
+ - examples/rails_2/CoolForums/script/generate
176
+ - examples/rails_2/CoolForums/script/performance/benchmarker
177
+ - examples/rails_2/CoolForums/script/performance/profiler
178
+ - examples/rails_2/CoolForums/script/plugin
179
+ - examples/rails_2/CoolForums/script/runner
180
+ - examples/rails_2/CoolForums/script/server
181
+ - examples/rails_2/CoolForums/test/fixtures/forums.yml
182
+ - examples/rails_2/CoolForums/test/fixtures/users.yml
183
+ - examples/rails_2/CoolForums/test/functional/forums_controller_test.rb
184
+ - examples/rails_2/CoolForums/test/functional/users_controller_test.rb
185
+ - examples/rails_2/CoolForums/test/performance/browsing_test.rb
186
+ - examples/rails_2/CoolForums/test/test_helper.rb
187
+ - examples/rails_2/CoolForums/test/unit/forum_test.rb
188
+ - examples/rails_2/CoolForums/test/unit/helpers/forums_helper_test.rb
189
+ - examples/rails_2/CoolForums/test/unit/helpers/users_helper_test.rb
190
+ - examples/rails_2/CoolForums/test/unit/user_test.rb
191
+ - examples/rails_2/Gemfile
192
+ - keen.gemspec
193
+ - lib/keen.rb
194
+ - lib/keen/client.rb
195
+ - lib/keen/storage/flat_file_handler.rb
196
+ - lib/keen/storage/redis_handler.rb
197
+ - lib/keen/version.rb
198
+ - test/keen_spec.rb
199
+ has_rdoc: true
200
+ homepage: https://github.com/keenlabs/KeenClient-Ruby
201
+ licenses: []
202
+
203
+ post_install_message:
204
+ rdoc_options: []
205
+
206
+ require_paths:
207
+ - lib
208
+ required_ruby_version: !ruby/object:Gem::Requirement
209
+ none: false
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ hash: 3
214
+ segments:
215
+ - 0
216
+ version: "0"
217
+ required_rubygems_version: !ruby/object:Gem::Requirement
218
+ none: false
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ hash: 3
223
+ segments:
224
+ - 0
225
+ version: "0"
226
+ requirements: []
227
+
228
+ rubyforge_project: keen
229
+ rubygems_version: 1.4.2
230
+ signing_key:
231
+ specification_version: 3
232
+ summary: A library for sending events to the keen.io API.
233
+ test_files:
234
+ - test/keen_spec.rb