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.
@@ -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