puli 1.0.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 04fb0e60b54cd86ecccb9f0b152af0f44aa0a296
4
- data.tar.gz: 388010ba590d7ae221a25e69fb226639d2b85f4b
2
+ SHA256:
3
+ metadata.gz: 98545dd0b66a7ddefe057d382bea0880e6cae593f991492da264c09858ea051c
4
+ data.tar.gz: ab41c7149d2c3cb9a8b8447deb75fb323c93b936f4dd59a0317f29a38e1477f1
5
5
  SHA512:
6
- metadata.gz: cc02b0fd0c578e8197df1673e72f08690de310f4327ee63719da16f0bcf33f87c2e6253dd25a4db17af43e2491ad6466cec9cf6fb733ac7fba1a97d52e296f71
7
- data.tar.gz: a7a0b6182e9db8f0f622c0fa456cbcc1450945c4eacc6897d21b07a3cbc10df14cff3c09d261d4b67269e6f094efcadc480db320f13017101a1c1a37cdacce47
6
+ metadata.gz: 33612ab356fcdc4f7e3af9d794e78bab489a516b950a0181c304a2dd7f40dabd6733c20ad5230be0ce2c5cb26c95a566b51b2993a78885b0b7d8807c8f0e0f4a
7
+ data.tar.gz: 03a9baf31d37506a1c6a4d3e9c68fb268d40b5d6bbbe840f183d712d89007c79bef61b506c9085ebcb0add9e8c0a4e64cbc0f60ca470e0852d17f63db239ffb5
@@ -0,0 +1,50 @@
1
+ # rcov generated
2
+ coverage
3
+ coverage.data
4
+
5
+ # rdoc generated
6
+ rdoc
7
+
8
+ # yard generated
9
+ doc
10
+ .yardoc
11
+
12
+ # bundler
13
+ .bundle
14
+ Gemfile.lock
15
+
16
+ # jeweler generated
17
+ pkg
18
+
19
+ # Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
20
+ #
21
+ # * Create a file at ~/.gitignore
22
+ # * Include files you want ignored
23
+ # * Run: git config --global core.excludesfile ~/.gitignore
24
+ #
25
+ # After doing this, these files will be ignored in all your git projects,
26
+ # saving you from having to 'pollute' every project you touch with them
27
+ #
28
+ # Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
29
+ #
30
+ # For MacOS:
31
+ #
32
+ #.DS_Store
33
+
34
+ # For TextMate
35
+ #*.tmproj
36
+ #tmtags
37
+
38
+ # For emacs:
39
+ #*~
40
+ #\#*
41
+ #.\#*
42
+
43
+ # For vim:
44
+ #*.swp
45
+
46
+ # For redcar:
47
+ #.redcar
48
+
49
+ # For rubinius:
50
+ #*.rbc
@@ -0,0 +1,7 @@
1
+ # 1.0.1
2
+
3
+ * Remove Jeweler and simplify gem building
4
+
5
+ # 1.0.0
6
+
7
+ * Initial release
data/Gemfile CHANGED
@@ -1,9 +1,3 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- group :development do
4
- gem "rspec", "~> 3.2", "< 3.3"
5
- gem "rdoc", "~> 3.12"
6
- gem "bundler", "~> 1.0"
7
- gem "jeweler", "~> 2", ">= 2.1.2"
8
- gem "simplecov", ">= 0"
9
- end
3
+ gemspec
data/Rakefile CHANGED
@@ -1,29 +1,9 @@
1
- # encoding: utf-8
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
2
3
 
3
- require 'rubygems'
4
- require 'bundler'
5
- begin
6
- Bundler.setup(:default, :development)
7
- rescue Bundler::BundlerError => e
8
- $stderr.puts e.message
9
- $stderr.puts "Run `bundle install` to install missing gems"
10
- exit e.status_code
11
- end
12
- require 'rake'
4
+ RSpec::Core::RakeTask.new(:spec)
13
5
 
14
- require 'jeweler'
15
- Jeweler::Tasks.new do |gem|
16
- # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
17
- gem.name = "puli"
18
- gem.homepage = "http://github.com/julik/puli"
19
- gem.license = "MIT"
20
- gem.description = 'For small concurrent activities in the open air'
21
- gem.summary = 'A tiny thread pool'
22
- gem.email = "me@julik.nl"
23
- gem.authors = ["Julik Tarkhanov"]
24
- # dependencies defined in Gemfile
25
- end
26
- Jeweler::RubygemsDotOrgTasks.new
6
+ task :default => :spec
27
7
 
28
8
  require 'rspec/core'
29
9
  require 'rspec/core/rake_task'
@@ -37,8 +17,6 @@ task :simplecov do
37
17
  Rake::Task['spec'].execute
38
18
  end
39
19
 
40
- task :default => :spec
41
-
42
20
  require 'rdoc/task'
43
21
  Rake::RDocTask.new do |rdoc|
44
22
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
@@ -1,27 +1,44 @@
1
1
  require 'thread'
2
2
 
3
3
  class Puli
4
+ VERSION = '1.0.2'
5
+
6
+ Task = Struct.new(:payload, :index)
7
+
4
8
  include Enumerable
5
-
9
+
6
10
  def initialize(num_threads: 3, tasks: [])
7
11
  @num_threads = num_threads.to_i
8
12
  @q = Queue.new
9
- tasks.map{|t| @q << t }
13
+ @index = 0
14
+ tasks.map{|t| self << t }
15
+ end
16
+
17
+ def <<(task_payload)
18
+ @index += 1
19
+ @q << Task.new(task_payload, @index)
10
20
  end
11
-
12
- def <<(task)
13
- @q << task
21
+
22
+ def map
23
+ in_execution_order = []
24
+ mux = Mutex.new
25
+ each do |*payload, index:|
26
+ result = yield(*payload)
27
+ mux.synchronize { in_execution_order << Task.new(yield(*payload), index) }
28
+ end
29
+ in_execution_order.sort_by(&:index).map(&:payload)
14
30
  end
15
-
31
+
16
32
  def each
17
33
  last_captured_error = false
34
+ in_execution_order = {}
18
35
  threads = (1..@num_threads.to_i).map do
19
36
  Thread.new do
20
37
  loop do
21
38
  break if last_captured_error
22
39
  begin
23
40
  task = @q.pop(non_block=true)
24
- yield(task)
41
+ yield(task.payload, index: task.index)
25
42
  rescue ThreadError
26
43
  break # Queue emptied
27
44
  rescue Exception => e
@@ -1,63 +1,38 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
- # stub: puli 1.0.0 ruby lib
1
+ require __dir__ + '/lib/puli'
6
2
 
7
- Gem::Specification.new do |s|
8
- s.name = "puli"
9
- s.version = "1.0.0"
3
+ Gem::Specification.new do |spec|
4
+ spec.name = "puli"
5
+ spec.version = Puli::VERSION
6
+ spec.authors = ["Julik Tarkhanov"]
7
+ spec.email = ["me@julik.nl"]
8
+ spec.summary = %q{A corded thread pool for bursty threaded workloads}
9
+ spec.description = %q{For small concurrent activities in the open air}
10
+ spec.homepage = "https://github.com/julik/puli"
11
+ spec.license = "MIT"
10
12
 
11
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
- s.require_paths = ["lib"]
13
- s.authors = ["Julik Tarkhanov"]
14
- s.date = "2016-11-11"
15
- s.description = "For small concurrent activities in the open air"
16
- s.email = "me@julik.nl"
17
- s.extra_rdoc_files = [
18
- "LICENSE.txt",
19
- "README.md"
20
- ]
21
- s.files = [
22
- ".document",
23
- ".rspec",
24
- "Gemfile",
25
- "LICENSE.txt",
26
- "README.md",
27
- "Rakefile",
28
- "VERSION",
29
- "lib/puli.rb",
30
- "puli.gemspec",
31
- "spec/puli_spec.rb",
32
- "spec/spec_helper.rb"
33
- ]
34
- s.homepage = "http://github.com/julik/puli"
35
- s.licenses = ["MIT"]
36
- s.rubygems_version = "2.4.5.1"
37
- s.summary = "A tiny thread pool"
13
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
14
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
15
+ if spec.respond_to?(:metadata)
16
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
38
17
 
39
- if s.respond_to? :specification_version then
40
- s.specification_version = 4
41
-
42
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
- s.add_development_dependency(%q<rspec>, ["< 3.3", "~> 3.2"])
44
- s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
45
- s.add_development_dependency(%q<bundler>, ["~> 1.0"])
46
- s.add_development_dependency(%q<jeweler>, [">= 2.1.2", "~> 2"])
47
- s.add_development_dependency(%q<simplecov>, [">= 0"])
48
- else
49
- s.add_dependency(%q<rspec>, ["< 3.3", "~> 3.2"])
50
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
51
- s.add_dependency(%q<bundler>, ["~> 1.0"])
52
- s.add_dependency(%q<jeweler>, [">= 2.1.2", "~> 2"])
53
- s.add_dependency(%q<simplecov>, [">= 0"])
54
- end
18
+ spec.metadata["homepage_uri"] = spec.homepage
19
+ spec.metadata["source_code_uri"] = "https://github.com/julik/puli"
20
+ spec.metadata["changelog_uri"] = "https://raw.githubusercontent.com/julik/puli/master/CHANGELOG.md"
55
21
  else
56
- s.add_dependency(%q<rspec>, ["< 3.3", "~> 3.2"])
57
- s.add_dependency(%q<rdoc>, ["~> 3.12"])
58
- s.add_dependency(%q<bundler>, ["~> 1.0"])
59
- s.add_dependency(%q<jeweler>, [">= 2.1.2", "~> 2"])
60
- s.add_dependency(%q<simplecov>, [">= 0"])
22
+ raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
61
23
  end
62
- end
63
24
 
25
+ # Specify which files should be added to the gem when it is released.
26
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
28
+ `git ls-files -z`.split("\x0")
29
+ end
30
+ spec.bindir = "exe"
31
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
+ spec.require_paths = ["lib"]
33
+
34
+ spec.add_development_dependency "bundler"
35
+ spec.add_development_dependency "rake", "~> 10.0"
36
+ spec.add_development_dependency "rspec", "~> 3.0"
37
+ spec.add_development_dependency "simplecov"
38
+ end
@@ -33,6 +33,25 @@ describe 'Puli' do
33
33
  end
34
34
  end
35
35
 
36
+ it 'allows mapping over the result' do
37
+ p = Puli.new(num_threads: 4)
38
+ 20.times {|i| p << i }
39
+ results = p.map{|task| task ** 2 }
40
+ sorted = results.sort
41
+ expect(sorted.length).to eq(20)
42
+ expect(sorted[-1]).to eq(19 ** 2)
43
+ end
44
+
45
+ it 'maps over the result in order, even when iteration is executed out of order' do
46
+ order_as_submitted = (1..64).to_a
47
+ p = Puli.new(num_threads: 4, tasks: order_as_submitted)
48
+ order_of_execution = p.map do |number|
49
+ sleep(rand / 14)
50
+ number
51
+ end
52
+ expect(order_of_execution).to eq(order_as_submitted)
53
+ end
54
+
36
55
  it 'allows mapping over the result' do
37
56
  p = Puli.new(num_threads: 4)
38
57
  20.times {|i| p << i }
metadata CHANGED
@@ -1,83 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julik Tarkhanov
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2016-11-11 00:00:00.000000000 Z
11
+ date: 2019-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rspec
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "<"
18
- - !ruby/object:Gem::Version
19
- version: '3.3'
20
- - - "~>"
21
- - !ruby/object:Gem::Version
22
- version: '3.2'
23
- type: :development
24
- prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
27
- - - "<"
28
- - !ruby/object:Gem::Version
29
- version: '3.3'
30
- - - "~>"
31
- - !ruby/object:Gem::Version
32
- version: '3.2'
33
- - !ruby/object:Gem::Dependency
34
- name: rdoc
14
+ name: bundler
35
15
  requirement: !ruby/object:Gem::Requirement
36
16
  requirements:
37
- - - "~>"
17
+ - - ">="
38
18
  - !ruby/object:Gem::Version
39
- version: '3.12'
19
+ version: '0'
40
20
  type: :development
41
21
  prerelease: false
42
22
  version_requirements: !ruby/object:Gem::Requirement
43
23
  requirements:
44
- - - "~>"
24
+ - - ">="
45
25
  - !ruby/object:Gem::Version
46
- version: '3.12'
26
+ version: '0'
47
27
  - !ruby/object:Gem::Dependency
48
- name: bundler
28
+ name: rake
49
29
  requirement: !ruby/object:Gem::Requirement
50
30
  requirements:
51
31
  - - "~>"
52
32
  - !ruby/object:Gem::Version
53
- version: '1.0'
33
+ version: '10.0'
54
34
  type: :development
55
35
  prerelease: false
56
36
  version_requirements: !ruby/object:Gem::Requirement
57
37
  requirements:
58
38
  - - "~>"
59
39
  - !ruby/object:Gem::Version
60
- version: '1.0'
40
+ version: '10.0'
61
41
  - !ruby/object:Gem::Dependency
62
- name: jeweler
42
+ name: rspec
63
43
  requirement: !ruby/object:Gem::Requirement
64
44
  requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- version: 2.1.2
68
45
  - - "~>"
69
46
  - !ruby/object:Gem::Version
70
- version: '2'
47
+ version: '3.0'
71
48
  type: :development
72
49
  prerelease: false
73
50
  version_requirements: !ruby/object:Gem::Requirement
74
51
  requirements:
75
- - - ">="
76
- - !ruby/object:Gem::Version
77
- version: 2.1.2
78
52
  - - "~>"
79
53
  - !ruby/object:Gem::Version
80
- version: '2'
54
+ version: '3.0'
81
55
  - !ruby/object:Gem::Dependency
82
56
  name: simplecov
83
57
  requirement: !ruby/object:Gem::Requirement
@@ -93,28 +67,32 @@ dependencies:
93
67
  - !ruby/object:Gem::Version
94
68
  version: '0'
95
69
  description: For small concurrent activities in the open air
96
- email: me@julik.nl
70
+ email:
71
+ - me@julik.nl
97
72
  executables: []
98
73
  extensions: []
99
- extra_rdoc_files:
100
- - LICENSE.txt
101
- - README.md
74
+ extra_rdoc_files: []
102
75
  files:
103
76
  - ".document"
77
+ - ".gitignore"
104
78
  - ".rspec"
79
+ - CHANGELOG.md
105
80
  - Gemfile
106
81
  - LICENSE.txt
107
82
  - README.md
108
83
  - Rakefile
109
- - VERSION
110
84
  - lib/puli.rb
111
85
  - puli.gemspec
112
86
  - spec/puli_spec.rb
113
87
  - spec/spec_helper.rb
114
- homepage: http://github.com/julik/puli
88
+ homepage: https://github.com/julik/puli
115
89
  licenses:
116
90
  - MIT
117
- metadata: {}
91
+ metadata:
92
+ allowed_push_host: https://rubygems.org
93
+ homepage_uri: https://github.com/julik/puli
94
+ source_code_uri: https://github.com/julik/puli
95
+ changelog_uri: https://raw.githubusercontent.com/julik/puli/master/CHANGELOG.md
118
96
  post_install_message:
119
97
  rdoc_options: []
120
98
  require_paths:
@@ -130,9 +108,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
130
108
  - !ruby/object:Gem::Version
131
109
  version: '0'
132
110
  requirements: []
133
- rubyforge_project:
134
- rubygems_version: 2.4.5.1
111
+ rubygems_version: 3.0.6
135
112
  signing_key:
136
113
  specification_version: 4
137
- summary: A tiny thread pool
114
+ summary: A corded thread pool for bursty threaded workloads
138
115
  test_files: []
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.0.0