massive 0.1.0

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 (55) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +3 -0
  4. data/.rvmrc +1 -0
  5. data/.travis.yml +7 -0
  6. data/Gemfile +19 -0
  7. data/Gemfile.lock +141 -0
  8. data/Guardfile +9 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +196 -0
  11. data/Rakefile +8 -0
  12. data/lib/massive.rb +63 -0
  13. data/lib/massive/cancelling.rb +20 -0
  14. data/lib/massive/file.rb +80 -0
  15. data/lib/massive/file_job.rb +9 -0
  16. data/lib/massive/file_process.rb +7 -0
  17. data/lib/massive/file_step.rb +7 -0
  18. data/lib/massive/job.rb +115 -0
  19. data/lib/massive/locking.rb +27 -0
  20. data/lib/massive/memory_consumption.rb +15 -0
  21. data/lib/massive/notifications.rb +40 -0
  22. data/lib/massive/notifiers.rb +6 -0
  23. data/lib/massive/notifiers/base.rb +32 -0
  24. data/lib/massive/notifiers/pusher.rb +17 -0
  25. data/lib/massive/process.rb +69 -0
  26. data/lib/massive/process_serializer.rb +12 -0
  27. data/lib/massive/retry.rb +49 -0
  28. data/lib/massive/status.rb +59 -0
  29. data/lib/massive/step.rb +143 -0
  30. data/lib/massive/step_serializer.rb +12 -0
  31. data/lib/massive/timing_support.rb +10 -0
  32. data/lib/massive/version.rb +3 -0
  33. data/massive.gemspec +23 -0
  34. data/spec/fixtures/custom_job.rb +4 -0
  35. data/spec/fixtures/custom_step.rb +19 -0
  36. data/spec/models/massive/cancelling_spec.rb +83 -0
  37. data/spec/models/massive/file_job_spec.rb +24 -0
  38. data/spec/models/massive/file_spec.rb +209 -0
  39. data/spec/models/massive/file_step_spec.rb +22 -0
  40. data/spec/models/massive/job_spec.rb +319 -0
  41. data/spec/models/massive/locking_spec.rb +52 -0
  42. data/spec/models/massive/memory_consumption_spec.rb +24 -0
  43. data/spec/models/massive/notifications_spec.rb +107 -0
  44. data/spec/models/massive/notifiers/base_spec.rb +48 -0
  45. data/spec/models/massive/notifiers/pusher_spec.rb +49 -0
  46. data/spec/models/massive/process_serializer_spec.rb +38 -0
  47. data/spec/models/massive/process_spec.rb +235 -0
  48. data/spec/models/massive/status_spec.rb +104 -0
  49. data/spec/models/massive/step_serializer_spec.rb +40 -0
  50. data/spec/models/massive/step_spec.rb +490 -0
  51. data/spec/models/massive/timing_support_spec.rb +55 -0
  52. data/spec/shared/step_context.rb +25 -0
  53. data/spec/spec_helper.rb +42 -0
  54. data/spec/support/mongoid.yml +78 -0
  55. metadata +175 -0
@@ -0,0 +1,55 @@
1
+ shared_examples_for Massive::TimingSupport do
2
+ include_context "frozen time"
3
+
4
+ context "when it has not been started" do
5
+ its(:elapsed_time) { should be_zero }
6
+ end
7
+
8
+ context "when it has been started" do
9
+ let(:started_at) { 1.minute.ago }
10
+ before { subject.started_at = started_at }
11
+
12
+ context "1 minute ago" do
13
+ context "and it has not been finished yet" do
14
+ its(:elapsed_time) { should eq(now - started_at) }
15
+
16
+ it { should_not be_completed }
17
+ end
18
+
19
+ context "and it has been finished 10 seconds ago" do
20
+ let(:finished_at) { 10.seconds.ago }
21
+ before { subject.finished_at = finished_at }
22
+
23
+ its(:elapsed_time) { should eq(finished_at - started_at) }
24
+
25
+ it { should be_completed }
26
+ end
27
+ end
28
+
29
+ context "2 hours ago" do
30
+ let(:started_at) { 2.hours.ago }
31
+
32
+ context "and it has not been finished yet" do
33
+ its(:elapsed_time) { should eq(now - started_at) }
34
+
35
+ it { should_not be_completed }
36
+ end
37
+
38
+ context "and has been finished 30 minutes ago" do
39
+ let(:finished_at) { 30.minutes.ago }
40
+ before { subject.finished_at = finished_at }
41
+
42
+ its(:elapsed_time) { should eq(finished_at - started_at) }
43
+ it { should be_completed }
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ describe Massive::Step do
50
+ it_should_behave_like Massive::TimingSupport
51
+ end
52
+
53
+ describe Massive::Job do
54
+ it_should_behave_like Massive::TimingSupport
55
+ end
@@ -0,0 +1,25 @@
1
+ shared_context "stubbed memory_consumption" do
2
+ let(:current_memory_consumption) { 123456 }
3
+
4
+ before { subject.stub(:current_memory_consumption).and_return(current_memory_consumption) }
5
+ end
6
+
7
+ shared_context "frozen time" do
8
+ let!(:now) do
9
+ Time.now.tap do |now|
10
+ Time.stub(:now).and_return(now)
11
+ end
12
+ end
13
+ end
14
+
15
+ shared_context "job processing" do
16
+ let(:item) { double(:item) }
17
+ let(:index) { 0 }
18
+ let(:retry_interval) { job.class.retry_interval }
19
+ let(:maximum_retries) { job.class.maximum_retries }
20
+
21
+ before do
22
+ Kernel.stub(:sleep)
23
+ job.stub(:each_item).and_yield(item, index)
24
+ end
25
+ end
@@ -0,0 +1,42 @@
1
+ require 'simplecov'
2
+
3
+ SimpleCov.start do
4
+ add_filter 'spec'
5
+ end
6
+
7
+ require 'bundler/setup'
8
+
9
+ ENV['RACK_ENV'] ||= 'test'
10
+
11
+ Bundler.require :default, ENV['RACK_ENV']
12
+
13
+ begin
14
+ require 'debugger'
15
+ rescue LoadError
16
+ end
17
+
18
+ root = File.expand_path('../..', __FILE__)
19
+
20
+ Mongoid.load!(File.join(root, "spec/support/mongoid.yml"), :test)
21
+
22
+ Dir["#{root}/spec/shared/**/*.rb"].each { |f| require f }
23
+ Dir["#{root}/spec/fixtures/**/*.rb"].each { |f| require f }
24
+
25
+ RSpec.configure do |config|
26
+ config.treat_symbols_as_metadata_keys_with_true_values = true
27
+ config.run_all_when_everything_filtered = true
28
+ config.filter_run :focus
29
+
30
+ # Run specs in random order to surface order dependencies. If you find an
31
+ # order dependency and want to debug it, you can fix the order by providing
32
+ # the seed, which is printed after each run.
33
+ # --seed 1234
34
+ # config.order = 'random'
35
+
36
+ config.before do
37
+ DatabaseCleaner.clean_with(:truncation)
38
+ end
39
+
40
+ config.before { Massive.redis.flushdb }
41
+ config.after { Massive.redis.flushdb }
42
+ end
@@ -0,0 +1,78 @@
1
+ default_options: &default_options
2
+ raise_not_found_error: false
3
+
4
+ session_default_options: &session_default_options
5
+ consistency: :strong
6
+ safe: true
7
+
8
+ development:
9
+ # Configure available database sessions. (required)
10
+ sessions:
11
+ # Defines the default session. (required)
12
+ default:
13
+ # Defines the name of the default database that Mongoid can connect to.
14
+ # (required).
15
+ database: massive_development
16
+ # Provides the hosts the default session can connect to. Must be an array
17
+ # of host:port pairs. (required)
18
+ hosts:
19
+ - localhost:27017
20
+ options:
21
+ # Change whether the session persists in safe mode by default.
22
+ # (default: false)
23
+ # safe: false
24
+
25
+ # Change the default consistency model to :eventual or :strong.
26
+ # :eventual will send reads to secondaries, :strong sends everything
27
+ # to master. (default: :eventual)
28
+ <<: *session_default_options
29
+ # Configure Mongoid specific options. (optional)
30
+ options:
31
+ <<: *default_options
32
+ # Configuration for whether or not to allow access to fields that do
33
+ # not have a field definition on the model. (default: true)
34
+ # allow_dynamic_fields: true
35
+
36
+ # Enable the identity map, needed for eager loading. (default: false)
37
+ # identity_map_enabled: false
38
+
39
+ # Includes the root model name in json serialization. (default: false)
40
+ # include_root_in_json: false
41
+
42
+ # Include the _type field in serializaion. (default: false)
43
+ # include_type_for_serialization: false
44
+
45
+ # Preload all models in development, needed when models use
46
+ # inheritance. (default: false)
47
+ # preload_models: false
48
+
49
+ # Protect id and type from mass assignment. (default: true)
50
+ # protect_sensitive_fields: true
51
+
52
+ # Raise an error when performing a #find and the document is not found.
53
+ # (default: true)
54
+ # raise_not_found_error: false
55
+
56
+ # Raise an error when defining a scope with the same name as an
57
+ # existing method. (default: false)
58
+ # scope_overwrite_exception: false
59
+
60
+ # Skip the database version check, used when connecting to a db without
61
+ # admin access. (default: false)
62
+ # skip_version_check: false
63
+
64
+ # User Active Support's time zone in conversions. (default: true)
65
+ # use_activesupport_time_zone: true
66
+
67
+ # Ensure all times are UTC in the app side. (default: false)
68
+ # use_utc: false
69
+ test:
70
+ sessions:
71
+ default:
72
+ database: massive_test
73
+ hosts:
74
+ - localhost:27017
75
+ options:
76
+ <<: *session_default_options
77
+ options:
78
+ <<: *default_options
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: massive
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Vicente Mundim
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: resque
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mongoid
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 3.1.x
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 3.1.x
41
+ - !ruby/object:Gem::Dependency
42
+ name: file_processor
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.2.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.2.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: active_model_serializers
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Parallelize processing of large files and/or data using Resque, Redis
70
+ and MongoDB
71
+ email:
72
+ - vicente.mundim@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - .gitignore
78
+ - .rspec
79
+ - .rvmrc
80
+ - .travis.yml
81
+ - Gemfile
82
+ - Gemfile.lock
83
+ - Guardfile
84
+ - LICENSE.txt
85
+ - README.md
86
+ - Rakefile
87
+ - lib/massive.rb
88
+ - lib/massive/cancelling.rb
89
+ - lib/massive/file.rb
90
+ - lib/massive/file_job.rb
91
+ - lib/massive/file_process.rb
92
+ - lib/massive/file_step.rb
93
+ - lib/massive/job.rb
94
+ - lib/massive/locking.rb
95
+ - lib/massive/memory_consumption.rb
96
+ - lib/massive/notifications.rb
97
+ - lib/massive/notifiers.rb
98
+ - lib/massive/notifiers/base.rb
99
+ - lib/massive/notifiers/pusher.rb
100
+ - lib/massive/process.rb
101
+ - lib/massive/process_serializer.rb
102
+ - lib/massive/retry.rb
103
+ - lib/massive/status.rb
104
+ - lib/massive/step.rb
105
+ - lib/massive/step_serializer.rb
106
+ - lib/massive/timing_support.rb
107
+ - lib/massive/version.rb
108
+ - massive.gemspec
109
+ - spec/fixtures/custom_job.rb
110
+ - spec/fixtures/custom_step.rb
111
+ - spec/models/massive/cancelling_spec.rb
112
+ - spec/models/massive/file_job_spec.rb
113
+ - spec/models/massive/file_spec.rb
114
+ - spec/models/massive/file_step_spec.rb
115
+ - spec/models/massive/job_spec.rb
116
+ - spec/models/massive/locking_spec.rb
117
+ - spec/models/massive/memory_consumption_spec.rb
118
+ - spec/models/massive/notifications_spec.rb
119
+ - spec/models/massive/notifiers/base_spec.rb
120
+ - spec/models/massive/notifiers/pusher_spec.rb
121
+ - spec/models/massive/process_serializer_spec.rb
122
+ - spec/models/massive/process_spec.rb
123
+ - spec/models/massive/status_spec.rb
124
+ - spec/models/massive/step_serializer_spec.rb
125
+ - spec/models/massive/step_spec.rb
126
+ - spec/models/massive/timing_support_spec.rb
127
+ - spec/shared/step_context.rb
128
+ - spec/spec_helper.rb
129
+ - spec/support/mongoid.yml
130
+ homepage:
131
+ licenses: []
132
+ metadata: {}
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ! '>='
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ requirements: []
148
+ rubyforge_project:
149
+ rubygems_version: 2.2.2
150
+ signing_key:
151
+ specification_version: 4
152
+ summary: Parallelize processing of large files and/or data using Resque, Redis and
153
+ MongoDB
154
+ test_files:
155
+ - spec/fixtures/custom_job.rb
156
+ - spec/fixtures/custom_step.rb
157
+ - spec/models/massive/cancelling_spec.rb
158
+ - spec/models/massive/file_job_spec.rb
159
+ - spec/models/massive/file_spec.rb
160
+ - spec/models/massive/file_step_spec.rb
161
+ - spec/models/massive/job_spec.rb
162
+ - spec/models/massive/locking_spec.rb
163
+ - spec/models/massive/memory_consumption_spec.rb
164
+ - spec/models/massive/notifications_spec.rb
165
+ - spec/models/massive/notifiers/base_spec.rb
166
+ - spec/models/massive/notifiers/pusher_spec.rb
167
+ - spec/models/massive/process_serializer_spec.rb
168
+ - spec/models/massive/process_spec.rb
169
+ - spec/models/massive/status_spec.rb
170
+ - spec/models/massive/step_serializer_spec.rb
171
+ - spec/models/massive/step_spec.rb
172
+ - spec/models/massive/timing_support_spec.rb
173
+ - spec/shared/step_context.rb
174
+ - spec/spec_helper.rb
175
+ - spec/support/mongoid.yml