jobmaster 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/job_master/job_methods.rb +134 -0
  3. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5ba10006ad5958002049e49b7493e4a33e75d1b7
4
- data.tar.gz: 959fdef93a1f534139d207ecc384d0550f22574d
3
+ metadata.gz: 49a526c44aa912126b20e09c67fa3ae38955822d
4
+ data.tar.gz: b6c53cd48c38edccd9ee8d5e853b06727693b9e6
5
5
  SHA512:
6
- metadata.gz: ca906eb1d84569a70c2c419d614db1ad92459f9fae6a4baaf128f73718f6408bc9e600b5448b34fe9b034e998f9e0b5f4f990a968fd0a823ab234b2f3a67256b
7
- data.tar.gz: 8e99588ac3b62b249d52627977ecabd665fc907cda2347acf19eb0d6f0809ef590146c47156d8d8d42507a3727c62c582cf42d8dcb30f6568e511722b536865c
6
+ metadata.gz: a422accc2acb60a84223af4e054a2defbda10e5959e7a65b01abb95ddf221147c3d1240dc6ee64d53e27633bff25c9b985d382bd8ea42e82f346f447cc63a488
7
+ data.tar.gz: be62c7db023ebba3cfdcdd035849cee4d28c8b99ef56358109270fd5173c8529aa6151f13a10a01b2052fdc3aeeebefe939399272a980575f69fb49fe749ef90
@@ -0,0 +1,134 @@
1
+ class JobMaster
2
+
3
+ def master_cycle (sleep)
4
+
5
+ @schedule = database[:job_log].where(status: 'active').order(:frequency).reverse
6
+ @time_log = {}
7
+
8
+ stop = false
9
+
10
+ until stop
11
+ @schedule.each { |job|
12
+ program = job[:program]
13
+ if job[:frequency] == 0
14
+ step_single(program)
15
+ else
16
+ @time_log[program] ||= Time.now
17
+ difference = (Time.now - @time_log[program]) / 60
18
+ if difference > job[:frequency]
19
+ step_single(program)
20
+ @time_log[program] = Time.now
21
+ end
22
+ end
23
+ sleep(sleep)
24
+ }
25
+ end
26
+
27
+ end
28
+
29
+ def start_single (prog_name , minutes = 10, sleep = 3)
30
+
31
+ @start_time = Time.now
32
+ set_up_job(prog_name)
33
+
34
+ unit_time = 0.0
35
+
36
+ while (Time.now - @start_time) / 60 < minutes
37
+
38
+ unless unit_time == 0.0
39
+ update_job(unit_time)
40
+ end
41
+
42
+ unit_start = Time.now
43
+ unit = next_unit
44
+
45
+ break if unit.nil?
46
+
47
+ @websites.first.send(prog_name.to_sym, unit)
48
+
49
+ puts unit_time = (Time.now - unit_start) / 60
50
+ sleep(sleep)
51
+ unit_time += sleep / 60
52
+ end
53
+
54
+ end
55
+
56
+ def step_single (prog_name)
57
+
58
+ @start_time = Time.now
59
+ set_up_job(prog_name)
60
+ unit = next_unit
61
+ return false if unit.nil?
62
+
63
+ @websites.first.send(prog_name.to_sym, unit)
64
+ puts unit_time = (Time.now - @start_time) / 60
65
+ update_job(unit_time)
66
+
67
+ end
68
+
69
+ def set_up_job (program)
70
+ last_matching = programs_db.where(program: program, @myself => Sequel.pg_array_op(:machines).any).order(:id).last
71
+
72
+ @program_id = last_matching[:id]
73
+ the_job = jobs_db.where(program: program, constraints: @program_id).order(:id).last
74
+
75
+ if the_job.nil?
76
+ units = self.send(last_matching[:method].to_sym, last_matching[:constraints].merge(program: program))
77
+ insert_job_details(program, units, last_matching[:machines])
78
+ end
79
+
80
+ @job_id = the_job[:id]
81
+ end
82
+
83
+ def insert_job_details (program, units, machines)
84
+
85
+ time_share = machines.inject({}) { |acc, m|
86
+ acc.store(m, 0)
87
+ acc
88
+ }
89
+
90
+ details = {
91
+ program: program,
92
+ created: Time.now,
93
+ constraints: @program_id,
94
+ units: Sequel.pg_array(units),
95
+ size: units.size,
96
+ total_minutes: 0.0,
97
+ time_share: Sequel.hstore(time_share),
98
+ unit_checkout: Sequel.hstore({:apples => :bananas})
99
+ }
100
+ jobs_db.insert(details)
101
+ end
102
+
103
+ def next_unit
104
+ checkout = jobs_db[id: @job_id][:unit_checkout].to_hash
105
+
106
+ if checkout.keys.include?(@myself)
107
+ checkout[@myself]
108
+ else
109
+ units = jobs_db[id: @job_id][:units]
110
+ return false if units.empty?
111
+ next_unit = units.pop
112
+ jobs_db.where(id: @job_id).update(
113
+ :units => units,
114
+ :unit_checkout => Sequel.hstore(Sequel.expr(:unit_checkout)).merge(@myself => next_unit))
115
+ next_unit
116
+ end
117
+ end
118
+
119
+ def update_job (unit_time)
120
+
121
+ time_share = jobs_db[id: @job_id][:time_share].to_hash
122
+ time_share.find_add!(@myself, unit_time)
123
+
124
+ unit_checkout = jobs_db[id: @job_id][:unit_checkout].to_hash
125
+ unit_checkout.delete!(@myself)
126
+
127
+ jobs_db.where(id: @job_id).update(
128
+ :total_minutes => Sequel.expr(:total_minutes) + unit_time,
129
+ :time_share => Sequel.hstore(time_share),
130
+ :unit_checkout => Sequel.hstore(unit_checkout)
131
+ )
132
+ end
133
+
134
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jobmaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eugene Lai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-11 00:00:00.000000000 Z
11
+ date: 2016-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: flex_core
@@ -46,6 +46,7 @@ extra_rdoc_files: []
46
46
  files:
47
47
  - lib/job_master.rb
48
48
  - lib/job_master/gen_methods.rb
49
+ - lib/job_master/job_methods.rb
49
50
  - lib/job_master/stealth.rb
50
51
  homepage:
51
52
  licenses: []
@@ -66,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
66
67
  version: '0'
67
68
  requirements: []
68
69
  rubyforge_project:
69
- rubygems_version: 2.5.2
70
+ rubygems_version: 2.6.1
70
71
  signing_key:
71
72
  specification_version: 4
72
73
  summary: Job manager for multi-website automated scraping