phys-units 0.9.4 → 0.9.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -6
- data/lib/phys/units/parse.rb +1 -1
- data/lib/phys/units/parse.y +1 -1
- data/lib/phys/units/quantity.rb +24 -22
- data/lib/phys/units/unit.rb +45 -34
- data/lib/phys/units/unit_class.rb +7 -4
- data/lib/phys/units/units_mixin.rb +4 -0
- data/lib/phys/units/version.rb +1 -1
- data/lib/phys/units.rb +3 -0
- data/misc/misc_units.dat +7 -0
- data/misc/mkunitspec.rb +1 -0
- data/spec/all_units_spec.rb +1 -0
- data/spec/quantity_spec.rb +2 -2
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 08a3f10419f3f682ae605f4cc4995f0d99605354
|
4
|
+
data.tar.gz: d947bfc917e8484eeb87fc178f315b1e0982331c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef99074dc223bb887a79162e0928181eda392b87a1fae825c8a09691aca17083417125a9dee1548058b917f41344742ac7366f3dd1cc867cb37bff3a9eab9d86
|
7
|
+
data.tar.gz: e8a23b4054cee7acfd274d274272ddda9cb2975efc316083030afffeb52c1debf1d86ec51b076231054d7bab85b17e813e9ce762dbb79ae055b91725c548ac10
|
data/README.md
CHANGED
@@ -18,6 +18,10 @@ Or install from source tree:
|
|
18
18
|
|
19
19
|
$ ruby setup.rb
|
20
20
|
|
21
|
+
Load Phys-Units library in your Ruby script:
|
22
|
+
|
23
|
+
require 'phys/units'
|
24
|
+
|
21
25
|
## Overview
|
22
26
|
|
23
27
|
### Phys::Quantity
|
@@ -25,15 +29,16 @@ is the primary class of Phys-Units library, intended to be manipulated by users.
|
|
25
29
|
This class represents Physical Quantities with a Unit of measurement.
|
26
30
|
It contains *Value* and *Unit*.
|
27
31
|
|
28
|
-
* *Value*
|
29
|
-
|
32
|
+
* *Value* of the quantity is given as the first parameter of
|
33
|
+
Quantity constructor (alias is `Quantity[]`).
|
34
|
+
It must be a class instance having arithmetic methods,
|
30
35
|
but it is not necessary to be a Numeric.
|
31
36
|
This is a duck typing way.
|
32
37
|
|
33
38
|
Phys::Quantity[2.5,"miles"].value #=> 2.5
|
34
39
|
|
35
|
-
* *Unit*
|
36
|
-
is
|
40
|
+
* *Unit* is an instance of Phys::Unit class.
|
41
|
+
It is created from the second argument of Quantity constructor.
|
37
42
|
|
38
43
|
Phys::Quantity[2.5,"miles"].unit #=> #<Phys::Unit 1609.344,{"m"=>1},@expr="5280 ft">
|
39
44
|
|
@@ -62,7 +67,7 @@ It has *Factor* and *Dimension*:
|
|
62
67
|
Q[123,'mile'] / Q[2,'hr'] #=> Phys::Quantity[61,'mile/hr']
|
63
68
|
Q[61,'miles/hr'].want('m/s') #=> Phys::Quantity[27.26944,'m/s']
|
64
69
|
Q[1.0,'are'] == Q[10,'m']**2 #=> true
|
65
|
-
Q[70,'tempF'] + Q[10,'
|
70
|
+
Q[70,'tempF'] + Q[10,'degC'] #=> Phys::Quantity[88,'tempF']
|
66
71
|
Q[20,'tempC'].want('tempF') #=> Phys::Quantity[68,'tempF']
|
67
72
|
Math.cos(Q[60,'degree'].to_f) #=> 0.5
|
68
73
|
|
@@ -84,7 +89,7 @@ It has *Factor* and *Dimension*:
|
|
84
89
|
Phys-Units library is differentiated from many other units libraries for Ruby,
|
85
90
|
by the following features:
|
86
91
|
|
87
|
-
* Compatible with GNU Units except nonlinear units.
|
92
|
+
* Compatible with GNU Units except currency and nonlinear units.
|
88
93
|
* Provides 2331 units, 85 prefixes, including UTF-8 unit names.
|
89
94
|
* Defines Units by reading GNU Units text data
|
90
95
|
(see [load_units.rb](https://github.com/masa16/phys-units/blob/master/lib/phys/units/load_units.rb)),
|
@@ -127,6 +132,8 @@ Caution: The use of Mix-in may cause conflicts with other library.
|
|
127
132
|
## Platforms tested
|
128
133
|
|
129
134
|
* ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-linux]
|
135
|
+
* ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]
|
136
|
+
* ruby 1.8.7 (2012-10-12 patchlevel 371) [x86_64-linux]
|
130
137
|
|
131
138
|
## Copying License
|
132
139
|
|
data/lib/phys/units/parse.rb
CHANGED
data/lib/phys/units/parse.y
CHANGED
data/lib/phys/units/quantity.rb
CHANGED
@@ -18,16 +18,17 @@ module Phys
|
|
18
18
|
# intended to be manipulated by users.
|
19
19
|
# This class represents Physical Quantities with a Unit of measurement.
|
20
20
|
# It contains *Value* and *Unit*.
|
21
|
-
# * *Value* of the quantity
|
22
|
-
#
|
21
|
+
# * *Value* of the quantity is given as the first parameter of
|
22
|
+
# Quantity constructor (alias is +Quantity[]+).
|
23
|
+
# It must be a class instance having arithmetic methods,
|
23
24
|
# but it is not necessary to be a Numeric.
|
24
25
|
# This is a duck typing way.
|
25
26
|
# Phys::Quantity[2.5,"miles"].value #=> 2.5
|
26
27
|
# Phys::Quantity[NArray.float(5).indgen,"miles"].want("m").value
|
27
28
|
# #=> NArray.float(5):
|
28
29
|
# [ 0.0, 1609.34, 3218.69, 4828.03, 6437.38 ]
|
29
|
-
# * *Unit*
|
30
|
-
# is
|
30
|
+
# * *Unit* is an instance of Phys::Unit class.
|
31
|
+
# It is created from the second argument of Quantity constructor.
|
31
32
|
# see document of Phys::Unit.
|
32
33
|
# Phys::Quantity[2.5,"miles"].unit #=> #<Phys::Unit 1609.344,{"m"=>1},@expr="5280 ft">
|
33
34
|
#
|
@@ -39,7 +40,7 @@ module Phys
|
|
39
40
|
# Q[123,'mile'] / Q[2,'hr'] #=> Phys::Quantity[61,'mile/hr']
|
40
41
|
# Q[61,'miles/hr'].want('m/s') #=> Phys::Quantity[27.26944,'m/s']
|
41
42
|
# Q[1.0,'are'] == Q[10,'m']**2 #=> true
|
42
|
-
# Q[70,'tempF'] + Q[10,'
|
43
|
+
# Q[70,'tempF'] + Q[10,'degC'] #=> Phys::Quantity[88,'tempF']
|
43
44
|
# Q[20,'tempC'].want('tempF') #=> Phys::Quantity[68,'tempF']
|
44
45
|
# Math.cos(Q[60,'degree'].to_f) #=> 0.5
|
45
46
|
#
|
@@ -51,31 +52,29 @@ module Phys
|
|
51
52
|
|
52
53
|
class << self
|
53
54
|
# Alias to Phys::Quantity.new.
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
# @overload initialize(value)
|
60
|
-
# @param [Object] value Value of dimensionless quantity.
|
55
|
+
# @param [Object] value Value of quantity.
|
56
|
+
# @param [String,Symbol,Phys::Unit] unit
|
57
|
+
# * If +unit+ String or Symbol, it is regarded as a unit expression (to be parsed later).
|
58
|
+
# * If +unit+ is Phys::Unit, it is used as the unit of new quantity.
|
59
|
+
# * If +unit+ is not provided, the quantity is regarded as dimensionless.
|
61
60
|
# @return [Phys::Quantity]
|
62
61
|
# @raise [TypeError] if invalid arg types.
|
63
62
|
# @raise [Phys::UnitError] if unit conversion is failed.
|
64
|
-
def [](value,
|
65
|
-
self.new(value,
|
63
|
+
def [](value,unit=nil)
|
64
|
+
self.new(value,unit)
|
66
65
|
end
|
67
66
|
end
|
68
67
|
|
69
68
|
# Initialize a new quantity.
|
70
69
|
# @overload initialize(value,expr,unit=nil)
|
71
70
|
# @param [Object] value Value of quantity.
|
72
|
-
# @param [String,Symbol] expr Unit
|
73
|
-
# @param [Phys::Unit] unit
|
71
|
+
# @param [String,Symbol] expr Unit expression.
|
72
|
+
# @param [Phys::Unit] unit If exists, this parameter is used as the unit of new quantity.
|
74
73
|
# @overload initialize(value,unit)
|
75
74
|
# @param [Object] value Value of quantity.
|
76
|
-
# @param [Phys::Unit] unit This
|
75
|
+
# @param [Phys::Unit] unit This parameter is used as the unit of new quantity.
|
77
76
|
# @overload initialize(value)
|
78
|
-
# @param [Object] value Value of dimensionless quantity.
|
77
|
+
# @param [Object] value Value of a dimensionless quantity.
|
79
78
|
# @raise [TypeError] if invalid arg types.
|
80
79
|
# @raise [Phys::UnitError] if unit conversion is failed.
|
81
80
|
#
|
@@ -291,8 +290,8 @@ module Phys
|
|
291
290
|
@value > @unit.convert(other)
|
292
291
|
end
|
293
292
|
|
294
|
-
# Closeness. Returns +true+ if
|
295
|
-
#
|
293
|
+
# Closeness. Returns +true+ if
|
294
|
+
# (self-other).abs <= (self.abs+other.abs) * epsilon
|
296
295
|
# Before the comparison, it converts +other+ to the unit of +self+.
|
297
296
|
# @param [Phys::Quantity] other
|
298
297
|
# @param [Numeric] epsilon
|
@@ -301,7 +300,7 @@ module Phys
|
|
301
300
|
def close_to(other,epsilon=Float::EPSILON)
|
302
301
|
other_value = @unit.convert(other)
|
303
302
|
abs_sum = @value.abs+other_value.abs
|
304
|
-
|
303
|
+
(@value-other_value).abs <= abs_sum*epsilon
|
305
304
|
end
|
306
305
|
|
307
306
|
# Exponentiation.
|
@@ -365,6 +364,9 @@ module Phys
|
|
365
364
|
# If the +other+ param is *not* Phys::Quantity,
|
366
365
|
# +other+ is regarded as a dimensionless value.
|
367
366
|
# The values and units are divided respectively.
|
367
|
+
# Note that the method of the value's class is used.
|
368
|
+
# @example
|
369
|
+
# Phys::Quantity[3,:m]/2 #=> Phys::Quantity[1,"m"]
|
368
370
|
# @param [Object] other
|
369
371
|
# @return [Phys::Quantity] a quantity
|
370
372
|
# @raise [Phys::UnitError] if unit is not operable.
|
@@ -555,7 +557,7 @@ module Phys
|
|
555
557
|
self.class.to_s+"["+Unit::Utils.num_inspect(@value)+expr+"]"+sufx
|
556
558
|
end
|
557
559
|
|
558
|
-
#
|
560
|
+
# Conformability of quantity. Returns true if unit conversion between +self+ and +x+ is possible.
|
559
561
|
# @param [Object] x other object (Unit or Quantity or Numeric or something else)
|
560
562
|
# @return [Boolean]
|
561
563
|
def ===(x)
|
data/lib/phys/units/unit.rb
CHANGED
@@ -43,12 +43,13 @@ module Phys
|
|
43
43
|
#
|
44
44
|
class Unit
|
45
45
|
|
46
|
-
#
|
46
|
+
# Hash table of registered units.
|
47
47
|
LIST = {}
|
48
|
-
#
|
48
|
+
# Hash table of registered prefixes.
|
49
49
|
PREFIX = {}
|
50
50
|
|
51
|
-
#
|
51
|
+
# Regex for registered prefixes.
|
52
|
+
# @return [Regexp]
|
52
53
|
def self.prefix_regex
|
53
54
|
@@prefix_regex
|
54
55
|
end
|
@@ -58,11 +59,12 @@ module Phys
|
|
58
59
|
# @param [Numeric] factor Unit scale factor.
|
59
60
|
# @param [Hash] dimension Dimension hash.
|
60
61
|
# @overload initialize(expr,name=nil)
|
61
|
-
# @param [String] expr
|
62
|
-
#
|
62
|
+
# @param [String] expr Expression of the unit. It is parsed lazily, i.e.,
|
63
|
+
# parsed not when this instance is created, but when @factor and @dim is used.
|
64
|
+
# @param [String] name Name of the unit.
|
63
65
|
# @overload initialize(unit,name=nil)
|
64
|
-
# @param [Phys::Unit] unit
|
65
|
-
# @param [String] name Name of
|
66
|
+
# @param [Phys::Unit] unit Its contents is used for new unit.
|
67
|
+
# @param [String] name Name of the unit.
|
66
68
|
# @raise [TypeError] if invalid arg types.
|
67
69
|
#
|
68
70
|
def initialize(a1,a2=nil)
|
@@ -83,7 +85,7 @@ module Phys
|
|
83
85
|
end
|
84
86
|
end
|
85
87
|
|
86
|
-
#
|
88
|
+
# Expression of the unit.
|
87
89
|
# @return [String, NilClass]
|
88
90
|
attr_reader :expr
|
89
91
|
|
@@ -199,6 +201,12 @@ module Phys
|
|
199
201
|
end
|
200
202
|
alias string_form unit_string
|
201
203
|
|
204
|
+
# Returns self name or unit_string
|
205
|
+
# @return [String]
|
206
|
+
def to_s
|
207
|
+
@name || unit_string
|
208
|
+
end
|
209
|
+
|
202
210
|
# Conversion Factor to base unit, including dimension-value.
|
203
211
|
# @return [Numeric]
|
204
212
|
# @example
|
@@ -221,7 +229,7 @@ module Phys
|
|
221
229
|
end
|
222
230
|
|
223
231
|
# Returns true if scalar unit.
|
224
|
-
# *Scalar* means
|
232
|
+
# *Scalar* means this unit does not have any dimension
|
225
233
|
# including dimensionless-units, and its factor is one.
|
226
234
|
# @return [Boolean]
|
227
235
|
def scalar?
|
@@ -306,7 +314,13 @@ module Phys
|
|
306
314
|
# @return [Phys::Quantity]
|
307
315
|
# @raise [UnitError] if unit conversion is failed.
|
308
316
|
def convert_scale(quantity)
|
309
|
-
|
317
|
+
if Quantity===quantity
|
318
|
+
assert_same_dimension(quantity.unit)
|
319
|
+
v = quantity.value * quantity.unit.conversion_factor
|
320
|
+
v = v / self.conversion_factor
|
321
|
+
else
|
322
|
+
quantity / to_numeric
|
323
|
+
end
|
310
324
|
end
|
311
325
|
|
312
326
|
# Convert from a value in this unit to a value in base unit.
|
@@ -459,7 +473,7 @@ module Phys
|
|
459
473
|
if scalar?
|
460
474
|
return x
|
461
475
|
elsif x.scalar?
|
462
|
-
return self
|
476
|
+
return self.dup
|
463
477
|
end
|
464
478
|
check_operable2(x)
|
465
479
|
dims = dimension_binop(x){|a,b| a+b}
|
@@ -477,7 +491,7 @@ module Phys
|
|
477
491
|
if scalar?
|
478
492
|
return x.inverse
|
479
493
|
elsif x.scalar?
|
480
|
-
return self
|
494
|
+
return self.dup
|
481
495
|
end
|
482
496
|
check_operable2(x)
|
483
497
|
dims = dimension_binop(x){|a,b| a-b}
|
@@ -496,11 +510,6 @@ module Phys
|
|
496
510
|
Unit.new(Rational(1,self.factor), dims)
|
497
511
|
end
|
498
512
|
|
499
|
-
# @visibility private
|
500
|
-
def self.inverse(x)
|
501
|
-
Unit.cast(x).inverse
|
502
|
-
end
|
503
|
-
|
504
513
|
# Exponentiation of units.
|
505
514
|
# This units must be operable.
|
506
515
|
# @param [Numeric] x numeric
|
@@ -515,8 +524,11 @@ module Phys
|
|
515
524
|
|
516
525
|
# @visibility private
|
517
526
|
def self.func(fn, x)
|
518
|
-
fn = 'log' if fn == 'ln'
|
519
527
|
m = Unit.new(x).to_numeric
|
528
|
+
if fn == 'log2' && RUBY_VERSION<'1.9.0'
|
529
|
+
return Unit.new( Math.log(m)/Math.log(2) )
|
530
|
+
end
|
531
|
+
fn = 'log' if fn == 'ln'
|
520
532
|
Unit.new( Math.send(fn,m) )
|
521
533
|
end
|
522
534
|
|
@@ -547,7 +559,7 @@ module Phys
|
|
547
559
|
|
548
560
|
# BaseUnit is a class to represent units defined by "!"
|
549
561
|
# in the data form of GNU units.
|
550
|
-
# It includes SI units and
|
562
|
+
# It includes SI units and dimensionless units such as radian.
|
551
563
|
class BaseUnit < Unit
|
552
564
|
|
553
565
|
def self.define(name,expr,dimval=nil)
|
@@ -601,7 +613,19 @@ module Phys
|
|
601
613
|
|
602
614
|
|
603
615
|
# OffsetUnit is a class to represent units with offset value.
|
604
|
-
# Allows
|
616
|
+
# Allows Fahrenheit/Celsius temperature.
|
617
|
+
# Unit operations are not allowed.
|
618
|
+
# @example
|
619
|
+
# require 'phys/units'
|
620
|
+
#
|
621
|
+
# Phys::Quantity[20,:tempC].want(:tempF) #=> Phys::Quantity[68,'tempF']
|
622
|
+
# Phys::Quantity[3,:tempC] + Phys::Quantity[10,:degF] #=> Phys::Quantity[(77/9),"tempC"]
|
623
|
+
# Phys::Quantity[3,:tempC] * Phys::Quantity[3,:m] #=> UnitError
|
624
|
+
# Phys::Quantity[3,:tempC] ** 2 #=> UnitError
|
625
|
+
#
|
626
|
+
# # Next examples currently work, but I suggest the use of degC and degF.
|
627
|
+
# Phys::Quantity[3,:tempC] + Phys::Quantity[10,:tempF] #=> Phys::Quantity[(77/9),"tempC"]
|
628
|
+
# Phys::Quantity[3,:tempC] * 2 #=> Phys::Quantity[6,"tempC"]
|
605
629
|
class OffsetUnit < Unit
|
606
630
|
|
607
631
|
def self.define(name,unit,offset=nil)
|
@@ -616,20 +640,6 @@ module Phys
|
|
616
640
|
@offset = offset
|
617
641
|
end
|
618
642
|
|
619
|
-
# Convert a quantity to this unit only in scale.
|
620
|
-
# @param [Phys::Quantity] quantity to be converted.
|
621
|
-
# @return [Phys::Quantity]
|
622
|
-
# @raise [UnitError] if unit conversion is failed.
|
623
|
-
def convert_scale(quantity)
|
624
|
-
if Quantity===quantity
|
625
|
-
assert_same_dimension(quantity.unit)
|
626
|
-
v = quantity.value * quantity.unit.conversion_factor
|
627
|
-
v = v / self.conversion_factor
|
628
|
-
else
|
629
|
-
raise UnitError,"not Quantity: #{quantity.inspect}"
|
630
|
-
end
|
631
|
-
end
|
632
|
-
|
633
643
|
# Convert from a value in this unit to a value in base unit.
|
634
644
|
# @param [Numeric] value
|
635
645
|
# @return [Numeric]
|
@@ -644,6 +654,7 @@ module Phys
|
|
644
654
|
(value - @offset) / conversion_factor
|
645
655
|
end
|
646
656
|
|
657
|
+
# Returns false
|
647
658
|
def operable?
|
648
659
|
false
|
649
660
|
end
|
@@ -18,9 +18,11 @@ module Phys
|
|
18
18
|
false
|
19
19
|
end
|
20
20
|
|
21
|
-
# Define a new Unit. Expression is
|
22
|
-
#
|
23
|
-
#
|
21
|
+
# Define a new Unit. Expression is parsed lazily, i.e., parsed
|
22
|
+
# not when this method is called, but when @factor and @dim is used.
|
23
|
+
# Note that the result of unit calculation depends on the timing of unit definition.
|
24
|
+
# @param [String,Symbol] name Name of the unit.
|
25
|
+
# @param [String] expr Expression of the unit.
|
24
26
|
def define(name,expr)
|
25
27
|
case name
|
26
28
|
when String
|
@@ -49,8 +51,9 @@ module Phys
|
|
49
51
|
|
50
52
|
|
51
53
|
# Force the argument to be Phys::Unit.
|
52
|
-
# @param [
|
54
|
+
# @param [Object] x
|
53
55
|
# @return [Phys::Unit]
|
56
|
+
# @raise [TypeError] if invalid type for units.
|
54
57
|
def cast(x)
|
55
58
|
case x
|
56
59
|
when Unit
|
@@ -14,6 +14,8 @@ module Phys
|
|
14
14
|
# Defines method with unit name.
|
15
15
|
# *Caution*: Variable names may conflict with unit names.
|
16
16
|
# @example
|
17
|
+
# require 'phys/units'
|
18
|
+
#
|
17
19
|
# Phys::UnitsMixin.module_eval do
|
18
20
|
# puts 123.4*km
|
19
21
|
# puts (23*mile/hr).want(m/s)
|
@@ -60,6 +62,8 @@ module Phys
|
|
60
62
|
# ActiveSupport-like mix-in.
|
61
63
|
# *Caution*: This kind of global change will cause unexpected problems.
|
62
64
|
# @example
|
65
|
+
# require 'phys/units'
|
66
|
+
#
|
63
67
|
# class Numeric
|
64
68
|
# include Phys::UnitsNumericMixin
|
65
69
|
# end
|
data/lib/phys/units/version.rb
CHANGED
data/lib/phys/units.rb
CHANGED
data/misc/misc_units.dat
ADDED
data/misc/mkunitspec.rb
CHANGED
data/spec/all_units_spec.rb
CHANGED
data/spec/quantity_spec.rb
CHANGED
@@ -126,10 +126,10 @@ describe "Phys::Quantity" do
|
|
126
126
|
end
|
127
127
|
|
128
128
|
context "Temperature" do
|
129
|
-
describe Q[1,"tempC"] - Q[1,"
|
129
|
+
describe Q[1,"tempC"] - Q[1,"degC"] do
|
130
130
|
it {should == Q[0,"tempC"]}
|
131
131
|
end
|
132
|
-
describe Q[50,"tempF"] + Q[10,"
|
132
|
+
describe Q[50,"tempF"] + Q[10,"degC"] do
|
133
133
|
it {should == Q[68,"tempF"]}
|
134
134
|
end
|
135
135
|
describe Q[0,"tempC"].want("tempF") do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phys-units
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masahiro TANAKA
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -65,6 +65,7 @@ files:
|
|
65
65
|
- lib/phys/units/units_mixin.rb
|
66
66
|
- lib/phys/units/utils.rb
|
67
67
|
- lib/phys/units/version.rb
|
68
|
+
- misc/misc_units.dat
|
68
69
|
- misc/mkjpspec.rb
|
69
70
|
- misc/mkunitspec.rb
|
70
71
|
- misc/readme.jp.md
|