sevgi-function 0.98.2 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4f11073d7043461caa01968570217c218040207ff9a6abdcd5e56501946e35e1
4
- data.tar.gz: 9992d6ae73303b55ead462ba6b599e965446dd7b0455621e4ad6aa029aa65376
3
+ metadata.gz: 16f640bb8dfbb97ac1ad5bb3ec38fd5fc15b3ef6c8bfdf2c28419449f87b2dbd
4
+ data.tar.gz: 545c92aba11d99154b251b14328db0752579374d9b1da6aaf441530dcb7b0ad2
5
5
  SHA512:
6
- metadata.gz: 3cfb465db527caf1f1ba8e0305aebf3c3ba9164b6dc721122e4c5bb776f7843a05baf991fee72bff25a6c2d5be58c4625dfaac91c15d12e192fa1d12fc5ff2a3
7
- data.tar.gz: cb6e493fa0ad5c0332b6424bf8e53d9d72a49fb0729f5f4b9dcd481e94fc492fd07e458d6405aeb44b676ec3927301dd72e33ca0da2bad256d3931955d5183dc
6
+ metadata.gz: 6807301c517b6eb9f74e8d15a0fe0d617638f801563eed933c54d2ff2fad59c22ac8cfeee36dadf8ae43a10c0508c86ebd68584c3c3825711df6fed95135570a
7
+ data.tar.gz: 07c3a9c39dfc2010d4a0ac86f15d6a69768d0f9f59226466fa2e5e3f18ff3309dd229e145702ccd6a349cb4a320ba897fa68cac42c32be4bd9d359c63a73a051
data/CHANGELOG.md CHANGED
@@ -5,6 +5,120 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
5
5
 
6
6
  ## Unreleased
7
7
 
8
+ ## 1.1.0 - 2026-10-29
9
+
10
+ ### Added
11
+
12
+ - `Classes` returns an element's distinct CSS class names without changing the element; `Classify` shares its attribute normalization.
13
+ - Generic document-local Style declarations with `Target`, `Param`, `Group`, and `Profiles`, and optional prepared PDF export through the native Mainz CLI.
14
+ - Backend-independent `fallback: false` for export failures and `F.executable` for executable path lookup.
15
+ - `F.path` for path validation and expansion, and `F.output_path` for default output names and directory targets.
16
+
17
+ ### Changed
18
+
19
+ - Moved Graphics XML validation into auxiliary helpers and kept built-in paper dimensions in `Paper`.
20
+ - Shared path validation between Graphics writers and Sundries exports while preserving output paths and error messages.
21
+
22
+ ### Fixed
23
+
24
+ - Stamp code placeholders in nested and shared PDF Forms, with cycle-safe resource traversal.
25
+
26
+ ## 1.0.0 - 2026-09-16
27
+
28
+ ### Added
29
+
30
+ - Added Hatch and Orb Showcase examples and displayed both arc lengths in the Arc example.
31
+
32
+ ### Changed
33
+
34
+ - Matched documentation page widths to the homepage Showcase.
35
+ - Aligned Derender user guidance with UTF-8 normalization and safe subtree selection rules.
36
+ - Clarified the packaged skill's script invocation, subtree copying, and Derender selection and encoding rules.
37
+ - Allowed Canvas and Paper values as the first `SVG` argument when using the default document profile.
38
+ - Made element `dup` and `clone` own independent subtrees while retaining IDs and Ruby copy semantics.
39
+ - Made Segment equality compare length and direction; ordering still compares length only.
40
+ - Limited Tile cell, row, and column queries to the requested geometry and accelerated XML character validation.
41
+ - Simplified the first-run guide and aligned library constructor examples.
42
+ - Updated the packaged skill for canvas origins, alignment, Paper lookup, curved geometry, and export constraints.
43
+ - Revised DSL catalog examples and packaged Sevgi skill guidance to use statement-style calls and show inspection results.
44
+ - Refined Showcase example tabs, made Ruby and XML views fill their panels, and hid executable preambles from Ruby views.
45
+ - Documented non-rendering element data and clarified the related DSL catalog examples.
46
+ - Refined Showcase heading spacing, page-title colors, and DSL catalog cards across light and dark themes.
47
+ - Removed an obsolete ruler example and unused site code.
48
+ - Kept the Squared and Copperplate guidesheet examples together at the end of the Showcase.
49
+ - Updated the packaged skill to avoid duplicate semantic shapes and unnecessary paint passes.
50
+
51
+ ### Fixed
52
+
53
+ - Kept horizontal scrollbars visible in Showcase example code panels.
54
+ - Read Derender input in its declared XML encoding and normalized generated source, XML declarations, and markup to UTF-8.
55
+ - Preserved open-path endpoints and derived edges independently of display precision.
56
+ - Kept near-axis and near-parallel line equations and intersections independent of angle and slope rounding.
57
+ - Corrected the Showcase social image dimensions.
58
+ - Added SVG namespaces to standalone drawing examples and regenerated their outputs.
59
+ - Made failed Sevgi Rake tasks stop dependent tasks and captured required-library failures in executor results.
60
+ - Removed executor signal-handler replacement so the host and shell retain SIGINT ownership.
61
+ - Escaped late export CSS as XML text and inserted it only at a supported final root closing tag.
62
+ - Preserved Derender processing instructions and rejected custom entity references and unsupported trailing document nodes before inclusion.
63
+ - Included both box origins in `Align`, unified Tile index validation, and isolated custom numeric attribute snapshots.
64
+ - Prevented avoidable overflow and underflow in point distances.
65
+ - Corrected browser source-panel expectations and added executable documentation, YARD, and packaged-skill checks.
66
+ - Rendered inline code in DSL catalog summaries and kept linked task themes visible below the sticky header.
67
+ - Restored Showcase tab icons with embedded Font Awesome SVGs.
68
+
69
+ ## 0.100.0 - 2026-09-09
70
+
71
+ ### Added
72
+
73
+ - Added `ArcTo` and `ArcBy` for SVG-native elliptical arc paths.
74
+ - Added Geometry `Arc`, `Ellipse`, and `Circle` with bounds, length, predicates, affine transformations, and
75
+ linear/quadratic intersections. Closed ellipses and circles support sweeps and hatching.
76
+ - Added Geometry `Point.midpoint`, `Element#closed?`, lined `vertices`, open-path traversal, and `Rect#center`.
77
+ - Added Geometry aggregate bounding boxes through `Operation.box`, point collinearity through `Point.collinear?`, and
78
+ polygon `simple?`, `convex?`, and `concave?` predicates.
79
+ - Added Protractor and Arc examples and documented the drawing and calculation APIs.
80
+
81
+ ### Changed
82
+
83
+ - Removed redundant parent scans while duplicating element subtrees.
84
+ - Reused source bounds across Tile cells to reduce repeated calculations and object allocations.
85
+
86
+ ### Fixed
87
+
88
+ - Preserved Showcase card HTML through Markdown rendering so all examples and their tabs remain visible.
89
+ - Preserved XML declarations, pre-root comments, CDATA sections, inline comments, and namespace-only leaves in
90
+ Derender output and evaluation.
91
+ - Limited PDF stamp recoloring to replaced text and carried graphics state across a page's content streams.
92
+ - Corrected decimal interval fitting and made Grid point queries honor the active numeric precision.
93
+ - Prevented implicit shell interpretation of single executable arguments in `F.sh` and `F.sh!`, including paths with spaces or shell metacharacters.
94
+ - Preserved inherited namespaces on detached Derender nodes in generated source and direct evaluation, including imports through `EvaluateChildren` and `IncludeChildren`.
95
+ - Prevented sweep and Hatch lines from crossing the exterior between two tangent vertices of a concave polygon.
96
+ - Aligned Tile cells with their declared bounds for circles, rotated shapes, and polygons whose first vertex differs from their bounding-box origin.
97
+ - Limited `Load` chains to 128 active sources with `Executor::LoadDepthError`, preserving cycle detection and nested load diagnostics.
98
+ - Rejected nil and false aggregate-box inputs with the documented geometry error.
99
+ - Restored precision-aware rejection of zero-length Triangle sides.
100
+ - Made point-set collinearity independent of input order and removed eager polygon edge-pair storage.
101
+ - Applied the collinearity tolerance to every three-point subset, removing coordinate-axis-dependent baseline selection.
102
+
103
+ ## 0.99.0 - 2026-08-09
104
+
105
+ ### Added
106
+
107
+ - Added `SVG.Module` for building anonymous callable drawing modules with their contract installed before definition.
108
+ - Added responsive Mermaid diagrams for the Derender round trip and SVG validation lifecycle.
109
+
110
+ ### Changed
111
+
112
+ - Reorganized the documentation around getting started, usage, composition, documents, layout, output, and examples.
113
+ - Documented how the `igves` and `igsev` command names reflect their conversion directions.
114
+ - Normalized DSL catalog provider labels to lowercase and simplified polyfill-backed editor entries to `inkscape`.
115
+
116
+ ### Fixed
117
+
118
+ - Allowed A5-on-A4 pdfcpu conversion to replace an existing output file.
119
+ - Pre-rendered Mermaid diagrams as inline SVG instead of parsing them in site visitors' browsers.
120
+ - Removed duplicate provider and context labels from DSL catalog entries.
121
+
8
122
  ## 0.98.2 - 2026-07-25
9
123
 
10
124
  ### Fixed
@@ -212,7 +326,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
212
326
 
213
327
  ### Changed
214
328
 
215
- - Added the checker board example to the documentation showcase flow.
329
+ - Added the checkerboard example to the documentation showcase flow.
216
330
  - Consolidated Victor Book attribution for adapted showcase examples into a single documentation note.
217
331
 
218
332
  ### Fixed
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Sevgi Function
2
2
 
3
3
  Sevgi Function contains the supported `Sevgi::F` toolbox shared by Sevgi components and advanced extensions. It is not
4
- intended as a general-purpose utility library; nested helper modules organize the facade implementation and are not
5
- consumer mixins.
4
+ a general-purpose utility library. Nested helper modules organize the facade implementation and are not consumer
5
+ mixins.
6
6
 
7
7
  ## Install
8
8
 
@@ -19,9 +19,14 @@ require "sevgi/function"
19
19
  ## Example
20
20
 
21
21
  ```ruby
22
- Sevgi::F.eq?(0.1 + 0.2, 0.3, precision: 12)
22
+ Sevgi::F.with_precision(12) do
23
+ Sevgi::F.eq?(0.1 + 0.2, 0.3) # => true
24
+ end
23
25
  ```
24
26
 
27
+ The facade also provides `.sevgi` file discovery, generated-file output, argv-safe child processes, naming helpers,
28
+ and terminal status output. Use the linked API documentation for exact results and failure contracts.
29
+
25
30
  ## Ruby compatibility
26
31
 
27
32
  Requires Ruby 3.4.0 or newer. CI verifies the current Ruby 3.4 release and the development Ruby from `.ruby-version`.
data/lib/sevgi/core.rb CHANGED
@@ -39,7 +39,7 @@ module Sevgi
39
39
  end
40
40
  end
41
41
 
42
- # Error raised for internal invariants and implementation paths that should be unreachable.
42
+ # Error raised for broken internal invariants and unreachable implementation paths.
43
43
  PanicError = Class.new(Error) unless defined?(self::PanicError)
44
44
 
45
45
  # Error raised for invalid public API usage.
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Sevgi
4
4
  module Function
5
- # ANSI color and style methods promoted to {Sevgi::F}. This module organizes the facade implementation; it is not a
5
+ # ANSI color and style methods promoted to {Sevgi::F}. This module organizes the facade implementation. It is not a
6
6
  # consumer mixin contract.
7
7
  module Color
8
8
  # Wraps a string in the blue terminal style.
@@ -4,10 +4,10 @@ require "fileutils"
4
4
 
5
5
  module Sevgi
6
6
  module Function
7
- # File-system methods promoted to {Sevgi::F}. This module organizes the facade implementation; it is not a consumer
7
+ # File-system methods promoted to {Sevgi::F}. This module organizes the facade implementation. It is not a consumer
8
8
  # mixin contract.
9
9
  module File
10
- # Checks whether a file would change if written with content.
10
+ # Checks whether a file differs from the supplied content.
11
11
  # @param file [String] file path to compare
12
12
  # @param content [String] proposed file content
13
13
  # @yield optional normalization filter applied to both old and new content
@@ -93,6 +93,40 @@ module Sevgi
93
93
  end
94
94
  end
95
95
 
96
+ # Resolves an output path, using the default when value is nil or an existing directory.
97
+ # The default is validated only when used. This method does not create files or directories.
98
+ # @param value [String, #to_path, nil] explicit output path or directory
99
+ # @param default [String, #to_path] default output path; its basename is used for a directory target
100
+ # @param context [String] public operation named in errors
101
+ # @return [String] expanded output path
102
+ # @raise [Sevgi::ArgumentError] when a selected path/default is blank, invalid, or cannot be converted
103
+ def output_path(value, default:, context: "Output")
104
+ return path(default, context: "#{context} default") if value.nil?
105
+
106
+ output = path(value, context: "#{context} path")
107
+ return output unless ::File.directory?(output)
108
+
109
+ default = path(default, context: "#{context} default")
110
+ ::File.join(output, ::File.basename(default))
111
+ end
112
+
113
+ # Converts a non-blank path to an expanded String without requiring it to exist.
114
+ # @param value [String, #to_path] raw path value
115
+ # @param context [String] error-message subject
116
+ # @return [String] expanded path
117
+ # @raise [Sevgi::ArgumentError] when value is blank, has an invalid type, or path conversion fails
118
+ def path(value, context: "Path")
119
+ path = value.respond_to?(:to_path) ? value.to_path : value
120
+ ArgumentError.("#{context} must be a String or path-like object") unless path.is_a?(::String)
121
+ ArgumentError.("#{context} must be provided") if path.strip.empty?
122
+
123
+ ::File.expand_path(path)
124
+ rescue ::Sevgi::ArgumentError
125
+ raise
126
+ rescue ::StandardError => e
127
+ ArgumentError.("#{context} must be a String or path-like object: #{e.message}")
128
+ end
129
+
96
130
  # Adds a default extension when a path has no extension.
97
131
  # @param file [String] file path
98
132
  # @param default_extension [String] extension to append without a leading dot
@@ -78,7 +78,7 @@ module Sevgi
78
78
  def atan2(y, x) = to_degrees(::Math.atan2(finite_real(:y, y), finite_real(:x, x)))
79
79
 
80
80
  # Returns the cosine of an angle expressed in degrees. Integer quarter turns return exact `-1.0`, `0.0`, or
81
- # `1.0`; other angles use Ruby's floating-point Math implementation.
81
+ # `1.0`. Other angles use Ruby's floating-point Math implementation.
82
82
  # @param degrees [Numeric] angle in degrees
83
83
  # @return [Float]
84
84
  # @raise [Sevgi::ArgumentError] when degrees is not a finite real number
@@ -94,6 +94,7 @@ module Sevgi
94
94
  def cot(degrees) = 1.0 / ::Math.tan(to_radians(degrees))
95
95
 
96
96
  # Counts complete divisions in a length.
97
+ # A positive quotient one floating-point step below the next integer counts as that integer.
97
98
  # @param length [Numeric] finite real total length
98
99
  # @param division [Numeric] finite real, non-zero division size
99
100
  # @return [Integer]
@@ -103,7 +104,11 @@ module Sevgi
103
104
  divisor = finite_real(:division, division)
104
105
  ArgumentError.("Division must not be zero") if divisor.zero?
105
106
 
106
- (length / divisor).to_i
107
+ quotient = length / divisor
108
+ whole = quotient.to_i
109
+ candidate = whole + 1
110
+
111
+ quotient > whole && quotient.next_float == candidate ? candidate : whole
107
112
  end
108
113
 
109
114
  # Compares two numeric values after approximate rounding.
@@ -156,7 +161,7 @@ module Sevgi
156
161
  precision.nil? ? number : number.round(valid_precision(precision))
157
162
  end
158
163
 
159
- # Returns the sine of an angle expressed in degrees. Integer quarter turns return exact `-1.0`, `0.0`, or `1.0`;
164
+ # Returns the sine of an angle expressed in degrees. Integer quarter turns return exact `-1.0`, `0.0`, or `1.0`.
160
165
  # other angles use Ruby's floating-point Math implementation.
161
166
  # @param degrees [Numeric] angle in degrees
162
167
  # @return [Float]
@@ -8,25 +8,35 @@ module Sevgi
8
8
  # Command methods promoted to {Sevgi::F}. This module owns the public immutable {Shell::Result} value but is not
9
9
  # otherwise a consumer mixin contract.
10
10
  module Shell
11
- # Checks whether a program exists and is executable.
11
+ # Returns the absolute path of the first executable regular file, or nil.
12
12
  # @param program [Object] program name, absolute path, or relative slash-containing path
13
- # @return [Boolean] true when an executable regular file is found
14
- # @note PATH is evaluated on every call; empty PATH segments mean the current directory.
15
- def executable?(program)
13
+ # @return [String, nil] absolute executable path, preserving a selected symlink
14
+ # @note PATH is evaluated on every call. Empty PATH segments mean the current directory.
15
+ def executable(program)
16
16
  program = program.to_s
17
- return false if program.empty?
18
- return executable_file?(program) if slash_path?(program)
17
+ return if program.empty?
18
+ if slash_path?(program)
19
+ return executable_file?(program) ? ::File.expand_path(program) : nil
20
+ end
19
21
 
20
- ENV.fetch("PATH", "").split(::File::PATH_SEPARATOR, -1).any? do |dir|
21
- executable_file?(::File.join(dir.empty? ? "." : dir, program))
22
+ ENV.fetch("PATH", "").split(::File::PATH_SEPARATOR, -1).each do |dir|
23
+ path = ::File.expand_path(program, dir.empty? ? "." : dir)
24
+ return path if executable_file?(path)
22
25
  end
26
+ nil
23
27
  end
24
28
 
29
+ # Checks whether a program exists and is executable.
30
+ # @param program [Object] program name, absolute path, or relative slash-containing path
31
+ # @return [Boolean] true when an executable regular file is found
32
+ # @see #executable
33
+ def executable?(program) = !executable(program).nil?
34
+
25
35
  # Requires the first command argument to name an executable program.
26
36
  # @param args [Array<Object>] command arguments
27
37
  # @return [nil]
28
38
  # @raise [Sevgi::Error] when the program cannot be found in PATH
29
- # @note The first argument is checked as one exact argv entry; it is never shell-split.
39
+ # @note The first argument is checked as one exact argv entry. It is never shell-split.
30
40
  def executable!(*args)
31
41
  program = args.first.to_s
32
42
  Error.("Missing executable: #{program}") unless executable?(program)
@@ -232,7 +242,7 @@ module Sevgi
232
242
  ArgumentError.("Shell command required") if args.empty?
233
243
 
234
244
  @coathooks = 0
235
- outs, errs, status = Open3.popen3(*args) do |stdin, stdout, stderr, wait_thread|
245
+ outs, errs, status = Open3.popen3(*command(args)) do |stdin, stdout, stderr, wait_thread|
236
246
  capture(stdin, stdout, stderr, wait_thread, &input)
237
247
  end
238
248
 
@@ -241,7 +251,14 @@ module Sevgi
241
251
 
242
252
  private
243
253
 
244
- # rubocop:disable Lint/RescueException
254
+ def command(args)
255
+ args = args.dup
256
+ index = args.first.is_a?(::Hash) ? 1 : 0
257
+ args[index] = [args[index], args[index]] unless args[index].is_a?(::Array)
258
+ args
259
+ end
260
+
261
+ # rubocop:disable-next Lint/RescueException
245
262
  def capture(stdin, stdout, stderr, wait_thread, &input)
246
263
  registered = false
247
264
  Signals.register(self, wait_thread.pid)
@@ -256,7 +273,6 @@ module Sevgi
256
273
  close_input(stdin)
257
274
  Signals.unregister(self) if registered
258
275
  end
259
- # rubocop:enable Lint/RescueException
260
276
 
261
277
  def start_readers(stdout, stderr)
262
278
  [
@@ -336,11 +352,11 @@ module Sevgi
336
352
  # Runs a command and captures stdout, stderr, and exit status.
337
353
  # @param args [Array<String>] command and arguments
338
354
  # @yield optional stdin producer, evaluated once after output readers start
339
- # @yieldreturn [String, nil] content to write to stdin; nil writes nothing
355
+ # @yieldreturn [String, nil] content to write to stdin. Nil writes nothing
340
356
  # @return [Sevgi::Function::Shell::Result]
341
357
  # @raise [Sevgi::ArgumentError] when no command is given
342
358
  # @raise [SystemCallError] when the executable cannot be spawned or process pipes cannot be opened
343
- # @raise [StandardError] when the input block raises; the child is terminated and reaped before propagation
359
+ # @raise [StandardError] when the input block raises. The child is terminated and reaped before propagation
344
360
  # @note The child's stdin is closed after the input block. During execution, the first SIGINT sends TERM to the
345
361
  # child process and the second SIGINT as KILL to each active child outside trap context, then restores the
346
362
  # previous handler.
@@ -349,12 +365,12 @@ module Sevgi
349
365
  # Runs a command, requiring both executable lookup and successful exit status.
350
366
  # @param args [Array<String>] command and arguments
351
367
  # @yield optional stdin producer, evaluated once after output readers start
352
- # @yieldreturn [String, nil] content to write to stdin; nil writes nothing
368
+ # @yieldreturn [String, nil] content to write to stdin. Nil writes nothing
353
369
  # @return [Sevgi::Function::Shell::Result]
354
370
  # @raise [Sevgi::ArgumentError] when no command is given
355
371
  # @raise [Sevgi::Error] when the executable is missing or the command fails
356
372
  # @raise [SystemCallError] when the executable cannot be spawned or process pipes cannot be opened
357
- # @raise [StandardError] when the input block raises; the child is terminated and reaped before propagation
373
+ # @raise [StandardError] when the input block raises. The child is terminated and reaped before propagation
358
374
  # @note The child's stdin is closed after the input block. During execution, the first SIGINT sends TERM to the
359
375
  # child process and the second SIGINT as KILL to each active child outside trap context, then restores the previous
360
376
  # handler.
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Sevgi
4
4
  module Function
5
- # String methods promoted to {Sevgi::F}. This module organizes the facade implementation; it is not a consumer mixin
5
+ # String methods promoted to {Sevgi::F}. This module organizes the facade implementation. It is not a consumer mixin
6
6
  # contract.
7
7
  module String
8
8
  # Returns the final constant name segment from a module path.
@@ -20,10 +20,10 @@ module Sevgi
20
20
 
21
21
  extend String
22
22
 
23
- # English pluralization promoted to {Sevgi::F}. This module organizes the facade implementation; it is not a
23
+ # English pluralization promoted to {Sevgi::F}. This module organizes the facade implementation. It is not a
24
24
  # consumer mixin contract.
25
25
  module Pluralize
26
- # Words that should not be pluralized.
26
+ # Words excluded from pluralization.
27
27
  # @api private
28
28
  UNCOUNTABLES = %w[
29
29
  equipment
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Sevgi
4
4
  module Function
5
- # Terminal status methods promoted to {Sevgi::F}. This module organizes the facade implementation; it is not a
5
+ # Terminal status methods promoted to {Sevgi::F}. This module organizes the facade implementation. It is not a
6
6
  # consumer mixin contract.
7
7
  module UI
8
8
  # Reports an in-progress status message.
@@ -3,6 +3,6 @@
3
3
  module Sevgi
4
4
  module Function
5
5
  # Current version of the Sevgi function gem.
6
- VERSION = "0.98.2"
6
+ VERSION = "1.1.0"
7
7
  end
8
8
  end
@@ -13,13 +13,13 @@ require_relative "function/ui"
13
13
  require_relative "function/version"
14
14
 
15
15
  module Sevgi
16
- # Support toolbox for Sevgi components and advanced extensions. The supported helper facade is {Sevgi::F}; it
16
+ # Support toolbox for Sevgi components and advanced extensions. The supported helper facade is {Sevgi::F}. It
17
17
  # provides degree-based trigonometry and precision, file discovery and output, argv-safe commands, naming helpers,
18
18
  # and small terminal status tools. It is not intended as a general-purpose utility library.
19
19
  #
20
20
  # {Function::Location}, {Function::Locate}, and {Function::Shell::Result} are public supporting values. The
21
21
  # thread-local precision accessors remain on {Function::Math.precision}. Other nested helper modules organize the
22
- # facade implementation and its method documentation; consumers should not include or extend them.
22
+ # facade implementation and its method documentation. Consumers do not include or extend them.
23
23
  #
24
24
  # @example Use the supported facade in library code
25
25
  # Sevgi::F.with_precision(3) do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sevgi-function
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.98.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Recai Oktaş
@@ -50,7 +50,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
50
50
  - !ruby/object:Gem::Version
51
51
  version: '0'
52
52
  requirements: []
53
- rubygems_version: 4.0.16
53
+ rubygems_version: 4.0.20
54
54
  specification_version: 4
55
55
  summary: Shared utility functions for Sevgi components.
56
56
  test_files: []