hobble 0.0.1 → 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.
- 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
|