hobble 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,14 +10,14 @@ end
10
10
  # john: [:task1, :task2, :task3]
11
11
  # })
12
12
  #
13
- # schedule.run do |name, task|
14
- # Task.process(task, for: name)
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
@@ -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
- t = Time.now
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
@@ -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
- schedule(groups)
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
- def run(&action)
29
- loop { break unless run_once(&action) }
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
- version: 0.0.1
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
- date: 2014-08-02 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
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
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
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
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 5.4.0
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
- files:
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
- require_paths:
69
+
70
+ require_paths:
43
71
  - lib
44
- required_ruby_version: !ruby/object:Gem::Requirement
45
- requirements:
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
46
75
  - - ">="
47
- - !ruby/object:Gem::Version
48
- version: '0'
49
- required_rubygems_version: !ruby/object:Gem::Requirement
50
- requirements:
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
- version: '0'
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: 2.2.2
93
+ rubygems_version: 1.6.2
57
94
  signing_key:
58
- specification_version: 4
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