tins 1.51.0 → 1.51.1

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: '0842c03ef937e88e3983fe986604f369f741c783d5aeb1f73a27d50f98512265'
4
- data.tar.gz: aeaf30f783e232586deb4b60017623539d37973a035331050c5d4c75c9af1f72
3
+ metadata.gz: dce6e60b660a0f614d5e3964270e99aaff36fa473a54efa387de8e17fc0e331b
4
+ data.tar.gz: f6f4c1fcad05d874d6e20897c42f211cd1d7ed6892ef9d539816b7641d56129c
5
5
  SHA512:
6
- metadata.gz: fc76519aa6e09ff9a9e8094712070f71be2f34540a4001af2f6f07c5de357ac8642230828d543ffa53219936bf877db88e02e6dfb3a6f713e312b236b45e3d2a
7
- data.tar.gz: 9e65ecc2199824d5efafb4502c9c5bef6322c5e9cad8f9f72504bb0571d09b15251e539db7b6336cad0af161e382bb2bf473fcaf720d2f146a6dba3b2757f84f
6
+ metadata.gz: 3e33a9d1241117807d6dcba8fa72087d57fa70587015e2fb6988f6221ac00054149c5770ef856a83a1b1a478a6cc27aca117b9f0f23cf582867200159d4d486b
7
+ data.tar.gz: 6a3310dec353f33acf140b4e971e7be1269bb413fd2b3b13d29fc777573d69b14a932a35977832c58d87b80cab90cd4f326542030c7d422aa8bf0df53830940a
data/CHANGES.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changes
2
2
 
3
+ ## 2026-01-14 v1.51.1
4
+
5
+ - Simplified `lru_cache` implementation to not need `NOT_EXIST`
6
+ - Updated `rubygems_version` from **4.0.2** to **4.0.3**
7
+ - Changed `gem_hadar` development dependency from "~> 2.10" to ">= 2.16.3"
8
+ - Updated Ruby image version from 4.0-rc-alpine to 4.0-alpine in CI pipeline
9
+ - Added comprehensive module documentation for `DSLKit` explaining its purpose
10
+ and features
11
+ - Added `CHANGES.md` file to gem release process using `GemHadar`
12
+
3
13
  ## 2025-12-20 v1.51.0
4
14
 
5
15
  - Added `readline` as a runtime dependency in both `Rakefile` and
data/Rakefile CHANGED
@@ -22,6 +22,10 @@ GemHadar do
22
22
  licenses << 'MIT'
23
23
  clean << 'coverage'
24
24
 
25
+ changelog do
26
+ filename 'CHANGES.md'
27
+ end
28
+
25
29
  github_workflows(
26
30
  'static.yml' => {}
27
31
  )
data/lib/tins/dslkit.rb CHANGED
@@ -1137,4 +1137,69 @@ module Tins
1137
1137
  end
1138
1138
  end
1139
1139
  end
1140
+ # DSLKit provides a comprehensive framework for building Domain Specific Languages
1141
+ # and configuration systems in Ruby.
1142
+ #
1143
+ # DSLKit is designed to make it easy to create clean, expressive APIs that feel
1144
+ # natural to Ruby developers. It provides a collection of utilities for:
1145
+ #
1146
+ # - Creating method-based accessors and constants
1147
+ # - Working with singleton classes and eigenclasses
1148
+ # - Building thread-safe global variables
1149
+ # - Implementing dynamic code evaluation
1150
+ # - Creating symbolic method handling
1151
+ # - Deflecting method calls for interception
1152
+ # - Providing delegate patterns for method forwarding
1153
+ # - Building blank slates for clean API surfaces
1154
+ #
1155
+ # The framework is organized around several key modules:
1156
+ #
1157
+ # - Tins::DSLAccessor: For creating configurable accessors with default values
1158
+ # - Tins::Constant: For creating method-based constants
1159
+ # - Tins::Eigenclass: For working with singleton classes
1160
+ # - Tins::ClassMethod: For defining class methods dynamically
1161
+ # - Tins::ThreadGlobal: For thread-safe global variables
1162
+ # - Tins::Interpreter: For dynamic code evaluation
1163
+ # - Tins::SymbolMaker: For symbolic method handling
1164
+ # - Tins::ConstantMaker: For symbolic constant handling
1165
+ # - Tins::Deflect: For method call interception
1166
+ # - Tins::Delegate: For method delegation patterns
1167
+ # - Tins::BlankSlate: For creating clean API surfaces
1168
+ #
1169
+ # @example Basic DSL usage
1170
+ # class Config
1171
+ # extend Tins::DSLAccessor
1172
+ # dsl_accessor :port, 8080
1173
+ # dsl_accessor :host, 'localhost'
1174
+ # end
1175
+ #
1176
+ # config = Config.new
1177
+ # config.port # => 8080
1178
+ # config.port 8081 # Sets port to 8081
1179
+ #
1180
+ # @example Method deflection
1181
+ # class Calculator
1182
+ # def add(a, b)
1183
+ # a + b
1184
+ # end
1185
+ # end
1186
+ #
1187
+ # calc = Calculator.new
1188
+ # Tins::Deflect.deflect(Calculator, :add) do |obj, method, *args|
1189
+ # # Custom behavior for add method
1190
+ # args.sum
1191
+ # end
1192
+ #
1193
+ # calc.add(1, 2, 3) # => 6 (sum instead of addition)
1194
+ #
1195
+ # @see Tins::DSLAccessor
1196
+ # @see Tins::Constant
1197
+ # @see Tins::Eigenclass
1198
+ # @see Tins::ClassMethod
1199
+ # @see Tins::ThreadGlobal
1200
+ # @see Tins::Interpreter
1201
+ # @see Tins::SymbolMaker
1202
+ # @see Tins::Deflect
1203
+ # @see Tins::Delegate
1204
+ # @see Tins::BlankSlate
1140
1205
  DSLKit = Tins
@@ -3,15 +3,10 @@ module Tins
3
3
  #
4
4
  # This cache maintains a fixed-size collection of key-value pairs,
5
5
  # automatically removing the least recently accessed item when the capacity
6
- # is exceeded.
6
+ # is exceeded. Both read and write are considered access.
7
7
  class LRUCache
8
8
  include Enumerable
9
9
 
10
- # Our "nil" value if it wasn' set by clients
11
- NOT_EXIST = Object.new.freeze
12
-
13
- private_constant :NOT_EXIST
14
-
15
10
  # Initializes a new LRU cache with the specified capacity.
16
11
  #
17
12
  # @param capacity [Integer] maximum number of items the cache can hold
@@ -19,7 +14,7 @@ module Tins
19
14
  @capacity = Integer(capacity)
20
15
  @capacity >= 1 or
21
16
  raise ArgumentError, "capacity should be >= 1, was #@capacity"
22
- @data = {}
17
+ @data = {} # Least-recently used will always be the first element
23
18
  end
24
19
 
25
20
  # Returns the maximum capacity of the cache.
@@ -35,11 +30,8 @@ module Tins
35
30
  # @param key [Object] the key to look up
36
31
  # @return [Object, nil] the value for the key or nil if not found
37
32
  def [](key)
38
- case value = @data.delete(key) { NOT_EXIST }
39
- when NOT_EXIST
40
- nil
41
- else
42
- @data[key] = value
33
+ if @data.has_key?(key)
34
+ @data[key] = @data.delete(key)
43
35
  end
44
36
  end
45
37
 
@@ -56,7 +48,7 @@ module Tins
56
48
  @data.delete(key)
57
49
  @data[key] = value
58
50
  if @data.size > @capacity
59
- @data.delete(@data.keys.first)
51
+ @data.shift
60
52
  end
61
53
  value
62
54
  end
data/lib/tins/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Tins
2
2
  # Tins version
3
- VERSION = '1.51.0'
3
+ VERSION = '1.51.1'
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:
@@ -7,9 +7,10 @@ module Tins
7
7
  end
8
8
 
9
9
  def test_too_low_capacity
10
- assert_raise ArgumentError do
10
+ ex = assert_raise ArgumentError do
11
11
  LRUCache.new(0)
12
12
  end
13
+ assert_equal 'capacity should be >= 1, was 0', ex.message
13
14
  end
14
15
 
15
16
  def test_wrong_capacity_type
data/tins.gemspec CHANGED
@@ -1,9 +1,9 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: tins 1.51.0 ruby lib
2
+ # stub: tins 1.51.1 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "tins".freeze
6
- s.version = "1.51.0".freeze
6
+ s.version = "1.51.1".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]
@@ -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(">= 3.1".freeze)
20
- s.rubygems_version = "4.0.2".freeze
20
+ s.rubygems_version = "4.0.3".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/date_dummy_test.rb".freeze, "tests/date_time_dummy_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_named_placeholders.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/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/date_dummy_test.rb".freeze, "tests/date_time_dummy_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/unit_test.rb".freeze]
23
23
 
24
24
  s.specification_version = 4
25
25
 
26
- s.add_development_dependency(%q<gem_hadar>.freeze, ["~> 2.10".freeze])
26
+ s.add_development_dependency(%q<gem_hadar>.freeze, [">= 2.16.3".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<simplecov>.freeze, [">= 0".freeze])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tins
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.51.0
4
+ version: 1.51.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
@@ -13,16 +13,16 @@ dependencies:
13
13
  name: gem_hadar
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
- - - "~>"
16
+ - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '2.10'
18
+ version: 2.16.3
19
19
  type: :development
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
- - - "~>"
23
+ - - ">="
24
24
  - !ruby/object:Gem::Version
25
- version: '2.10'
25
+ version: 2.16.3
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: all_images
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -498,7 +498,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
498
498
  - !ruby/object:Gem::Version
499
499
  version: '0'
500
500
  requirements: []
501
- rubygems_version: 4.0.2
501
+ rubygems_version: 4.0.3
502
502
  specification_version: 4
503
503
  summary: Useful stuff.
504
504
  test_files: