puli 1.0.0 → 1.0.2

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