caerus 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 038ef3da882624c61a6e3b705cf5fcd4ef60eab9
4
+ data.tar.gz: b5235ce5dc6ff380712c9108b2fdd5aa1e3366f4
5
+ SHA512:
6
+ metadata.gz: 815521019867e490cde76698e3590dace814fc22233b230a8cf2772c9c634cc3233a1411155598b0e06565050f4d68529f2ee371cc198e81261b9241147e6508
7
+ data.tar.gz: 5efa179bbcebe93f012fab6dea782a01f424355f19f0df1fda40222b40bd016f90fe82529bd3f286c3c1c91bc528a20cf7a9242fad6430a14a5ad7b4ba42504a
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ #require 'pry'
4
+ current_path = File.expand_path(File.dirname(File.dirname(__FILE__)))
5
+
6
+ $: << File.join(current_path, 'lib')
7
+ require 'caerus'
8
+
9
+ Caerus::Application::Master.new.run
10
+
@@ -0,0 +1,9 @@
1
+ require 'colorize'
2
+ require 'caerus/application/base'
3
+ require 'caerus/application/master'
4
+ require 'caerus/redis/base'
5
+ require 'caerus/redis/redis_gateway'
6
+
7
+ #require 'pry'
8
+ #require_relative '../test/class1'
9
+
@@ -0,0 +1,15 @@
1
+ #require 'pry'
2
+
3
+ require 'caerus/common_methods'
4
+
5
+ module Caerus
6
+ module Application
7
+ class Base
8
+ attr_reader :redis
9
+
10
+ def connect_to_redis
11
+ @redis = Caerus.connect_to_redis
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ require 'caerus/job_control'
2
+
3
+ module Caerus
4
+ module Application
5
+ class Master < Base
6
+ include Caerus::JobControl
7
+
8
+ def run
9
+ connect_to_redis
10
+ enter_infinite_loop
11
+ end
12
+
13
+ def enter_infinite_loop
14
+ @r = redis.redis_server
15
+ loop do
16
+ load_job
17
+ puts 'nothing to do'
18
+ sleep 0.2
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ require 'json'
2
+
3
+ module Caerus
4
+ def self.connect_to_redis
5
+ Caerus::Redis::RedisGateway.new
6
+ end
7
+
8
+ def self.enqueue(klass, could_be_anything = '' )
9
+ puts "#{klass} and #{could_be_anything} to be enqueued"
10
+
11
+ hash_to_json = {}
12
+
13
+ hash_to_json[klass] = could_be_anything
14
+ redis = connect_to_redis.redis_server
15
+
16
+ hash_to_json["status"] = 'new'
17
+ redis.lpush 'Caerus:jobs', hash_to_json.to_json
18
+ end
19
+ end
@@ -0,0 +1,123 @@
1
+ module Caerus
2
+ module JobControl
3
+ #Methods to do the job control
4
+ #get the jobs from redis and make a hash out of it, create a class and run perfom
5
+
6
+ CAERUS_JOBS_LIST = 'Caerus:jobs'
7
+ CAERUS_JOBS_PROCESSING_LIST = 'Caerus:processing'
8
+ CAERUS_JOBS_FAILED_LIST = 'Caerus:failed'
9
+
10
+ def load_job
11
+ klass, params = read_job_from_queue
12
+ process_job(klass,params) if (params && klass)
13
+ end
14
+
15
+ def read_job_from_queue
16
+ return if (job_list_length < 1)
17
+ return unless (object_hash = get_job)
18
+
19
+ object_to_bring = object_hash.first.first
20
+ param_to_use_with_it = object_hash.first.last || ''
21
+ @json_string = object_hash.to_json
22
+
23
+ return object_to_bring, param_to_use_with_it
24
+ end
25
+
26
+ def process_job(object_to_bring,param_to_use_with_it)
27
+ begin
28
+ klass = Kernel.const_get(object_to_bring)
29
+ rescue Exception => e
30
+ puts "Nothing to do Class do not exit #{object_to_bring}"
31
+ deal_with_faulty_job(e)
32
+ return
33
+ end
34
+
35
+ #If the job blow up in your face catch the error!
36
+ #the fork engine is going to be this point on
37
+ begin
38
+ klass.perform(param_to_use_with_it)
39
+ rescue Exception => e
40
+ deal_with_faulty_job(e)
41
+ return
42
+ end
43
+ end
44
+
45
+ def get_job
46
+ search_candidate
47
+ end
48
+
49
+ def job_list_length
50
+ (@r.llen CAERUS_JOBS_LIST)
51
+ end
52
+
53
+ def processing_list_length
54
+ (@r.llen CAERUS_JOBS_PROCESSING_LIST)
55
+ end
56
+
57
+ def search_candidate
58
+ #TODO FIX linear search, replace it later for a better algorithm
59
+ 0.upto((job_list_length) -1) do
60
+ job = @r.rpop CAERUS_JOBS_LIST
61
+ next unless validate_object(job)
62
+
63
+ #binding.pry
64
+ hash_job = JSON.parse(job)
65
+ status = hash_job['status']
66
+
67
+ case status
68
+ when /new/
69
+ puts 'New job'
70
+ job_with_pid = print_child_pid(hash_job)
71
+ put_it_in_the_processing_queue(job_with_pid, :left)
72
+
73
+ return hash_job
74
+ else
75
+ puts "unknow state removing from the queue #{job}"
76
+ return nil
77
+ end
78
+ end
79
+ end
80
+
81
+ def validate_object(job)
82
+ tmp_hash = JSON.parse(job)
83
+ (tmp_hash.size == 2) && (tmp_hash["status"]) && (tmp_hash.kind_of? Hash)
84
+ end
85
+
86
+ def put_it_in_the_processing_queue(job, direction)
87
+ case direction
88
+ when :left
89
+ @r.lpush CAERUS_JOBS_PROCESSING_LIST, job
90
+ when :right
91
+ @r.rpush CAERUS_JOBS_PROCESSING_LIST, job
92
+ end
93
+ end
94
+
95
+ def print_child_pid(job)
96
+ job['status'] = $$
97
+ job.to_json
98
+ end
99
+
100
+ def remove_job_from_being_processed
101
+ #Todo remove the linear search
102
+ list = @r.lrange CAERUS_JOBS_PROCESSING_LIST, 0, -1
103
+ if list.size > 0
104
+ list.each do |job,index|
105
+ if JSON.parse(job)['status'] == $$
106
+ @r.lrem CAERUS_JOBS_PROCESSING_LIST, -1, job
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ def enque_job_in_failed_to_be_processed(error)
113
+ puts "FAILED JOB! #{@json_string} #{error.backtrace}"
114
+ failed_job_json = @json_string.dup
115
+ @r.lpush CAERUS_JOBS_FAILED_LIST, (failed_job_json << " " << error.backtrace.to_s || '')
116
+ end
117
+
118
+ def deal_with_faulty_job(e)
119
+ remove_job_from_being_processed
120
+ enque_job_in_failed_to_be_processed e
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,7 @@
1
+ module Caerus
2
+ module Redis
3
+ class Base
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ require 'redis'
2
+ module Caerus
3
+ module Redis
4
+ class RedisGateway < Base
5
+ attr_reader :redis_server
6
+
7
+ def initialize
8
+ get_server
9
+ end
10
+
11
+ def get_server
12
+ @redis_server = ::Redis.connect()
13
+ end
14
+ end
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,192 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: caerus
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Manuel Gutierrez
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ipaddress
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: typhoeus
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: colorize
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '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'
55
+ - !ruby/object:Gem::Dependency
56
+ name: redis
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
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec-core
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-expectations
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec-mocks
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec_junit_formatter
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Another Background gem
154
+ email: m.gutierrez@modcloth.com
155
+ executables:
156
+ - caerus_master
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - bin/caerus_master
161
+ - lib/caerus.rb
162
+ - lib/caerus/application/base.rb
163
+ - lib/caerus/application/master.rb
164
+ - lib/caerus/common_methods.rb
165
+ - lib/caerus/job_control.rb
166
+ - lib/caerus/redis/base.rb
167
+ - lib/caerus/redis/redis_gateway.rb
168
+ homepage: https://github.com/atilamx/caerus
169
+ licenses: []
170
+ metadata: {}
171
+ post_install_message:
172
+ rdoc_options: []
173
+ require_paths:
174
+ - lib
175
+ required_ruby_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - '>='
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ required_rubygems_version: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - '>='
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
185
+ requirements: []
186
+ rubyforge_project:
187
+ rubygems_version: 2.2.2
188
+ signing_key:
189
+ specification_version: 4
190
+ summary: Another Backgrund gem
191
+ test_files: []
192
+ has_rdoc: