km-db 0.2.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/.ruby-version +1 -0
- data/Gemfile +2 -4
- data/Gemfile.lock +179 -20
- data/Procfile +2 -0
- data/Procfile.work +1 -0
- data/README.md +186 -0
- data/Rakefile +1 -0
- data/bin/kmdb-flush +13 -0
- data/bin/kmdb-import +13 -0
- data/bin/kmdb-partition +15 -0
- data/bin/kmdb-pool +8 -0
- data/bin/kmdb-realias +12 -0
- data/bin/kmdb-ui +6 -0
- data/bin/kmdb-work +17 -0
- data/config/amazon-rds-ca-cert.pem +260 -0
- data/config.ru +8 -0
- data/km-db.gemspec +17 -17
- data/lib/kmdb/{belongs_to_user.rb → concerns/belongs_to_user.rb} +3 -3
- data/lib/kmdb/concerns/has_properties.rb +35 -0
- data/lib/kmdb/jobs/find_files.rb +32 -0
- data/lib/kmdb/jobs/list_files.rb +37 -0
- data/lib/kmdb/jobs/locked.rb +10 -0
- data/lib/kmdb/jobs/parse_file.rb +109 -0
- data/lib/kmdb/jobs/record_batch.rb +65 -0
- data/lib/kmdb/jobs/redo_unaliasing.rb +31 -0
- data/lib/kmdb/jobs/unalias_user.rb +32 -0
- data/lib/kmdb/migrations/01_kmdb_initial.rb +78 -0
- data/lib/kmdb/migrations/02_kmdb_partitions.rb +28 -0
- data/lib/kmdb/migrations/03_kmdb_blacklist.rb +20 -0
- data/lib/kmdb/models/alias.rb +36 -0
- data/lib/kmdb/models/blacklisted_property.rb +20 -0
- data/lib/kmdb/models/custom_record.rb +53 -0
- data/lib/kmdb/models/dumpfile.rb +33 -0
- data/lib/kmdb/models/event.rb +56 -0
- data/lib/kmdb/models/event_batch.rb +72 -0
- data/lib/kmdb/models/global_uid.rb +42 -0
- data/lib/kmdb/models/ignored_user.rb +20 -0
- data/lib/kmdb/models/json_file.rb +56 -0
- data/lib/kmdb/models/key.rb +28 -0
- data/lib/kmdb/models/property.rb +44 -0
- data/lib/kmdb/models/s3_object.rb +54 -0
- data/lib/kmdb/models/user.rb +53 -0
- data/lib/kmdb/models/whitelisted_event.rb +20 -0
- data/lib/kmdb/parser.rb +4 -4
- data/lib/kmdb/redis.rb +17 -0
- data/lib/kmdb/resque.rb +38 -0
- data/lib/kmdb/s3_bucket.rb +33 -0
- data/lib/kmdb/services/partitioner.rb +65 -0
- data/lib/kmdb/version.rb +1 -1
- data/lib/kmdb.rb +31 -6
- metadata +236 -186
- data/README.markdown +0 -91
- data/bin/km_db_import +0 -36
- data/lib/kmdb/custom_record.rb +0 -54
- data/lib/kmdb/dumpfile.rb +0 -23
- data/lib/kmdb/event.rb +0 -39
- data/lib/kmdb/has_properties.rb +0 -33
- data/lib/kmdb/key.rb +0 -56
- data/lib/kmdb/migration.rb +0 -63
- data/lib/kmdb/parallel_parser.rb +0 -85
- data/lib/kmdb/property.rb +0 -33
- data/lib/kmdb/user.rb +0 -83
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a1d53c84fa85914d141e481f75759df0a9cdaad0
|
4
|
+
data.tar.gz: 58605a95792bfd91bc5b3877b1460836cc883086
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5dfb47a0f99adb83c288792df7fbe08b37474048844e966f604180da8c5885715e6aa7a04c866b50e257df5f3db322546697bfba9b11400342a2a33690a6a461
|
7
|
+
data.tar.gz: 1b14b242a34d432516402b47e7ac1e7db70b82afe1f7761aaa23a43915226f99f47cc7d21a06d2a9ad417a0fff843fd44c784fb20d64d87d6aff25538728419e
|
data/.gitignore
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.1.2
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,25 +1,175 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
km-db (0.2
|
5
|
-
activerecord (~>
|
4
|
+
km-db (0.3.2)
|
5
|
+
activerecord (~> 4.1)
|
6
6
|
andand
|
7
|
-
|
7
|
+
fog
|
8
|
+
foreman
|
9
|
+
mysql2
|
10
|
+
oj
|
8
11
|
progressbar
|
9
|
-
|
12
|
+
resque
|
13
|
+
resque-lock
|
10
14
|
|
11
15
|
GEM
|
12
|
-
remote:
|
16
|
+
remote: https://rubygems.org/
|
13
17
|
specs:
|
14
|
-
|
15
|
-
|
16
|
-
|
18
|
+
CFPropertyList (2.3.1)
|
19
|
+
activemodel (4.2.2)
|
20
|
+
activesupport (= 4.2.2)
|
21
|
+
builder (~> 3.1)
|
22
|
+
activerecord (4.2.2)
|
23
|
+
activemodel (= 4.2.2)
|
24
|
+
activesupport (= 4.2.2)
|
25
|
+
arel (~> 6.0)
|
26
|
+
activesupport (4.2.2)
|
27
|
+
i18n (~> 0.7)
|
28
|
+
json (~> 1.7, >= 1.7.7)
|
29
|
+
minitest (~> 5.1)
|
30
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
31
|
+
tzinfo (~> 1.1)
|
17
32
|
andand (1.3.3)
|
33
|
+
arel (6.0.0)
|
34
|
+
builder (3.2.2)
|
35
|
+
coderay (1.1.0)
|
18
36
|
diff-lcs (1.1.3)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
37
|
+
excon (0.45.3)
|
38
|
+
fission (0.5.0)
|
39
|
+
CFPropertyList (~> 2.2)
|
40
|
+
fog (1.31.0)
|
41
|
+
fog-atmos
|
42
|
+
fog-aws (~> 0.0)
|
43
|
+
fog-brightbox (~> 0.4)
|
44
|
+
fog-core (~> 1.30)
|
45
|
+
fog-ecloud
|
46
|
+
fog-google (>= 0.0.2)
|
47
|
+
fog-json
|
48
|
+
fog-local
|
49
|
+
fog-powerdns (>= 0.1.1)
|
50
|
+
fog-profitbricks
|
51
|
+
fog-radosgw (>= 0.0.2)
|
52
|
+
fog-riakcs
|
53
|
+
fog-sakuracloud (>= 0.0.4)
|
54
|
+
fog-serverlove
|
55
|
+
fog-softlayer
|
56
|
+
fog-storm_on_demand
|
57
|
+
fog-terremark
|
58
|
+
fog-vmfusion
|
59
|
+
fog-voxel
|
60
|
+
fog-xml (~> 0.1.1)
|
61
|
+
ipaddress (~> 0.5)
|
62
|
+
nokogiri (~> 1.5, >= 1.5.11)
|
63
|
+
fog-atmos (0.1.0)
|
64
|
+
fog-core
|
65
|
+
fog-xml
|
66
|
+
fog-aws (0.5.0)
|
67
|
+
fog-core (~> 1.27)
|
68
|
+
fog-json (~> 1.0)
|
69
|
+
fog-xml (~> 0.1)
|
70
|
+
ipaddress (~> 0.8)
|
71
|
+
fog-brightbox (0.7.1)
|
72
|
+
fog-core (~> 1.22)
|
73
|
+
fog-json
|
74
|
+
inflecto (~> 0.0.2)
|
75
|
+
fog-core (1.31.1)
|
76
|
+
builder
|
77
|
+
excon (~> 0.45)
|
78
|
+
formatador (~> 0.2)
|
79
|
+
mime-types
|
80
|
+
net-scp (~> 1.1)
|
81
|
+
net-ssh (>= 2.1.3)
|
82
|
+
fog-ecloud (0.1.3)
|
83
|
+
fog-core
|
84
|
+
fog-xml
|
85
|
+
fog-google (0.0.5)
|
86
|
+
fog-core
|
87
|
+
fog-json
|
88
|
+
fog-xml
|
89
|
+
fog-json (1.0.2)
|
90
|
+
fog-core (~> 1.0)
|
91
|
+
multi_json (~> 1.10)
|
92
|
+
fog-local (0.2.1)
|
93
|
+
fog-core (~> 1.27)
|
94
|
+
fog-powerdns (0.1.1)
|
95
|
+
fog-core (~> 1.27)
|
96
|
+
fog-json (~> 1.0)
|
97
|
+
fog-xml (~> 0.1)
|
98
|
+
fog-profitbricks (0.0.3)
|
99
|
+
fog-core
|
100
|
+
fog-xml
|
101
|
+
nokogiri
|
102
|
+
fog-radosgw (0.0.4)
|
103
|
+
fog-core (>= 1.21.0)
|
104
|
+
fog-json
|
105
|
+
fog-xml (>= 0.0.1)
|
106
|
+
fog-riakcs (0.1.0)
|
107
|
+
fog-core
|
108
|
+
fog-json
|
109
|
+
fog-xml
|
110
|
+
fog-sakuracloud (1.0.1)
|
111
|
+
fog-core
|
112
|
+
fog-json
|
113
|
+
fog-serverlove (0.1.2)
|
114
|
+
fog-core
|
115
|
+
fog-json
|
116
|
+
fog-softlayer (0.4.6)
|
117
|
+
fog-core
|
118
|
+
fog-json
|
119
|
+
fog-storm_on_demand (0.1.1)
|
120
|
+
fog-core
|
121
|
+
fog-json
|
122
|
+
fog-terremark (0.1.0)
|
123
|
+
fog-core
|
124
|
+
fog-xml
|
125
|
+
fog-vmfusion (0.1.0)
|
126
|
+
fission
|
127
|
+
fog-core
|
128
|
+
fog-voxel (0.1.0)
|
129
|
+
fog-core
|
130
|
+
fog-xml
|
131
|
+
fog-xml (0.1.2)
|
132
|
+
fog-core
|
133
|
+
nokogiri (~> 1.5, >= 1.5.11)
|
134
|
+
foreman (0.78.0)
|
135
|
+
thor (~> 0.19.1)
|
136
|
+
formatador (0.2.5)
|
137
|
+
i18n (0.7.0)
|
138
|
+
inflecto (0.0.2)
|
139
|
+
ipaddress (0.8.0)
|
140
|
+
json (1.8.3)
|
141
|
+
method_source (0.8.2)
|
142
|
+
mime-types (2.6.1)
|
143
|
+
mini_portile (0.6.2)
|
144
|
+
minitest (5.7.0)
|
145
|
+
mono_logger (1.1.0)
|
146
|
+
multi_json (1.11.1)
|
147
|
+
mysql2 (0.3.18)
|
148
|
+
net-scp (1.2.1)
|
149
|
+
net-ssh (>= 2.6.5)
|
150
|
+
net-ssh (2.9.2)
|
151
|
+
nokogiri (1.6.6.2)
|
152
|
+
mini_portile (~> 0.6.0)
|
153
|
+
oj (2.12.9)
|
154
|
+
progressbar (0.21.0)
|
155
|
+
pry (0.10.0)
|
156
|
+
coderay (~> 1.1.0)
|
157
|
+
method_source (~> 0.8.1)
|
158
|
+
slop (~> 3.4)
|
159
|
+
rack (1.6.2)
|
160
|
+
rack-protection (1.5.3)
|
161
|
+
rack
|
162
|
+
rake (10.3.2)
|
163
|
+
redis (3.2.1)
|
164
|
+
redis-namespace (1.5.2)
|
165
|
+
redis (~> 3.0, >= 3.0.4)
|
166
|
+
resque (1.25.2)
|
167
|
+
mono_logger (~> 1.0)
|
168
|
+
multi_json (~> 1.0)
|
169
|
+
redis-namespace (~> 1.3)
|
170
|
+
sinatra (>= 0.9.2)
|
171
|
+
vegas (~> 0.1.2)
|
172
|
+
resque-lock (1.1.0)
|
23
173
|
rspec (2.4.0)
|
24
174
|
rspec-core (~> 2.4.0)
|
25
175
|
rspec-expectations (~> 2.4.0)
|
@@ -28,19 +178,28 @@ GEM
|
|
28
178
|
rspec-expectations (2.4.0)
|
29
179
|
diff-lcs (~> 1.1.2)
|
30
180
|
rspec-mocks (2.4.0)
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
181
|
+
sinatra (1.4.6)
|
182
|
+
rack (~> 1.4)
|
183
|
+
rack-protection (~> 1.4)
|
184
|
+
tilt (>= 1.3, < 3)
|
185
|
+
slop (3.5.0)
|
186
|
+
thor (0.19.1)
|
187
|
+
thread_safe (0.3.5)
|
188
|
+
tilt (2.0.1)
|
189
|
+
tzinfo (1.2.2)
|
190
|
+
thread_safe (~> 0.1)
|
191
|
+
vegas (0.1.11)
|
192
|
+
rack (>= 1.0.0)
|
35
193
|
|
36
194
|
PLATFORMS
|
37
195
|
ruby
|
38
196
|
|
39
197
|
DEPENDENCIES
|
40
|
-
bundler
|
41
|
-
json
|
198
|
+
bundler
|
42
199
|
km-db!
|
43
|
-
|
200
|
+
pry
|
44
201
|
rake
|
45
202
|
rspec (~> 2.4.0)
|
46
|
-
|
203
|
+
|
204
|
+
BUNDLED WITH
|
205
|
+
1.10.4
|
data/Procfile
ADDED
data/Procfile.work
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
resque: bundle exec bin/kmdb-work
|
data/README.md
ADDED
@@ -0,0 +1,186 @@
|
|
1
|
+
# KMDB
|
2
|
+
|
3
|
+
The `km-db` gem should be useful to KissMetrics (KM) users.
|
4
|
+
Its aim is to efficiently process data obtained with KM's "Data Export" feature.
|
5
|
+
|
6
|
+
Its main feature is to import dumps directly from S3 into a SQL database,
|
7
|
+
optimized for typical queries (in particular, partitioned along the time
|
8
|
+
dimension).
|
9
|
+
|
10
|
+
Once imported, you can run complex queries against your visit history, for
|
11
|
+
instance run multivariate analysis.
|
12
|
+
|
13
|
+
Beware though, KM data can be huge, and processing it is taxing!
|
14
|
+
|
15
|
+
|
16
|
+
## Installing
|
17
|
+
|
18
|
+
If you want to run "just" KM-DB, you might want to just use [the
|
19
|
+
app](https://github.com/HouseTrip/km-db-app).
|
20
|
+
|
21
|
+
Otherwise, add this to your Gemfile if you're using Bundler:
|
22
|
+
|
23
|
+
gem 'km-db'
|
24
|
+
|
25
|
+
### Configuration
|
26
|
+
|
27
|
+
KMDB is configured through environment variables. We recommend storing this
|
28
|
+
settings in a `.env` file if running locally, and using [foreman]() to start
|
29
|
+
KMDB commands with the environment set.
|
30
|
+
|
31
|
+
|
32
|
+
### Preparing your database
|
33
|
+
|
34
|
+
KMDB requires a MySQL database (to store events, properties, etc) and a Redis
|
35
|
+
store running (to store batch jobs and cache data).
|
36
|
+
|
37
|
+
Set the following:
|
38
|
+
|
39
|
+
- `DATABASE_URL` (required), e.g. `mysql2://km_db_test@localhost/km_db_test`
|
40
|
+
- `KMDB_REDIS_URL` [localhost], e.g. `redis://localhost/14`
|
41
|
+
|
42
|
+
Then run:
|
43
|
+
|
44
|
+
$ kmdb-flush
|
45
|
+
|
46
|
+
to prepare your database.
|
47
|
+
|
48
|
+
|
49
|
+
### Optimizing your database
|
50
|
+
|
51
|
+
If your dataset is large (over 1 million events), KMDB can [partition]() your
|
52
|
+
database, i.e. transparently split large tables into smaller buckets of
|
53
|
+
continuous time periods.
|
54
|
+
|
55
|
+
Set the following:
|
56
|
+
|
57
|
+
- `KMDB_MIN_DATE` (required), e.g. '2014-01-01'
|
58
|
+
- `KMDB_MAX_DATE` (required), e.g. '2016-01-01'
|
59
|
+
- `KMDB_DAYS_PER_PARTITION` (required), e.g. '7'
|
60
|
+
|
61
|
+
Then run:
|
62
|
+
|
63
|
+
$ kmdb-partition
|
64
|
+
|
65
|
+
Notes:
|
66
|
+
|
67
|
+
- MySQL only supports up to 1024 partitions.
|
68
|
+
- You shoud aim for less than 1 million events per partitions for performance.
|
69
|
+
- You should run this _before_ importing data, but it's possible to re-run it.
|
70
|
+
The `MIN_DATE` will be ignored, and partitions will be added up to the new
|
71
|
+
`MAX_DATE` (if larger).
|
72
|
+
|
73
|
+
|
74
|
+
## Importing data
|
75
|
+
|
76
|
+
KMDB will fetch JSON files form the S3 bucket where you instructed KissMetrics
|
77
|
+
to back up your data, parse them, and store information in the database.
|
78
|
+
|
79
|
+
It does so using [resque]() for high parallelism of the import process; in our
|
80
|
+
experience, it's perfectly possible to import 100GB of data in a few hours.
|
81
|
+
|
82
|
+
Set the following:
|
83
|
+
|
84
|
+
- `RESQUE_WORKERS` (1), number of worker nodes.
|
85
|
+
- `KMDB_MIN_REVISION` (optional, default 1), first KissMetrics revision file you want to import.
|
86
|
+
- `KMDB_REVISION_LOOKAHEAD` (10), how many revision files to check after the last known one
|
87
|
+
- `KMDB_BATCH_SIZE` (100), how many events to process per batch (advisory, may
|
88
|
+
be higher as an entire second's worth of events will always be processed in one
|
89
|
+
batch to preserve ordering).
|
90
|
+
- `AWS_BUCKET` (required), the name of the S3 bucket where the data is stored.
|
91
|
+
- `AWS_ACCESS_KEY_ID` (required).
|
92
|
+
- `AWS_SECRET_ACCESS_KEY` (required).
|
93
|
+
|
94
|
+
|
95
|
+
### Ignoring some users
|
96
|
+
|
97
|
+
You may want to ignore all events and properties for certain users, for instance
|
98
|
+
the administrative users of your site (or employees).
|
99
|
+
|
100
|
+
Simply add their identities to the `ignored_users` table before import.
|
101
|
+
|
102
|
+
|
103
|
+
### Whitelisting events
|
104
|
+
|
105
|
+
It's typical to have some noisy and/or shorter-lived events sent to KissMetrics,
|
106
|
+
e.g. for testing purposes or for temporary monitoring.
|
107
|
+
|
108
|
+
Should you only want to import certain events, add their names to the
|
109
|
+
`whitelisted_events` table before starting import.
|
110
|
+
|
111
|
+
If the table is left empty, all events will be imported.
|
112
|
+
|
113
|
+
|
114
|
+
### Dealiasing users
|
115
|
+
|
116
|
+
When KissMetrics finds a way to tie two user identities as being a single actual
|
117
|
+
user, it stores an "aliasing" event.
|
118
|
+
KMDB de-aliases users automatically during import, and will store all events and
|
119
|
+
properties against a single user identity (one that's numeric if any, otherwise
|
120
|
+
the lexicographically lowest).
|
121
|
+
|
122
|
+
|
123
|
+
## Using imported data
|
124
|
+
|
125
|
+
### Using SQL directly
|
126
|
+
|
127
|
+
KMDB tries to stay close to the KissMetrics data, leaving you to interpret it.
|
128
|
+
As such, the main tables are unsurprisingly `events` and `properties`.
|
129
|
+
|
130
|
+
Here's a summary of the data model:
|
131
|
+
|
132
|
+
`events` has one row for each imported event:
|
133
|
+
|
134
|
+
| **events** |
|
135
|
+
|------------|
|
136
|
+
| id |
|
137
|
+
| t | the event timestamp |
|
138
|
+
| n | reference to the event name |
|
139
|
+
| user_id | reference to the user |
|
140
|
+
|
141
|
+
`properties` has one row for each property ever set on events or users
|
142
|
+
|
143
|
+
| **properties** |
|
144
|
+
|----------------|
|
145
|
+
| id |
|
146
|
+
| t | timestamp at which the property was set |
|
147
|
+
| key | reference to the property name |
|
148
|
+
| value | value (string) |
|
149
|
+
| user_id | reference to the user |
|
150
|
+
| event_id | reference to the event (may be NULL) |
|
151
|
+
|
152
|
+
`events.n` and `properties.key` reference the `id` column of the `keys` table;
|
153
|
+
this is done for performance reasons (event and property names are only stored
|
154
|
+
once):
|
155
|
+
|
156
|
+
| **keys** |
|
157
|
+
|----------|
|
158
|
+
| id |
|
159
|
+
| string |
|
160
|
+
|
161
|
+
KMDB also keeps the original user identities around in `users`, although you'll
|
162
|
+
probably never need them:
|
163
|
+
|
164
|
+
| **users** |
|
165
|
+
|-----------|
|
166
|
+
| id |
|
167
|
+
| name | the identity given by KissMetrics |
|
168
|
+
|
169
|
+
as well as all aliasing events:
|
170
|
+
|
171
|
+
| **aliases** |
|
172
|
+
|-------------|
|
173
|
+
| id |
|
174
|
+
| name1 |
|
175
|
+
| name2 |
|
176
|
+
|
177
|
+
|
178
|
+
### Using ActiveRecord
|
179
|
+
|
180
|
+
The `KMDB` module exposes four `ActiveRecord` classes:
|
181
|
+
`Event`, `Property`, `User` are the main domain objects.
|
182
|
+
|
183
|
+
`Key` is used to intern strings (event and property names) for performance.
|
184
|
+
|
185
|
+
Please consult the source of these models for details.
|
186
|
+
|
data/Rakefile
CHANGED
data/bin/kmdb-flush
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'kmdb'
|
3
|
+
require 'kmdb/redis'
|
4
|
+
|
5
|
+
KMDB.connect.migrate
|
6
|
+
|
7
|
+
KMDB.transaction do |c|
|
8
|
+
%w(aliases dumpfiles events properties users).each do |table|
|
9
|
+
c.execute "TRUNCATE TABLE #{table}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
KMDB::Redis.connection.flushdb
|
data/bin/kmdb-import
ADDED
data/bin/kmdb-partition
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'kmdb'
|
3
|
+
require 'kmdb/models/event'
|
4
|
+
require 'kmdb/models/alias'
|
5
|
+
require 'kmdb/models/property'
|
6
|
+
require 'kmdb/services/partitioner'
|
7
|
+
|
8
|
+
KMDB.connect.migrate
|
9
|
+
|
10
|
+
module KMDB
|
11
|
+
[Event, Property, Alias].each do |model|
|
12
|
+
Services::Partitioner.new(model: model).run
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
data/bin/kmdb-pool
ADDED
data/bin/kmdb-realias
ADDED
data/bin/kmdb-ui
ADDED
data/bin/kmdb-work
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'kmdb'
|
3
|
+
require 'kmdb/resque'
|
4
|
+
|
5
|
+
# suppress a silly warning
|
6
|
+
require 'i18n'
|
7
|
+
I18n.enforce_available_locales = false
|
8
|
+
|
9
|
+
# load all jobs
|
10
|
+
Dir[File.expand_path('../../lib/kmdb/jobs/*.rb', __FILE__)].each do |job|
|
11
|
+
require job
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
KMDB.connect
|
16
|
+
KMDB::Resque.work
|
17
|
+
|