tins 1.37.1 → 1.39.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 45cdce796cfd7bd217b41dde419d3a3399e6b06a71a3aad809ed1ffd81fee1b6
4
- data.tar.gz: cc3474c0776f6feaa025dedf5ae466bad277de63b9ba34343a43e8c5e281c531
3
+ metadata.gz: 003ee0af06537e00a12e3068027b5ee8e8fd68838d744498e404b287c1f07cb6
4
+ data.tar.gz: b3c783cf54b9e94d8efdd65adf9b8d2dfe6d699d497122f83ba0ce228bd4ada5
5
5
  SHA512:
6
- metadata.gz: 9506088d3c0c744bc706753accf329f2995d20400a43fdc738c31d4965ff66266d2d2143796f2812daa3adefedcdf49281eb0ba209f7b0d474c857ca707c4d82
7
- data.tar.gz: af4c092a1bf371da47fa061565d3fed7a65132231762bfefb566c126137febf4fb212535581928d068ac607beb5cd83a55f338ef345dfcca2a59e443f9ce7a23
6
+ metadata.gz: 3714cbbdeead662e2e2897a9952523943a074fb9da79e7c97fe4843e246ee25e84b56eaff2bfa015652df247b0bfb08bbde42cfe22a608346998f8b5b00cae27
7
+ data.tar.gz: 39b82ccaed374bb3f2dce13c866c11e15fda8012fde8fdb7edba448b68bf081657143242da107648233ee78ba9d7fcb4169279f78d35a9e874bd934c94b7f929
data/CHANGES.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changes
2
2
 
3
+ ## 2025-01-04 v1.38.0
4
+
5
+ * Improved Tins::Limited concurrency handling:
6
+ * Added `execute` method for task submission with a block
7
+ * Changed `process` method to manage thread execution and queue management
8
+ * Introduced `stop` method to signal processing termination
9
+ * Modified test cases in `limited_test.rb` to accommodate new functionality
10
+ * Added `ensure` clause to decrement counter and signal continuation after
11
+ block execution
12
+ * Added support for Ruby **3.4** Alpine image:
13
+ * Updated `.all_images.yml` to include Ruby **3.4**-alpine environment
14
+ * Added `ruby:3.4-alpine` to the list of supported images
15
+ * Now uses **3.4** instead of **3.3**, **3.2**, and **3.1** for ruby versions
16
+
3
17
  ## 2024-12-13 v1.37.1
4
18
 
5
19
  * Renamed `ZERO` and `BINARY` constants to `ZERO_RE` and `BINARY_RE` to avoid
data/lib/tins/limited.rb CHANGED
@@ -3,46 +3,73 @@ require 'thread'
3
3
  module Tins
4
4
  class Limited
5
5
  # Create a Limited instance, that runs _maximum_ threads at most.
6
- def initialize(maximum)
7
- @mutex = Mutex.new
8
- @continue = ConditionVariable.new
9
- @maximum = Integer(maximum)
6
+ def initialize(maximum, name: nil)
7
+ @maximum = Integer(maximum)
10
8
  raise ArgumentError, "maximum < 1" if @maximum < 1
11
- @count = 0
12
- @tg = ThreadGroup.new
9
+ @mutex = Mutex.new
10
+ @continue = ConditionVariable.new
11
+ @name = name
12
+ @count = 0
13
+ @tg = ThreadGroup.new
13
14
  end
14
15
 
15
16
  # The maximum number of worker threads.
16
17
  attr_reader :maximum
17
18
 
18
19
  # Execute _maximum_ number of threads in parallel.
19
- def execute
20
- @mutex.synchronize do
20
+ def execute(&block)
21
+ @tasks or raise ArgumentError, "start processing first"
22
+ @tasks << block
23
+ end
24
+
25
+ def process
26
+ @tasks = Queue.new
27
+ @executor = create_executor
28
+ @executor.name = @name if @name
29
+ catch :stop do
21
30
  loop do
22
- if @count < @maximum
23
- @count += 1
24
- Thread.new do
25
- @tg.add Thread.current
26
- yield
27
- @mutex.synchronize { @count -= 1 }
28
- @continue.signal
29
- end
30
- return
31
- else
32
- @continue.wait(@mutex)
33
- end
31
+ yield self
34
32
  end
33
+ ensure
34
+ wait until done?
35
+ @executor.kill
35
36
  end
36
37
  end
37
38
 
39
+ def stop
40
+ throw :stop
41
+ end
42
+
43
+ private
44
+
45
+ def done?
46
+ @tasks.empty? && @tg.list.empty?
47
+ end
48
+
38
49
  def wait
39
50
  @tg.list.each(&:join)
40
51
  end
41
52
 
42
- def process
43
- yield self
44
- ensure
45
- wait
53
+ def create_executor
54
+ Thread.new do
55
+ @mutex.synchronize do
56
+ loop do
57
+ if @count < @maximum
58
+ task = @tasks.pop
59
+ @count += 1
60
+ Thread.new do
61
+ @tg.add Thread.current
62
+ task.(Thread.current)
63
+ ensure
64
+ @count -= 1
65
+ @continue.signal
66
+ end
67
+ else
68
+ @continue.wait(@mutex)
69
+ end
70
+ end
71
+ end
72
+ end
46
73
  end
47
74
  end
48
75
  end
data/lib/tins/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Tins
2
2
  # Tins version
3
- VERSION = '1.37.1'
3
+ VERSION = '1.39.0'
4
4
  VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -2,36 +2,21 @@ require 'test_helper'
2
2
 
3
3
  module Tins
4
4
  class LimitedTest < Test::Unit::TestCase
5
- def test_limited
5
+ def test_process_with
6
6
  count = {}
7
- limited = Tins::Limited.new(5)
8
- 5.times do
9
- limited.execute do
10
- count[Thread.current] = true
11
- sleep 1
12
- end
13
- end
14
- until count.size >= 5
15
- sleep 0.1
16
- end
17
- assert_equal 5, count.keys.uniq.size
18
- assert_equal 5, limited.wait.size
19
- end
20
-
21
- def test_process
22
- count = {}
23
- Tins::Limited.new(5).process do |limited|
24
- 5.times do
7
+ Tins::Limited.new(5, name: 'sleeper').process do |limited|
8
+ 10.times do
25
9
  limited.execute do
26
10
  count[Thread.current] = true
27
11
  sleep 1
28
12
  end
29
13
  end
30
- until count.size >= 5
14
+ until count.size >= 10
31
15
  sleep 0.1
32
16
  end
33
- assert_equal 5, count.keys.uniq.size
17
+ limited.stop
34
18
  end
19
+ assert_equal 10, count.keys.uniq.size
35
20
  end
36
21
  end
37
22
  end
data/tins.gemspec CHANGED
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: tins 1.37.1 ruby lib
2
+ # stub: tins 1.39.0 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "tins".freeze
6
- s.version = "1.37.1".freeze
6
+ s.version = "1.39.0".freeze
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Florian Frank".freeze]
11
- s.date = "2024-12-13"
11
+ s.date = "1980-01-02"
12
12
  s.description = "All the stuff that isn't good/big enough for a real library.".freeze
13
13
  s.email = "flori@ping.de".freeze
14
14
  s.extra_rdoc_files = ["README.md".freeze, "lib/dslkit.rb".freeze, "lib/dslkit/polite.rb".freeze, "lib/dslkit/rude.rb".freeze, "lib/spruz.rb".freeze, "lib/tins.rb".freeze, "lib/tins/alias.rb".freeze, "lib/tins/annotate.rb".freeze, "lib/tins/ask_and_send.rb".freeze, "lib/tins/attempt.rb".freeze, "lib/tins/bijection.rb".freeze, "lib/tins/case_predicate.rb".freeze, "lib/tins/complete.rb".freeze, "lib/tins/concern.rb".freeze, "lib/tins/count_by.rb".freeze, "lib/tins/date_dummy.rb".freeze, "lib/tins/date_time_dummy.rb".freeze, "lib/tins/deep_const_get.rb".freeze, "lib/tins/deep_dup.rb".freeze, "lib/tins/deprecate.rb".freeze, "lib/tins/dslkit.rb".freeze, "lib/tins/duration.rb".freeze, "lib/tins/expose.rb".freeze, "lib/tins/extract_last_argument_options.rb".freeze, "lib/tins/file_binary.rb".freeze, "lib/tins/find.rb".freeze, "lib/tins/generator.rb".freeze, "lib/tins/go.rb".freeze, "lib/tins/hash_bfs.rb".freeze, "lib/tins/hash_symbolize_keys_recursive.rb".freeze, "lib/tins/hash_union.rb".freeze, "lib/tins/if_predicate.rb".freeze, "lib/tins/implement.rb".freeze, "lib/tins/limited.rb".freeze, "lib/tins/lines_file.rb".freeze, "lib/tins/lru_cache.rb".freeze, "lib/tins/memoize.rb".freeze, "lib/tins/method_description.rb".freeze, "lib/tins/minimize.rb".freeze, "lib/tins/module_group.rb".freeze, "lib/tins/named_set.rb".freeze, "lib/tins/null.rb".freeze, "lib/tins/once.rb".freeze, "lib/tins/p.rb".freeze, "lib/tins/partial_application.rb".freeze, "lib/tins/proc_compose.rb".freeze, "lib/tins/proc_prelude.rb".freeze, "lib/tins/range_plus.rb".freeze, "lib/tins/require_maybe.rb".freeze, "lib/tins/responding.rb".freeze, "lib/tins/secure_write.rb".freeze, "lib/tins/sexy_singleton.rb".freeze, "lib/tins/string_byte_order_mark.rb".freeze, "lib/tins/string_camelize.rb".freeze, "lib/tins/string_underscore.rb".freeze, "lib/tins/string_version.rb".freeze, "lib/tins/subhash.rb".freeze, "lib/tins/temp_io.rb".freeze, "lib/tins/temp_io_enum.rb".freeze, "lib/tins/terminal.rb".freeze, "lib/tins/thread_local.rb".freeze, "lib/tins/time_dummy.rb".freeze, "lib/tins/timed_cache.rb".freeze, "lib/tins/to.rb".freeze, "lib/tins/to_proc.rb".freeze, "lib/tins/token.rb".freeze, "lib/tins/uniq_by.rb".freeze, "lib/tins/unit.rb".freeze, "lib/tins/version.rb".freeze, "lib/tins/write.rb".freeze, "lib/tins/xt.rb".freeze, "lib/tins/xt/annotate.rb".freeze, "lib/tins/xt/ask_and_send.rb".freeze, "lib/tins/xt/attempt.rb".freeze, "lib/tins/xt/blank.rb".freeze, "lib/tins/xt/case_predicate.rb".freeze, "lib/tins/xt/complete.rb".freeze, "lib/tins/xt/concern.rb".freeze, "lib/tins/xt/count_by.rb".freeze, "lib/tins/xt/date_dummy.rb".freeze, "lib/tins/xt/date_time_dummy.rb".freeze, "lib/tins/xt/deep_const_get.rb".freeze, "lib/tins/xt/deep_dup.rb".freeze, "lib/tins/xt/deprecate.rb".freeze, "lib/tins/xt/dslkit.rb".freeze, "lib/tins/xt/expose.rb".freeze, "lib/tins/xt/extract_last_argument_options.rb".freeze, "lib/tins/xt/file_binary.rb".freeze, "lib/tins/xt/full.rb".freeze, "lib/tins/xt/hash_bfs.rb".freeze, "lib/tins/xt/hash_symbolize_keys_recursive.rb".freeze, "lib/tins/xt/hash_union.rb".freeze, "lib/tins/xt/if_predicate.rb".freeze, "lib/tins/xt/implement.rb".freeze, "lib/tins/xt/irb.rb".freeze, "lib/tins/xt/method_description.rb".freeze, "lib/tins/xt/named.rb".freeze, "lib/tins/xt/null.rb".freeze, "lib/tins/xt/p.rb".freeze, "lib/tins/xt/partial_application.rb".freeze, "lib/tins/xt/proc_compose.rb".freeze, "lib/tins/xt/proc_prelude.rb".freeze, "lib/tins/xt/range_plus.rb".freeze, "lib/tins/xt/require_maybe.rb".freeze, "lib/tins/xt/responding.rb".freeze, "lib/tins/xt/secure_write.rb".freeze, "lib/tins/xt/sexy_singleton.rb".freeze, "lib/tins/xt/string.rb".freeze, "lib/tins/xt/string_byte_order_mark.rb".freeze, "lib/tins/xt/string_camelize.rb".freeze, "lib/tins/xt/string_underscore.rb".freeze, "lib/tins/xt/string_version.rb".freeze, "lib/tins/xt/subhash.rb".freeze, "lib/tins/xt/temp_io.rb".freeze, "lib/tins/xt/time_dummy.rb".freeze, "lib/tins/xt/time_freezer.rb".freeze, "lib/tins/xt/to.rb".freeze, "lib/tins/xt/uniq_by.rb".freeze, "lib/tins/xt/write.rb".freeze]
@@ -17,13 +17,13 @@ Gem::Specification.new do |s|
17
17
  s.licenses = ["MIT".freeze]
18
18
  s.rdoc_options = ["--title".freeze, "Tins - Useful stuff.".freeze, "--main".freeze, "README.md".freeze]
19
19
  s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze)
20
- s.rubygems_version = "3.5.23".freeze
20
+ s.rubygems_version = "3.6.9".freeze
21
21
  s.summary = "Useful stuff.".freeze
22
22
  s.test_files = ["tests/annotate_test.rb".freeze, "tests/ask_and_send_test.rb".freeze, "tests/attempt_test.rb".freeze, "tests/bijection_test.rb".freeze, "tests/blank_full_test.rb".freeze, "tests/case_predicate_test.rb".freeze, "tests/concern_test.rb".freeze, "tests/count_by_test.rb".freeze, "tests/date_dummy_test.rb".freeze, "tests/date_time_dummy_test.rb".freeze, "tests/deep_const_get_test.rb".freeze, "tests/deep_dup_test.rb".freeze, "tests/delegate_test.rb".freeze, "tests/deprecate_test.rb".freeze, "tests/dslkit_test.rb".freeze, "tests/duration_test.rb".freeze, "tests/dynamic_scope_test.rb".freeze, "tests/expose_test.rb".freeze, "tests/extract_last_argument_options_test.rb".freeze, "tests/file_binary_test.rb".freeze, "tests/find_test.rb".freeze, "tests/from_module_test.rb".freeze, "tests/generator_test.rb".freeze, "tests/go_test.rb".freeze, "tests/hash_bfs_test.rb".freeze, "tests/hash_symbolize_keys_recursive_test.rb".freeze, "tests/hash_union_test.rb".freeze, "tests/if_predicate_test.rb".freeze, "tests/implement_test.rb".freeze, "tests/limited_test.rb".freeze, "tests/lines_file_test.rb".freeze, "tests/lru_cache_test.rb".freeze, "tests/memoize_test.rb".freeze, "tests/method_description_test.rb".freeze, "tests/minimize_test.rb".freeze, "tests/module_group_test.rb".freeze, "tests/named_set_test.rb".freeze, "tests/named_test.rb".freeze, "tests/null_test.rb".freeze, "tests/p_test.rb".freeze, "tests/partial_application_test.rb".freeze, "tests/proc_compose_test.rb".freeze, "tests/proc_prelude_test.rb".freeze, "tests/range_plus_test.rb".freeze, "tests/require_maybe_test.rb".freeze, "tests/responding_test.rb".freeze, "tests/rotate_test.rb".freeze, "tests/scope_test.rb".freeze, "tests/secure_write_test.rb".freeze, "tests/sexy_singleton_test.rb".freeze, "tests/string_byte_order_mark_test.rb".freeze, "tests/string_camelize_test.rb".freeze, "tests/string_underscore_test.rb".freeze, "tests/string_version_test.rb".freeze, "tests/subhash_test.rb".freeze, "tests/temp_io_test.rb".freeze, "tests/test_helper.rb".freeze, "tests/time_dummy_test.rb".freeze, "tests/time_freezer_test.rb".freeze, "tests/to_test.rb".freeze, "tests/token_test.rb".freeze, "tests/uniq_by_test.rb".freeze, "tests/unit_test.rb".freeze, "tests/annotate_test.rb".freeze, "tests/ask_and_send_test.rb".freeze, "tests/attempt_test.rb".freeze, "tests/bijection_test.rb".freeze, "tests/blank_full_test.rb".freeze, "tests/case_predicate_test.rb".freeze, "tests/concern_test.rb".freeze, "tests/count_by_test.rb".freeze, "tests/date_dummy_test.rb".freeze, "tests/date_time_dummy_test.rb".freeze, "tests/deep_const_get_test.rb".freeze, "tests/deep_dup_test.rb".freeze, "tests/delegate_test.rb".freeze, "tests/deprecate_test.rb".freeze, "tests/dslkit_test.rb".freeze, "tests/duration_test.rb".freeze, "tests/dynamic_scope_test.rb".freeze, "tests/expose_test.rb".freeze, "tests/extract_last_argument_options_test.rb".freeze, "tests/file_binary_test.rb".freeze, "tests/find_test.rb".freeze, "tests/from_module_test.rb".freeze, "tests/generator_test.rb".freeze, "tests/go_test.rb".freeze, "tests/hash_bfs_test.rb".freeze, "tests/hash_symbolize_keys_recursive_test.rb".freeze, "tests/hash_union_test.rb".freeze, "tests/if_predicate_test.rb".freeze, "tests/implement_test.rb".freeze, "tests/limited_test.rb".freeze, "tests/lines_file_test.rb".freeze, "tests/lru_cache_test.rb".freeze, "tests/memoize_test.rb".freeze, "tests/method_description_test.rb".freeze, "tests/minimize_test.rb".freeze, "tests/module_group_test.rb".freeze, "tests/named_set_test.rb".freeze, "tests/named_test.rb".freeze, "tests/null_test.rb".freeze, "tests/p_test.rb".freeze, "tests/partial_application_test.rb".freeze, "tests/proc_compose_test.rb".freeze, "tests/proc_prelude_test.rb".freeze, "tests/range_plus_test.rb".freeze, "tests/require_maybe_test.rb".freeze, "tests/responding_test.rb".freeze, "tests/rotate_test.rb".freeze, "tests/scope_test.rb".freeze, "tests/secure_write_test.rb".freeze, "tests/sexy_singleton_test.rb".freeze, "tests/string_byte_order_mark_test.rb".freeze, "tests/string_camelize_test.rb".freeze, "tests/string_underscore_test.rb".freeze, "tests/string_version_test.rb".freeze, "tests/subhash_test.rb".freeze, "tests/temp_io_test.rb".freeze, "tests/time_dummy_test.rb".freeze, "tests/time_freezer_test.rb".freeze, "tests/to_test.rb".freeze, "tests/token_test.rb".freeze, "tests/uniq_by_test.rb".freeze, "tests/unit_test.rb".freeze]
23
23
 
24
24
  s.specification_version = 4
25
25
 
26
- s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.19".freeze])
26
+ s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 1.21".freeze])
27
27
  s.add_development_dependency(%q<all_images>.freeze, [">= 0".freeze])
28
28
  s.add_development_dependency(%q<debug>.freeze, [">= 0".freeze])
29
29
  s.add_development_dependency(%q<term-ansicolor>.freeze, [">= 0".freeze])
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tins
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.37.1
4
+ version: 1.39.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-12-13 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: gem_hadar
@@ -16,14 +15,14 @@ dependencies:
16
15
  requirements:
17
16
  - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '1.19'
18
+ version: '1.21'
20
19
  type: :development
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - "~>"
25
24
  - !ruby/object:Gem::Version
26
- version: '1.19'
25
+ version: '1.21'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: all_images
29
28
  requirement: !ruby/object:Gem::Requirement
@@ -463,7 +462,6 @@ homepage: https://github.com/flori/tins
463
462
  licenses:
464
463
  - MIT
465
464
  metadata: {}
466
- post_install_message:
467
465
  rdoc_options:
468
466
  - "--title"
469
467
  - Tins - Useful stuff.
@@ -482,8 +480,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
482
480
  - !ruby/object:Gem::Version
483
481
  version: '0'
484
482
  requirements: []
485
- rubygems_version: 3.5.23
486
- signing_key:
483
+ rubygems_version: 3.6.9
487
484
  specification_version: 4
488
485
  summary: Useful stuff.
489
486
  test_files: