unitsml 0.6.13 → 0.6.14

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: c599180abf511dcf8c6bc582c48126e482b80b3acbb0c443f89b270334243ab6
4
- data.tar.gz: 48450a6d5df613392cf903581ef55ce193b0f5e32731f9a0e6812d170ebf5381
3
+ metadata.gz: 6eb7b900c878fbb336b8664d9f82f09fb4b1971e9b5bc8c5e2e53f8fa63baceb
4
+ data.tar.gz: f4b0dc34053ec9fc8d6425c26d3a86b429a05825b009ce59cd8fd30b10e427c0
5
5
  SHA512:
6
- metadata.gz: 2d0e5ca17cb5d3124151463fb8bbdb436521f175eeba95f38a08f464e104a8d89e4f30afdf80d24e86f1f0985799929b14cfcd9013f266967a7ceebb437cb2de
7
- data.tar.gz: 9a83f7c51f331e0db38072dfaf61ae61f50c0f76535f11ba00246847770fc943625cf0deb10dedee13c1310315bee1e11e810fd00c46b03f1e30bf097f87070a
6
+ metadata.gz: 2851de6c91a67f92f5e84b1d76efea7626d850dff7bed04d660f3522462e5859c63b88ae9ff3990560aa85efdba8d9faa3bfd3b47fba391cf819583cfaa0b0d8
7
+ data.tar.gz: ee3558da765dda1f3e7d4ae66a9b5e06e7d86b72860eae710276815c8c62d8725456895d14d6874b86dbf49f850f96e651196d81f07270fa0925edcb0cfc5f83
@@ -16,13 +16,10 @@ module Unitsml
16
16
  # "/" and inverts b's power; `a * b` keeps "*"). An explicit trailing
17
17
  # extender on the left (from #extender) already is the join, so no glyph
18
18
  # is inserted after it — but `/` still inverts the right-hand side.
19
- # An empty side inserts no glyph. invert_dimensions: false keeps
20
- # Dimension leaves un-inverted on division (Quantity compatibility).
21
- def build_product(left_terms, right_terms, operator,
22
- invert_dimensions: true)
19
+ # An empty side inserts no glyph.
20
+ def build_product(left_terms, right_terms, operator)
23
21
  left = build_terms(left_terms, invert: false)
24
- right = build_terms(right_terms, invert: operator == "/",
25
- invert_dimensions: invert_dimensions)
22
+ right = build_terms(right_terms, invert: operator == "/")
26
23
  joiner = join_glyph(left, right, operator)
27
24
  build_root_formula(left + joiner + right)
28
25
  end
@@ -33,7 +30,7 @@ module Unitsml
33
30
  return nil unless left || right
34
31
 
35
32
  build_product(left ? left.value : [], right ? right.value : [],
36
- operator, invert_dimensions: false)
33
+ operator)
37
34
  end
38
35
 
39
36
  # Independent copy of a Formula (tree, powers, prefixes, text and
@@ -99,11 +96,8 @@ module Unitsml
99
96
  # Rebuild every operand: map_leaves reconstructs branch wrappers and
100
97
  # each Unit/Dimension leaf is copied with a freshly built final power
101
98
  # (and a duplicated prefix). Non-leaf terms (Extender/Number) plain-dup.
102
- def build_terms(terms, invert:, invert_dimensions: true)
103
- TermTree.map_leaves(terms) do |leaf|
104
- rebuild_leaf(leaf, invert && (invert_dimensions ||
105
- !leaf.is_a?(Dimension)))
106
- end
99
+ def build_terms(terms, invert:)
100
+ TermTree.map_leaves(terms) { |leaf| rebuild_leaf(leaf, invert) }
107
101
  end
108
102
 
109
103
  def join_glyph(left, right, operator)
@@ -73,18 +73,28 @@ module Unitsml
73
73
  end
74
74
  end
75
75
 
76
- case object
77
- when Unit
78
- next object.power_numerator = Number.new("0.5") if sqrt
79
- next unless inverse
80
-
81
- inverse ? object.inverse_power_numerator : object.power_numerator
82
- when Dimension then object.power_numerator = Number.new("0.5") if sqrt
83
- when Extender then inverse = !inverse if ["/", "//"].any?(object.symbol)
84
- when Formula then update_units_exponents(object.value, inverse)
85
- when Fenced then update_units_exponents([object.value], inverse, sqrt)
86
- end
76
+ inverse = update_term_exponent(object, inverse, sqrt)
77
+ end
78
+ end
79
+
80
+ # Apply the sqrt/inverse state to one term; returns the inverse state for
81
+ # the next term (a "/" or "//" separator flips it).
82
+ def update_term_exponent(object, inverse, sqrt)
83
+ case object
84
+ when Unit, Dimension then update_leaf_exponent(object, inverse, sqrt)
85
+ when Extender then return !inverse if ["/", "//"].any?(object.symbol)
86
+ when Formula then update_units_exponents(object.value, inverse)
87
+ when Fenced then update_units_exponents([object.value], inverse, sqrt)
87
88
  end
89
+ inverse
90
+ end
91
+
92
+ # Units and dimensions follow the same rule: a sqrt sets the 0.5 exponent,
93
+ # otherwise a term after "/" has its exponent inverted.
94
+ def update_leaf_exponent(object, inverse, sqrt)
95
+ return object.power_numerator = Number.new("0.5") if sqrt
96
+
97
+ object.inverse_power_numerator if inverse
88
98
  end
89
99
 
90
100
  def post_extras
@@ -17,6 +17,17 @@ module Unitsml
17
17
  @power_numerator = coerce_power_type(power)
18
18
  end
19
19
 
20
+ # Flip the exponent's sign in place for a term after "/" in a parsed
21
+ # string; no exponent becomes -1. Used by the parser for both units and
22
+ # dimensions.
23
+ def inverse_power_numerator
24
+ if power_numerator
25
+ power_numerator.update_negative_sign
26
+ else
27
+ @power_numerator = Number.new("-1")
28
+ end
29
+ end
30
+
20
31
  private
21
32
 
22
33
  # The exponent lexemes the library itself stores: an integer, an n/m or
data/lib/unitsml/unit.rb CHANGED
@@ -114,14 +114,6 @@ module Unitsml
114
114
  Lutaml::Model::Utils.snake_case(system_type)
115
115
  end
116
116
 
117
- def inverse_power_numerator
118
- if power_numerator
119
- power_numerator.update_negative_sign
120
- else
121
- @power_numerator = Number.new("-1")
122
- end
123
- end
124
-
125
117
  private
126
118
 
127
119
  # Resolve a unit reference to a canonical symbol id, exactly like the parser
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Unitsml
4
- VERSION = "0.6.13"
4
+ VERSION = "0.6.14"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unitsml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.13
4
+ version: 0.6.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-11-05 00:00:00.000000000 Z
11
+ date: 2026-11-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciiunits