hobble 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/hobble.rb +4 -4
- data/lib/hobble/collection.rb +14 -5
- data/lib/hobble/scheduler.rb +29 -5
- metadata +69 -31
- checksums.yaml +0 -7
data/lib/hobble.rb
CHANGED
@@ -10,14 +10,14 @@ end
|
|
10
10
|
# john: [:task1, :task2, :task3]
|
11
11
|
# })
|
12
12
|
#
|
13
|
-
# schedule.run do |name,
|
14
|
-
# Task.process(
|
13
|
+
# schedule.run do |name, tasks|
|
14
|
+
# Task.process(tasks.shift, for: name)
|
15
15
|
# end
|
16
16
|
#
|
17
17
|
module Hobble
|
18
18
|
# Returns a new scheduler for the
|
19
19
|
# given grouped items.
|
20
|
-
def self.schedule(groups)
|
21
|
-
Hobble::Scheduler.new(groups)
|
20
|
+
def self.schedule(*groups, &block)
|
21
|
+
Hobble::Scheduler.new(*groups, &block)
|
22
22
|
end
|
23
23
|
end
|
data/lib/hobble/collection.rb
CHANGED
@@ -3,10 +3,13 @@ module Hobble
|
|
3
3
|
# how long they are taking to process.
|
4
4
|
class Collection
|
5
5
|
attr_reader :name, :items, :debt
|
6
|
+
attr_accessor :weight
|
7
|
+
|
8
|
+
def initialize(name, debt = 0, weight = 1)
|
9
|
+
self.weight = weight
|
6
10
|
|
7
|
-
def initialize(name, debt = 0)
|
8
11
|
@name = name
|
9
|
-
@debt = debt
|
12
|
+
@debt = debt * weight
|
10
13
|
@items = []
|
11
14
|
end
|
12
15
|
|
@@ -24,9 +27,7 @@ module Hobble
|
|
24
27
|
# Execute the given `action' in
|
25
28
|
# the account of this collection.
|
26
29
|
def clock(&action)
|
27
|
-
|
28
|
-
action.call(name, items)
|
29
|
-
@debt += (Time.now - t)
|
30
|
+
@debt += weight * time(&action)
|
30
31
|
end
|
31
32
|
|
32
33
|
# Worth giving this collection a go?
|
@@ -40,5 +41,13 @@ module Hobble
|
|
40
41
|
value = debt <=> other.debt
|
41
42
|
value == 0 ? 1 : value
|
42
43
|
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def time(&block)
|
48
|
+
t = Time.now
|
49
|
+
block.call(name, items)
|
50
|
+
Time.now - t
|
51
|
+
end
|
43
52
|
end
|
44
53
|
end
|
data/lib/hobble/scheduler.rb
CHANGED
@@ -4,9 +4,14 @@ module Hobble
|
|
4
4
|
class Scheduler
|
5
5
|
attr_reader :collections
|
6
6
|
|
7
|
-
def initialize(groups =
|
7
|
+
def initialize(groups = nil, &populator)
|
8
|
+
if groups && populator
|
9
|
+
raise(ArgumentError, 'specify block or groups, not both!')
|
10
|
+
end
|
11
|
+
|
8
12
|
@collections = []
|
9
|
-
|
13
|
+
@populator = populator
|
14
|
+
schedule(groups || {})
|
10
15
|
end
|
11
16
|
|
12
17
|
# Schedule the given groups, creating
|
@@ -17,6 +22,14 @@ module Hobble
|
|
17
22
|
end
|
18
23
|
end
|
19
24
|
|
25
|
+
# Allow different collections to accrue
|
26
|
+
# debt at different rates.
|
27
|
+
def weight!(weightings)
|
28
|
+
weightings.each do |name, weight|
|
29
|
+
collection_for(name).weight = weight
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
20
33
|
# Clears pending jobs from the scheduler,
|
21
34
|
# but doesn't wipe accrued debt.
|
22
35
|
def clear!
|
@@ -24,9 +37,15 @@ module Hobble
|
|
24
37
|
end
|
25
38
|
|
26
39
|
# Executes `action' for each job in a sensible
|
27
|
-
# order, and finishes when done.
|
28
|
-
|
29
|
-
|
40
|
+
# order, and finishes when done. An optional
|
41
|
+
# argument can be used to limit the number of runs.
|
42
|
+
def run(maximum_runs = 0, &action)
|
43
|
+
times_run = 0
|
44
|
+
loop do
|
45
|
+
times_run +=1 if ran = run_once(&action)
|
46
|
+
enough_runs = (maximum_runs > 0) && (times_run >= maximum_runs)
|
47
|
+
break if enough_runs || !ran
|
48
|
+
end
|
30
49
|
end
|
31
50
|
|
32
51
|
private
|
@@ -34,6 +53,11 @@ module Hobble
|
|
34
53
|
# Execute `action' for the next ready
|
35
54
|
# collection, if there is one.
|
36
55
|
def run_once(&action)
|
56
|
+
if @populator
|
57
|
+
clear!
|
58
|
+
schedule(@populator.call)
|
59
|
+
end
|
60
|
+
|
37
61
|
collection = next_ready
|
38
62
|
collection.clock(&action) if collection
|
39
63
|
collection
|
metadata
CHANGED
@@ -1,60 +1,98 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: hobble
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
5
11
|
platform: ruby
|
6
|
-
authors:
|
12
|
+
authors:
|
7
13
|
- Josh Pencheon
|
8
14
|
autorequire:
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
17
|
+
|
18
|
+
date: 2014-08-04 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
14
22
|
name: minitest
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 39
|
30
|
+
segments:
|
31
|
+
- 5
|
32
|
+
- 4
|
33
|
+
- 0
|
19
34
|
version: 5.4.0
|
20
35
|
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rake
|
21
39
|
prerelease: false
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
version: "0"
|
49
|
+
type: :development
|
50
|
+
version_requirements: *id002
|
27
51
|
description: A ruby debt-based scheduling implementation
|
28
52
|
email:
|
29
53
|
executables: []
|
54
|
+
|
30
55
|
extensions: []
|
56
|
+
|
31
57
|
extra_rdoc_files: []
|
32
|
-
|
58
|
+
|
59
|
+
files:
|
33
60
|
- lib/hobble.rb
|
34
|
-
- lib/hobble/collection.rb
|
35
61
|
- lib/hobble/scheduler.rb
|
62
|
+
- lib/hobble/collection.rb
|
63
|
+
has_rdoc: true
|
36
64
|
homepage: http://rubygems.org/gems/hobble
|
37
|
-
licenses:
|
65
|
+
licenses:
|
38
66
|
- MIT
|
39
|
-
metadata: {}
|
40
67
|
post_install_message:
|
41
68
|
rdoc_options: []
|
42
|
-
|
69
|
+
|
70
|
+
require_paths:
|
43
71
|
- lib
|
44
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
-
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
46
75
|
- - ">="
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
|
49
|
-
|
50
|
-
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 3
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
version: "0"
|
81
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
51
84
|
- - ">="
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
hash: 3
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
54
90
|
requirements: []
|
91
|
+
|
55
92
|
rubyforge_project:
|
56
|
-
rubygems_version:
|
93
|
+
rubygems_version: 1.6.2
|
57
94
|
signing_key:
|
58
|
-
specification_version:
|
95
|
+
specification_version: 3
|
59
96
|
summary: Debt-based scheduling
|
60
97
|
test_files: []
|
98
|
+
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 914bf3cd69368d2c16fd36fdb5169253165c68a7
|
4
|
-
data.tar.gz: 9b5357e5bae8e6e05557f687dce73a0431eee5e3
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: ec331915e446d78b9618d5d203d6d5adefaf0316550e8a68296faaeead2c97548ff16c24b2623d322a4f3b3afd5cfab82de94d8a28b96f1e2cf1d84c6fba1935
|
7
|
-
data.tar.gz: 587f81472093634c8ce540d57c1c09ebfc580a52a64e4e90b4f0e8cbffef9d3b8c8c1b9d92c5400b763b0e9684a874b26f6ddacabba011d47ce739d52592a9e7
|