universa_tools 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.idea/workspace.xml +104 -59
- data/README.md +25 -4
- data/lib/universa_tools/commons.rb +147 -96
- data/lib/universa_tools/errors.rb +5 -3
- data/lib/universa_tools/keyring.rb +14 -12
- data/lib/universa_tools/u_wallet.rb +137 -0
- data/lib/universa_tools/uniring.rb +3 -3
- data/lib/universa_tools/uns.rb +212 -0
- data/lib/universa_tools/version.rb +1 -1
- data/universa_tools.gemspec +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d846d55be3199f2f3e71bc8ba9c69a94ecde94d4a108f9861dea0e8c99c23c69
|
4
|
+
data.tar.gz: 32d94e1c9a4c1d1838e792e7768ccf66208110292a230dde3f703361b14532d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 620cc50e666e52911d95f50bce9bf885e4236a502e36360b1c55e1eab297d51ca0b4afb339073b48c0222801afbe12c49f16462bcfe28610eb86c25277998d67
|
7
|
+
data.tar.gz: 56d7392c339d53eeb1a36655f98896e0c5fd87b9f8a90c919abfda0160a5bb772253c1c1c8fb3b6059b29a4d30af1f2cb79280232a06d69a81964fdbe8d8714f
|
data/.idea/workspace.xml
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<project version="4">
|
3
3
|
<component name="ChangeListManager">
|
4
|
-
<list default="true" id="b5de240c-a3f4-4e4f-a942-24748bb7a400" name="Default Changelist" comment="">
|
4
|
+
<list default="true" id="b5de240c-a3f4-4e4f-a942-24748bb7a400" name="Default Changelist" comment="corrected UNS.reduce tables, after voting for цяb subst">
|
5
5
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
6
|
-
<change beforePath="$PROJECT_DIR$/lib/universa_tools/
|
6
|
+
<change beforePath="$PROJECT_DIR$/lib/universa_tools/commons.rb" beforeDir="false" afterPath="$PROJECT_DIR$/lib/universa_tools/commons.rb" afterDir="false" />
|
7
|
+
<change beforePath="$PROJECT_DIR$/lib/universa_tools/u_wallet.rb" beforeDir="false" afterPath="$PROJECT_DIR$/lib/universa_tools/u_wallet.rb" afterDir="false" />
|
8
|
+
<change beforePath="$PROJECT_DIR$/lib/universa_tools/uns.rb" beforeDir="false" afterPath="$PROJECT_DIR$/lib/universa_tools/uns.rb" afterDir="false" />
|
9
|
+
<change beforePath="$PROJECT_DIR$/lib/universa_tools/version.rb" beforeDir="false" afterPath="$PROJECT_DIR$/lib/universa_tools/version.rb" afterDir="false" />
|
10
|
+
<change beforePath="$PROJECT_DIR$/spec/u_wallet_spec.rb" beforeDir="false" afterPath="$PROJECT_DIR$/spec/u_wallet_spec.rb" afterDir="false" />
|
11
|
+
<change beforePath="$PROJECT_DIR$/spec/uns_spec.rb" beforeDir="false" afterPath="$PROJECT_DIR$/spec/uns_spec.rb" afterDir="false" />
|
7
12
|
<change beforePath="$PROJECT_DIR$/universa_tools.gemspec" beforeDir="false" afterPath="$PROJECT_DIR$/universa_tools.gemspec" afterDir="false" />
|
8
13
|
</list>
|
9
14
|
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
|
@@ -15,8 +20,8 @@
|
|
15
20
|
<component name="FileTemplateManagerImpl">
|
16
21
|
<option name="RECENT_TEMPLATES">
|
17
22
|
<list>
|
18
|
-
<option value="Ruby File" />
|
19
23
|
<option value="Ruby Class" />
|
24
|
+
<option value="Ruby File" />
|
20
25
|
</list>
|
21
26
|
</option>
|
22
27
|
</component>
|
@@ -27,8 +32,8 @@
|
|
27
32
|
<component name="PropertiesComponent">
|
28
33
|
<property name="RakeTaksPopup.undocumentedIncluded" value="false" />
|
29
34
|
<property name="WebServerToolWindowFactoryState" value="false" />
|
30
|
-
<property name="com.intellij.ide.scratch.LRUPopupBuilder$1/New Scratch File" value="JavaScript 1.8" />
|
31
|
-
<property name="last_opened_file_path" value="$PROJECT_DIR$/
|
35
|
+
<property name="com.intellij.ide.scratch.LRUPopupBuilder$1/New Scratch File" value="ruby JavaScript 1.8" />
|
36
|
+
<property name="last_opened_file_path" value="$PROJECT_DIR$/spec" />
|
32
37
|
<property name="node.js.detected.package.eslint" value="true" />
|
33
38
|
<property name="node.js.detected.package.tslint" value="true" />
|
34
39
|
<property name="node.js.path.for.package.eslint" value="project" />
|
@@ -43,8 +48,8 @@
|
|
43
48
|
</component>
|
44
49
|
<component name="RecentsManager">
|
45
50
|
<key name="CopyFile.RECENT_KEYS">
|
46
|
-
<recent name="$PROJECT_DIR$/lib/universa_tools" />
|
47
51
|
<recent name="$PROJECT_DIR$/spec" />
|
52
|
+
<recent name="$PROJECT_DIR$/lib/universa_tools" />
|
48
53
|
<recent name="$PROJECT_DIR$/exe" />
|
49
54
|
</key>
|
50
55
|
</component>
|
@@ -61,40 +66,26 @@
|
|
61
66
|
</option>
|
62
67
|
</component>
|
63
68
|
<component name="RunManager" selected="RSpec.All specs in spec: universa_tools">
|
64
|
-
<configuration name="
|
69
|
+
<configuration name="IRB console: universa_tools" type="IrbRunConfigurationType" factoryName="IRB console" temporary="true">
|
65
70
|
<module name="universa_tools" />
|
66
|
-
<
|
67
|
-
<
|
68
|
-
<
|
69
|
-
<
|
70
|
-
<
|
71
|
-
<
|
72
|
-
<envs>
|
73
|
-
<env name="JRUBY_OPTS" value="-X+O" />
|
74
|
-
</envs>
|
75
|
-
<EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="true" />
|
71
|
+
<IRB_RUN_CONFIG NAME="RUBY_ARGS" VALUE="" />
|
72
|
+
<IRB_RUN_CONFIG NAME="WORK DIR" VALUE="$MODULE_DIR$" />
|
73
|
+
<IRB_RUN_CONFIG NAME="SHOULD_USE_SDK" VALUE="false" />
|
74
|
+
<IRB_RUN_CONFIG NAME="ALTERN_SDK_NAME" VALUE="" />
|
75
|
+
<IRB_RUN_CONFIG NAME="myPassParentEnvs" VALUE="true" />
|
76
|
+
<EXTENSION ID="BundlerRunConfigurationExtension" bundleExecEnabled="false" />
|
76
77
|
<EXTENSION ID="JRubyRunConfigurationExtension" NailgunExecEnabled="false" />
|
77
78
|
<EXTENSION ID="RubyCoverageRunConfigurationExtension" track_test_folders="true" runner="rcov">
|
78
79
|
<COVERAGE_PATTERN ENABLED="true">
|
79
80
|
<PATTERN REGEXPS="/.rvm/" INCLUDED="false" />
|
80
81
|
</COVERAGE_PATTERN>
|
81
82
|
</EXTENSION>
|
82
|
-
<
|
83
|
-
<
|
84
|
-
<
|
85
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="'**/*_spec.rb'" />
|
86
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="" />
|
87
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="ALL_IN_FOLDER" />
|
88
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
|
89
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
|
90
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="USE_CUSTOM_SPEC_RUNNER" VALUE="false" />
|
91
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="DRB" VALUE="false" />
|
92
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="ZEUS" VALUE="false" />
|
93
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPRING" VALUE="false" />
|
94
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
|
83
|
+
<IRB_RUN_CONFIG NAME="SCRIPT_PATH" VALUE="$APPLICATION_HOME_DIR$/rb/testing/runner/irb.rb" />
|
84
|
+
<IRB_RUN_CONFIG NAME="SCRIPT_ARGS" VALUE="--prompt simple" />
|
85
|
+
<IRB_RUN_CONFIG NAME="IS_RAILS_CONSOLE" VALUE="false" />
|
95
86
|
<method v="2" />
|
96
87
|
</configuration>
|
97
|
-
<configuration name="
|
88
|
+
<configuration name="All specs in spec: universa_tools" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true">
|
98
89
|
<module name="universa_tools" />
|
99
90
|
<predefined_log_file enabled="true" id="RUBY_RSPEC" />
|
100
91
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="" />
|
@@ -112,12 +103,12 @@
|
|
112
103
|
<PATTERN REGEXPS="/.rvm/" INCLUDED="false" />
|
113
104
|
</COVERAGE_PATTERN>
|
114
105
|
</EXTENSION>
|
115
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
|
116
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="
|
106
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="$MODULE_DIR$/spec" />
|
107
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="" />
|
117
108
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
|
118
109
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="'**/*_spec.rb'" />
|
119
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="
|
120
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="
|
110
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="" />
|
111
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="ALL_IN_FOLDER" />
|
121
112
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
|
122
113
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
|
123
114
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="USE_CUSTOM_SPEC_RUNNER" VALUE="false" />
|
@@ -127,7 +118,7 @@
|
|
127
118
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
|
128
119
|
<method v="2" />
|
129
120
|
</configuration>
|
130
|
-
<configuration name="
|
121
|
+
<configuration name="UNS reduces" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true" nameIsGenerated="true">
|
131
122
|
<module name="universa_tools" />
|
132
123
|
<predefined_log_file enabled="true" id="RUBY_RSPEC" />
|
133
124
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="" />
|
@@ -146,10 +137,10 @@
|
|
146
137
|
</COVERAGE_PATTERN>
|
147
138
|
</EXTENSION>
|
148
139
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
|
149
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/
|
140
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/uns_spec.rb" />
|
150
141
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
|
151
142
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="'**/*_spec.rb'" />
|
152
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="
|
143
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="UNS reduces" />
|
153
144
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="TEST_SCRIPT" />
|
154
145
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
|
155
146
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
|
@@ -160,7 +151,7 @@
|
|
160
151
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
|
161
152
|
<method v="2" />
|
162
153
|
</configuration>
|
163
|
-
<configuration name="
|
154
|
+
<configuration name="u_wallet constructs" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true" nameIsGenerated="true">
|
164
155
|
<module name="universa_tools" />
|
165
156
|
<predefined_log_file enabled="true" id="RUBY_RSPEC" />
|
166
157
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="" />
|
@@ -179,10 +170,10 @@
|
|
179
170
|
</COVERAGE_PATTERN>
|
180
171
|
</EXTENSION>
|
181
172
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
|
182
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/
|
173
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/u_wallet_spec.rb" />
|
183
174
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
|
184
175
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="'**/*_spec.rb'" />
|
185
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="
|
176
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="u_wallet constructs" />
|
186
177
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="TEST_SCRIPT" />
|
187
178
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
|
188
179
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
|
@@ -193,7 +184,7 @@
|
|
193
184
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="FULL_BACKTRACE" VALUE="false" />
|
194
185
|
<method v="2" />
|
195
186
|
</configuration>
|
196
|
-
<configuration name="
|
187
|
+
<configuration name="u_wallet pays uns" type="RSpecRunConfigurationType" factoryName="RSpec" temporary="true" nameIsGenerated="true">
|
197
188
|
<module name="universa_tools" />
|
198
189
|
<predefined_log_file enabled="true" id="RUBY_RSPEC" />
|
199
190
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUBY_ARGS" VALUE="" />
|
@@ -212,10 +203,10 @@
|
|
212
203
|
</COVERAGE_PATTERN>
|
213
204
|
</EXTENSION>
|
214
205
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TESTS_FOLDER_PATH" VALUE="" />
|
215
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/
|
206
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_SCRIPT_PATH" VALUE="$MODULE_DIR$/spec/u_wallet_spec.rb" />
|
216
207
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_RUNNER_PATH" VALUE="" />
|
217
208
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_FILE_MASK" VALUE="'**/*_spec.rb'" />
|
218
|
-
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="" />
|
209
|
+
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_EXAMPLE_NAME" VALUE="u_wallet pays uns" />
|
219
210
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="TEST_TEST_TYPE" VALUE="TEST_SCRIPT" />
|
220
211
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="SPEC_ARGS" VALUE="" />
|
221
212
|
<RSPEC_RUN_CONFIG_SETTINGS_ID NAME="RUNNER_VERSION" VALUE="" />
|
@@ -229,10 +220,10 @@
|
|
229
220
|
<recent_temporary>
|
230
221
|
<list>
|
231
222
|
<item itemvalue="RSpec.All specs in spec: universa_tools" />
|
232
|
-
<item itemvalue="RSpec.
|
233
|
-
<item itemvalue="RSpec.
|
234
|
-
<item itemvalue="
|
235
|
-
<item itemvalue="RSpec.
|
223
|
+
<item itemvalue="RSpec.u_wallet pays uns" />
|
224
|
+
<item itemvalue="RSpec.u_wallet constructs" />
|
225
|
+
<item itemvalue="IRB console.IRB console: universa_tools" />
|
226
|
+
<item itemvalue="RSpec.UNS reduces" />
|
236
227
|
</list>
|
237
228
|
</recent_temporary>
|
238
229
|
</component>
|
@@ -252,7 +243,13 @@
|
|
252
243
|
<workItem from="1566484011256" duration="10407000" />
|
253
244
|
<workItem from="1566652054854" duration="6251000" />
|
254
245
|
<workItem from="1566918610808" duration="6926000" />
|
255
|
-
<workItem from="1567097255700" duration="
|
246
|
+
<workItem from="1567097255700" duration="41011000" />
|
247
|
+
<workItem from="1567447512704" duration="12625000" />
|
248
|
+
<workItem from="1567724347584" duration="10000" />
|
249
|
+
<workItem from="1567801865613" duration="9803000" />
|
250
|
+
<workItem from="1568079682395" duration="4917000" />
|
251
|
+
<workItem from="1568278985272" duration="260000" />
|
252
|
+
<workItem from="1570002431639" duration="333000" />
|
256
253
|
</task>
|
257
254
|
<task id="LOCAL-00001" summary="initial">
|
258
255
|
<created>1566484458753</created>
|
@@ -324,7 +321,42 @@
|
|
324
321
|
<option name="project" value="LOCAL" />
|
325
322
|
<updated>1567374720298</updated>
|
326
323
|
</task>
|
327
|
-
<
|
324
|
+
<task id="LOCAL-00011" summary="gesmpec requirement for ruby 2.6+">
|
325
|
+
<created>1567412117627</created>
|
326
|
+
<option name="number" value="00011" />
|
327
|
+
<option name="presentableId" value="LOCAL-00011" />
|
328
|
+
<option name="project" value="LOCAL" />
|
329
|
+
<updated>1567412117627</updated>
|
330
|
+
</task>
|
331
|
+
<task id="LOCAL-00012" summary="extended readme, added online docs to it.">
|
332
|
+
<created>1567416531068</created>
|
333
|
+
<option name="number" value="00012" />
|
334
|
+
<option name="presentableId" value="LOCAL-00012" />
|
335
|
+
<option name="project" value="LOCAL" />
|
336
|
+
<updated>1567416531068</updated>
|
337
|
+
</task>
|
338
|
+
<task id="LOCAL-00013" summary="initial reduce implementation">
|
339
|
+
<created>1567808617362</created>
|
340
|
+
<option name="number" value="00013" />
|
341
|
+
<option name="presentableId" value="LOCAL-00013" />
|
342
|
+
<option name="project" value="LOCAL" />
|
343
|
+
<updated>1567808617362</updated>
|
344
|
+
</task>
|
345
|
+
<task id="LOCAL-00014" summary="initial reduce implementation, improved">
|
346
|
+
<created>1567809088126</created>
|
347
|
+
<option name="number" value="00014" />
|
348
|
+
<option name="presentableId" value="LOCAL-00014" />
|
349
|
+
<option name="project" value="LOCAL" />
|
350
|
+
<updated>1567809088126</updated>
|
351
|
+
</task>
|
352
|
+
<task id="LOCAL-00015" summary="corrected UNS.reduce tables, after voting for цяb subst">
|
353
|
+
<created>1568079790194</created>
|
354
|
+
<option name="number" value="00015" />
|
355
|
+
<option name="presentableId" value="LOCAL-00015" />
|
356
|
+
<option name="project" value="LOCAL" />
|
357
|
+
<updated>1568079790194</updated>
|
358
|
+
</task>
|
359
|
+
<option name="localTasksCounter" value="16" />
|
328
360
|
<servers />
|
329
361
|
</component>
|
330
362
|
<component name="TypeScriptGeneratedFilesManager">
|
@@ -354,14 +386,19 @@
|
|
354
386
|
<MESSAGE value="more specs" />
|
355
387
|
<MESSAGE value="first working version. KeyRing class and uniring CLI interface to it." />
|
356
388
|
<MESSAGE value="missing docs" />
|
357
|
-
<
|
389
|
+
<MESSAGE value="gesmpec requirement for ruby 2.6+" />
|
390
|
+
<MESSAGE value="extended readme, added online docs to it." />
|
391
|
+
<MESSAGE value="initial reduce implementation" />
|
392
|
+
<MESSAGE value="initial reduce implementation, improved" />
|
393
|
+
<MESSAGE value="corrected UNS.reduce tables, after voting for цяb subst" />
|
394
|
+
<option name="LAST_COMMIT_MESSAGE" value="corrected UNS.reduce tables, after voting for цяb subst" />
|
358
395
|
</component>
|
359
396
|
<component name="XDebuggerManager">
|
360
397
|
<breakpoint-manager>
|
361
398
|
<breakpoints>
|
362
399
|
<line-breakpoint enabled="true" type="ruby-line">
|
363
400
|
<url>file://$PROJECT_DIR$/lib/universa_tools/keyring.rb</url>
|
364
|
-
<line>
|
401
|
+
<line>48</line>
|
365
402
|
<properties a="-1">
|
366
403
|
<option name="block-ordinal" value="-1" />
|
367
404
|
</properties>
|
@@ -372,23 +409,31 @@
|
|
372
409
|
</component>
|
373
410
|
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
374
411
|
<SUITE FILE_PATH="coverage/universa_tools@uniring_utility_shows_help.rcov" NAME="uniring utility shows help Coverage Results" MODIFIED="1567296251788" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
375
|
-
<SUITE FILE_PATH="coverage/universa_tools@
|
412
|
+
<SUITE FILE_PATH="coverage/universa_tools@UNS.rcov" NAME="UNS Coverage Results" MODIFIED="1567849178662" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
376
413
|
<SUITE FILE_PATH="coverage/universa_tools@uniring_spec.rcov" NAME="uniring_spec Coverage Results" MODIFIED="1567371103192" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
377
|
-
<SUITE FILE_PATH="coverage/universa_tools@uniring_utility_add_keys.rcov" NAME="uniring utility add keys Coverage Results" MODIFIED="1567367228624" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
378
|
-
<SUITE FILE_PATH="coverage/universa_tools@UniversaTools_creates_new_ring.rcov" NAME="UniversaTools creates new ring Coverage Results" MODIFIED="1567256636642" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
379
414
|
<SUITE FILE_PATH="coverage/universa_tools@UniversaTools_makes_pbkdf2_KR.rcov" NAME="UniversaTools makes pbkdf2 KR Coverage Results" MODIFIED="1567166457196" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
380
415
|
<SUITE FILE_PATH="coverage/universa_tools@uniring_utility_creates_emp___.rcov" NAME="uniring utility creates emp... Coverage Results" MODIFIED="1567296357954" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
381
416
|
<SUITE FILE_PATH="coverage/universa_tools@uniring_utility.rcov" NAME="uniring utility Coverage Results" MODIFIED="1567369219760" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
382
417
|
<SUITE FILE_PATH="coverage/universa_tools@UniversaTools_suports_readonly.rcov" NAME="UniversaTools suports readonly Coverage Results" MODIFIED="1567256639449" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
383
418
|
<SUITE FILE_PATH="coverage/universa_tools@uniring_utility_creates_emp_____1_.rcov" NAME="uniring utility creates emp... (1) Coverage Results" MODIFIED="1567342698032" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
419
|
+
<SUITE FILE_PATH="coverage/universa_tools@u_wallet_pays_uns.rcov" NAME="u_wallet pays uns Coverage Results" MODIFIED="1568189575664" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
420
|
+
<SUITE FILE_PATH="coverage/universa_tools@All_specs_in_spec__universa_tools.rcov" NAME="All specs in spec: universa_tools Coverage Results" MODIFIED="1570002738331" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
421
|
+
<SUITE FILE_PATH="coverage/universa_tools@UniversaTools_can_create_UN___.rcov" NAME="UniversaTools can create UN... Coverage Results" MODIFIED="1567848976512" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
422
|
+
<SUITE FILE_PATH="coverage/universa_tools@keying_spec.rcov" NAME="keying_spec Coverage Results" MODIFIED="1567466681075" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
423
|
+
<SUITE FILE_PATH="coverage/universa_tools@fix.rcov" NAME="fix Coverage Results" MODIFIED="1566936576002" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$USER_HOME$/Nextcloud/xchange support cases/0001-2019-01-Dimmao" MODULE_NAME="universa_tools" />
|
424
|
+
<SUITE FILE_PATH="coverage/universa_tools@IRB_console__universa_tools.rcov" NAME="IRB console: universa_tools Coverage Results" MODIFIED="1568080543716" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
425
|
+
<SUITE FILE_PATH="coverage/universa_tools@uniring.rcov" NAME="uniring Coverage Results" MODIFIED="1566914082799" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/lib/universa_tools" MODULE_NAME="universa_tools" />
|
426
|
+
<SUITE FILE_PATH="coverage/universa_tools@uniring_utility_add_keys.rcov" NAME="uniring utility add keys Coverage Results" MODIFIED="1567367228624" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
427
|
+
<SUITE FILE_PATH="coverage/universa_tools@UniversaTools_creates_new_ring.rcov" NAME="UniversaTools creates new ring Coverage Results" MODIFIED="1567256636642" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
428
|
+
<SUITE FILE_PATH="coverage/universa_tools@UniversaTools.rcov" NAME="UniversaTools Coverage Results" MODIFIED="1567849174960" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
384
429
|
<SUITE FILE_PATH="coverage/universa_tools@UniversaTools_serialized_in___.rcov" NAME="UniversaTools serialized in... Coverage Results" MODIFIED="1567166819227" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
385
430
|
<SUITE FILE_PATH="coverage/universa_tools@UniversaTools_can_be_re_sav___.rcov" NAME="UniversaTools can be re-sav... Coverage Results" MODIFIED="1567189309931" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
431
|
+
<SUITE FILE_PATH="coverage/universa_tools@UNS_reduces.rcov" NAME="UNS reduces Coverage Results" MODIFIED="1568079757574" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
432
|
+
<SUITE FILE_PATH="coverage/universa_tools@u_wallet_constructs.rcov" NAME="u_wallet constructs Coverage Results" MODIFIED="1568081011308" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
386
433
|
<SUITE FILE_PATH="coverage/universa_tools@ecrypted_record_spec.rcov" NAME="ecrypted_record_spec Coverage Results" MODIFIED="1567176607842" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
387
434
|
<SUITE FILE_PATH="coverage/universa_tools@uctool.rcov" NAME="uctool Coverage Results" MODIFIED="1566939090919" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/exe" MODULE_NAME="universa_tools" />
|
388
435
|
<SUITE FILE_PATH="coverage/universa_tools@KeyRing.rcov" NAME="KeyRing Coverage Results" MODIFIED="1567368477544" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
389
|
-
<SUITE FILE_PATH="coverage/universa_tools@
|
390
|
-
<SUITE FILE_PATH="coverage/universa_tools@
|
391
|
-
<SUITE FILE_PATH="coverage/universa_tools@fix.rcov" NAME="fix Coverage Results" MODIFIED="1566936576002" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$USER_HOME$/Nextcloud/xchange support cases/0001-2019-01-Dimmao" MODULE_NAME="universa_tools" />
|
392
|
-
<SUITE FILE_PATH="coverage/universa_tools@IRB_console__universa_tools.rcov" NAME="IRB console: universa_tools Coverage Results" MODIFIED="1567163029632" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
436
|
+
<SUITE FILE_PATH="coverage/universa_tools@KeyRing_creates_new_ring.rcov" NAME="KeyRing creates new ring Coverage Results" MODIFIED="1567465475995" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" MODULE_NAME="universa_tools" />
|
437
|
+
<SUITE FILE_PATH="coverage/universa_tools@UnsService.rcov" NAME="UnsService Coverage Results" MODIFIED="1567802448797" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="rcov" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/lib/universa_tools" MODULE_NAME="universa_tools" />
|
393
438
|
</component>
|
394
439
|
</project>
|
data/README.md
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
# UniversaTools
|
2
2
|
|
3
|
-
|
3
|
+
The set of command-line tools and utility classes to simplify using Universa blockchain
|
4
|
+
in ruby projects. Alfa stagem see usage section below for features by state.
|
4
5
|
|
6
|
+
## Why not universa gem?
|
7
|
+
|
8
|
+
This workw was split from universa gem because of its lightweight nature allowing
|
9
|
+
easy, painless upgrades, unlike huge universa gem that causes few megs of universa core
|
10
|
+
libraries to be reinstalled on each release. Therefore, we limit releases
|
11
|
+
of [universa gem] to the universa core and adapters updates, and put most of work in porgres
|
12
|
+
in this lightweight gem.
|
5
13
|
|
6
14
|
## Installation
|
7
15
|
|
@@ -21,8 +29,16 @@ Or install it yourself as:
|
|
21
29
|
|
22
30
|
## Usage
|
23
31
|
|
24
|
-
|
32
|
+
Please see [online docs], the following are ready to beta test:
|
33
|
+
|
34
|
+
- [KeyRing](https://kb.universablockchain.com/system/static/gem_universa_tools/UniversaTools/KeyRing.html)
|
35
|
+
|
36
|
+
### Command line tools:
|
25
37
|
|
38
|
+
When the gem is installed, get tools help with the terminal:
|
39
|
+
|
40
|
+
uctool -h
|
41
|
+
uniring -h
|
26
42
|
|
27
43
|
## Development
|
28
44
|
|
@@ -32,7 +48,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
48
|
|
33
49
|
## Contributing
|
34
50
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/universa_tools. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the
|
51
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/universa_tools. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct below.
|
36
52
|
|
37
53
|
## License
|
38
54
|
|
@@ -40,4 +56,9 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
40
56
|
|
41
57
|
## Code of Conduct
|
42
58
|
|
43
|
-
|
59
|
+
We have simplified it and on focus the development not social networking.
|
60
|
+
|
61
|
+
Everyone interacting in the UniversaTools project’s codebase, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/universa_tools/blob/master/CODE_OF_CONDUCT.md).
|
62
|
+
|
63
|
+
[universa gem]:https://github.com/sergeych/universa
|
64
|
+
[online docs]:https://kb.universablockchain.com/system/static/gem_universa_tools
|
@@ -1,135 +1,168 @@
|
|
1
1
|
require 'ansi/code'
|
2
2
|
|
3
3
|
module UniversaTools
|
4
|
+
module Commons
|
5
|
+
|
6
|
+
using Universa
|
7
|
+
|
8
|
+
def human_to_i value, factor = 1000
|
9
|
+
head, tail = value[0...-1], value[-1]
|
10
|
+
case tail
|
11
|
+
when 'k', 'K'
|
12
|
+
head.to_i * 1000
|
13
|
+
when 'M', 'm'
|
14
|
+
head.to_i * factor * factor
|
15
|
+
when 'G', 'g'
|
16
|
+
head.to_i * factor * factor * factor
|
17
|
+
else
|
18
|
+
value.to_t
|
19
|
+
end
|
20
|
+
end
|
4
21
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
22
|
+
def seconds_to_hms seconds
|
23
|
+
mm, ss = seconds.divmod(60)
|
24
|
+
hh, mm = mm.divmod(60)
|
25
|
+
"%d:%02d:%02d" % [hh, mm, ss]
|
26
|
+
end
|
27
|
+
|
28
|
+
def run_options_parser(opt_parser, tasks_before_commands: false, check_empty: true, &command_parser)
|
29
|
+
commands = opt_parser.order!
|
30
|
+
if check_empty && @tasks.empty?
|
31
|
+
puts opt_parser.banner
|
32
|
+
puts "\nnothing to do. Use -h for help\n"
|
16
33
|
else
|
17
|
-
|
34
|
+
@tasks.each { |t| t.call } if tasks_before_commands
|
35
|
+
command_parser&.call(commands)
|
36
|
+
@tasks.each { |t| t.call } unless tasks_before_commands
|
37
|
+
end
|
38
|
+
rescue MessageException, OptionParser::ParseError => e
|
39
|
+
STDERR.puts ANSI.red { ANSI.bold { "\nError: #{e}\n" } }
|
40
|
+
exit(1000)
|
41
|
+
rescue Interrupt
|
42
|
+
exit(1010)
|
43
|
+
rescue
|
44
|
+
STDERR.puts ANSI.red { "\n#{$!.backtrace.reverse.join("\n")}\n" }
|
45
|
+
STDERR.puts ANSI.red { ANSI.bold { "Error: #$! (#{$!.class.name})" } }
|
46
|
+
exit(2000)
|
18
47
|
end
|
19
|
-
end
|
20
48
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
"%d:%02d:%02d" % [hh, mm, ss]
|
25
|
-
end
|
49
|
+
def todo!(text)
|
50
|
+
raise NotImplementedError, text
|
51
|
+
end
|
26
52
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
puts opt_parser.banner
|
31
|
-
puts "\nnothing to do. Use -h for help\n"
|
32
|
-
else
|
33
|
-
@tasks.each { |t| t.call } if tasks_before_commands
|
34
|
-
command_parser&.call(commands)
|
35
|
-
@tasks.each { |t| t.call } unless tasks_before_commands
|
53
|
+
def error_style(message = nil)
|
54
|
+
message ||= yield
|
55
|
+
ANSI.bold { ANSI.red { message } }
|
36
56
|
end
|
37
|
-
rescue MessageException, OptionParser::ParseError => e
|
38
|
-
STDERR.puts ANSI.red { ANSI.bold { "\nError: #{e}\n" } }
|
39
|
-
exit(1000)
|
40
|
-
rescue Interrupt
|
41
|
-
exit(1010)
|
42
|
-
rescue
|
43
|
-
STDERR.puts ANSI.red { "\n#{$!.backtrace.reverse.join("\n")}\n" }
|
44
|
-
STDERR.puts ANSI.red { ANSI.bold { "Error: #$! (#{$!.class.name})" } }
|
45
|
-
exit(2000)
|
46
|
-
end
|
47
57
|
|
48
|
-
|
49
|
-
|
50
|
-
|
58
|
+
def success_style(message = nil)
|
59
|
+
message ||= yield
|
60
|
+
ANSI.bold { ANSI.green { message } }
|
61
|
+
end
|
51
62
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
63
|
+
def warning_style(message = nil)
|
64
|
+
message ||= yield
|
65
|
+
ANSI.bold { ANSI.yellow { message } }
|
66
|
+
end
|
56
67
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
68
|
+
alnums = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
69
|
+
ALNUMS = (alnums + alnums.downcase + '_' + '0123456789').chars.to_ary
|
70
|
+
NUMBERS = "0123456789".chars.to_ary
|
61
71
|
|
62
|
-
|
63
|
-
|
64
|
-
ANSI.bold { ANSI.yellow { message } }
|
65
|
-
end
|
72
|
+
module CliCommands
|
73
|
+
class Command
|
66
74
|
|
67
|
-
|
68
|
-
ALNUMS = (alnums + alnums.downcase + '_' + '0123456789').chars.to_ary
|
69
|
-
NUMBERS = "0123456789".chars.to_ary
|
75
|
+
attr :name, :description, :second_name, :dispatcher
|
70
76
|
|
71
|
-
|
72
|
-
|
77
|
+
def initialize(name, second_name, description, dispatcher)
|
78
|
+
@name, @second_name, @description, @dispatcher = name, second_name, description, dispatcher
|
79
|
+
end
|
73
80
|
|
74
|
-
|
81
|
+
end
|
75
82
|
|
76
|
-
def
|
77
|
-
|
83
|
+
def cmd(name1, name2, description = nil, &block)
|
84
|
+
if !description
|
85
|
+
description = name2
|
86
|
+
name2 = nil
|
87
|
+
end
|
88
|
+
command = Command.new(name1, name2, description, block)
|
89
|
+
@commands[name1] = command
|
90
|
+
@commands[name2] = command if name2
|
78
91
|
end
|
79
92
|
|
80
|
-
|
93
|
+
def cmd_list
|
94
|
+
puts "Listing contents of #@keyring_path:"
|
95
|
+
keyring
|
96
|
+
end
|
81
97
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
98
|
+
def init_commands
|
99
|
+
cmd("help", "help on supported commands. To get extended help on some command, use 'help <command>'.") { |args|
|
100
|
+
STDOUT.puts @option_parser.banner
|
101
|
+
puts ""
|
102
|
+
if args.empty?
|
103
|
+
puts "#{ANSI.bold { "Available commands:" }}\n\n"
|
104
|
+
cc = @commands.values.uniq
|
105
|
+
first_column_size = cc.map { |x| x.name.size }.max + 2
|
106
|
+
cc.each { |cmd|
|
107
|
+
description_lines =
|
108
|
+
first_spacer = ANSI.bold { ANSI.yellow { "%#{-first_column_size}s" % cmd.name } }
|
109
|
+
next_spacer = ' ' * first_column_size
|
110
|
+
cmd.description.word_wrap(@term_width - first_column_size).lines.each_with_index { |s, n|
|
111
|
+
STDOUT << (n == 0 ? first_spacer : next_spacer)
|
112
|
+
STDOUT.puts s
|
113
|
+
}
|
114
|
+
|
115
|
+
}
|
116
|
+
else
|
117
|
+
puts "-- not yet ready"
|
118
|
+
end
|
119
|
+
}
|
120
|
+
|
121
|
+
cmd("list", "l", "show contents of the keyring")
|
86
122
|
end
|
87
|
-
command = Command.new(name1, name2, description, block)
|
88
|
-
@commands[name1] = command
|
89
|
-
@commands[name2] = command if name2
|
90
123
|
end
|
91
124
|
|
92
|
-
def
|
93
|
-
|
94
|
-
|
125
|
+
def create_temp_file_name root_path, extension
|
126
|
+
loop do
|
127
|
+
name = "#{root_path}/#{17.random_alnums}.#{extension}"
|
128
|
+
return name if !File.exists?(name)
|
129
|
+
end
|
95
130
|
end
|
96
131
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
cc = @commands.values.uniq
|
104
|
-
first_column_size = cc.map { |x| x.name.size }.max + 2
|
105
|
-
cc.each { |cmd|
|
106
|
-
description_lines =
|
107
|
-
first_spacer = ANSI.bold { ANSI.yellow { "%#{-first_column_size}s" % cmd.name } }
|
108
|
-
next_spacer = ' ' * first_column_size
|
109
|
-
cmd.description.word_wrap(@term_width - first_column_size).lines.each_with_index { |s, n|
|
110
|
-
STDOUT << (n == 0 ? first_spacer : next_spacer)
|
111
|
-
STDOUT.puts s
|
112
|
-
}
|
132
|
+
# Load contratc from the path
|
133
|
+
# @param [String] path to load contract from
|
134
|
+
# @return [Universa::Contract]
|
135
|
+
def load_contract(path)
|
136
|
+
open(path, 'rb') { |f| Universa::Contract.from_packed(f.read) }
|
137
|
+
end
|
113
138
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
139
|
+
# Load private key from file
|
140
|
+
#
|
141
|
+
# @param [String] path to load key from
|
142
|
+
# @param [String] password optional password
|
143
|
+
# @return [Universa::PrivateKey]
|
144
|
+
def load_private_key(path, password: nil)
|
145
|
+
file_name = File.expand_path path
|
146
|
+
if !File.exists?(file_name)
|
147
|
+
file_name += ".private.unikey"
|
148
|
+
raise NotFoundException.new(path) unless File.exists?(file_name)
|
149
|
+
end
|
150
|
+
open(file_name, 'rb') { |f| Universa::PrivateKey.from_packed(f.read, password: password) }
|
151
|
+
end
|
119
152
|
|
120
|
-
|
153
|
+
def error(message)
|
154
|
+
raise UniversaTools::MessageException, message
|
121
155
|
end
|
122
156
|
end
|
123
|
-
|
124
157
|
end
|
125
158
|
|
126
159
|
class Integer
|
127
160
|
def random_alnums
|
128
|
-
to_i.times.map { UniversaTools::ALNUMS.sample }.join('')
|
161
|
+
to_i.times.map { UniversaTools::Commons::ALNUMS.sample }.join('')
|
129
162
|
end
|
130
163
|
|
131
164
|
def random_digits
|
132
|
-
to_i.times.map { UniversaTools::NUMBERS.sample }.join('')
|
165
|
+
to_i.times.map { UniversaTools::Commons::NUMBERS.sample }.join('')
|
133
166
|
end
|
134
167
|
|
135
168
|
def random_bytes
|
@@ -137,4 +170,22 @@ class Integer
|
|
137
170
|
end
|
138
171
|
end
|
139
172
|
|
173
|
+
class Numeric
|
174
|
+
def seconds
|
175
|
+
self
|
176
|
+
end
|
177
|
+
|
178
|
+
def minutes
|
179
|
+
self*60
|
180
|
+
end
|
181
|
+
|
182
|
+
def hours
|
183
|
+
self*3600
|
184
|
+
end
|
185
|
+
|
186
|
+
def days
|
187
|
+
self*86400
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
140
191
|
|
@@ -19,10 +19,12 @@ module UniversaTools
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
|
22
|
+
class InsufficientFundsException < CodeException
|
23
|
+
def initialize
|
24
|
+
super(:insufficient_funds)
|
25
|
+
end
|
26
|
+
end
|
23
27
|
|
24
|
-
def error(message)
|
25
|
-
raise UniversaTools::MessageException, message
|
26
28
|
end
|
27
29
|
|
28
30
|
|
@@ -17,6 +17,8 @@ module UniversaTools
|
|
17
17
|
# itself in the unsafe containers (dropbox, github, google disk, etc.)
|
18
18
|
class KeyRing
|
19
19
|
|
20
|
+
include Commons
|
21
|
+
|
20
22
|
attr :keys
|
21
23
|
|
22
24
|
# The record class that hold key, tag and associated information inside the ring
|
@@ -79,7 +81,7 @@ module UniversaTools
|
|
79
81
|
if @key_addresses[key.short_address] || @key_addresses[key.long_address]
|
80
82
|
raise ArgumentError, "key is already in the ring"
|
81
83
|
end
|
82
|
-
kr = KeyRecord.new(tag, key, key_data, create_temp_file_name('data'))
|
84
|
+
kr = KeyRecord.new(tag, key, key_data, create_temp_file_name(@root_path, 'data'))
|
83
85
|
kr.save(@main_key)
|
84
86
|
@keys << kr
|
85
87
|
@key_tags[tag] = kr
|
@@ -101,8 +103,9 @@ module UniversaTools
|
|
101
103
|
}
|
102
104
|
end
|
103
105
|
|
104
|
-
# Find a key by tag or address
|
105
|
-
# @param [String | KeyAddress] tag_or_address to look for
|
106
|
+
# Find a key by tag or address.
|
107
|
+
# @param [String | KeyAddress] tag_or_address to look for. String could be a tag or string representation of
|
108
|
+
# KeyAddress
|
106
109
|
# @return [PrivateKey] or nil
|
107
110
|
def [](tag_or_address)
|
108
111
|
find(tag_or_address)&.key
|
@@ -139,7 +142,7 @@ module UniversaTools
|
|
139
142
|
# delete the key off the ring
|
140
143
|
# @raise [NotFoundException] if such a key is not in the ring
|
141
144
|
def delete_key key
|
142
|
-
record = @keys.find { |r| r.key == key}
|
145
|
+
record = @keys.find { |r| r.key == key }
|
143
146
|
record or raise NotFoundException
|
144
147
|
record.tag && @key_tags.delete(record.tag)
|
145
148
|
@key_addresses.delete(record.key.long_address)
|
@@ -151,14 +154,13 @@ module UniversaTools
|
|
151
154
|
private
|
152
155
|
|
153
156
|
def find(tag_or_address)
|
154
|
-
@key_tags[tag_or_address]
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
end
|
157
|
+
k = @key_tags[tag_or_address] and return k
|
158
|
+
address = tag_or_address.is_a?(Universa::KeyAddress) ? tag_or_address : Universa::KeyAddress.new(tag_or_address)
|
159
|
+
@keys.select { |kr| address.isMatchingKey(kr.key.public_key) }.first
|
160
|
+
rescue Farcall::RemoteError
|
161
|
+
raise $! if $!.message !~ /IllegalArgumentException/
|
162
|
+
# it is just a missing tag
|
163
|
+
nil
|
162
164
|
end
|
163
165
|
|
164
166
|
def console_password_input(prompt)
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'io/console'
|
3
|
+
require 'universa_tools/commons'
|
4
|
+
require 'universa_tools/errors'
|
5
|
+
require 'universa_tools/crypto_record'
|
6
|
+
require 'universa_tools/semantic_version'
|
7
|
+
require 'fileutils'
|
8
|
+
|
9
|
+
=begin
|
10
|
+
|
11
|
+
u_wallet file structure
|
12
|
+
|
13
|
+
path.unicon # always
|
14
|
+
path.unicon~ # sometimes, previous version
|
15
|
+
|
16
|
+
=end
|
17
|
+
|
18
|
+
module UniversaTools
|
19
|
+
|
20
|
+
class Universa::Parcel
|
21
|
+
static_method :of
|
22
|
+
static_method :unpack
|
23
|
+
end
|
24
|
+
|
25
|
+
# Under construction. FS-based U wallet. This version misses support for multiple-resulting paying parcel
|
26
|
+
# operation, so it will be completely reqwritten. Please do not use.
|
27
|
+
class UWallet
|
28
|
+
include Universa
|
29
|
+
|
30
|
+
# U left
|
31
|
+
attr :balance
|
32
|
+
|
33
|
+
# TestU left
|
34
|
+
attr :test_balance
|
35
|
+
|
36
|
+
# @param [String] path to the U ucontract
|
37
|
+
# @param [PrivateKey] key for the UContract
|
38
|
+
# @param [KeyRing] keyring to look for a key in
|
39
|
+
# @param [Universa::Client] client to connect to the Universa
|
40
|
+
def initialize(path, key: nil, keyring: nil, client: nil)
|
41
|
+
key || keyring or raise ArgumentError, "key or keyring must be presented"
|
42
|
+
key && keyring and raise ArgumentError, "only one of key or keyring must be presented"
|
43
|
+
@client = client || Universa::Client.new
|
44
|
+
restore_state path
|
45
|
+
check_key(key, keyring)
|
46
|
+
@mutex = Mutex.new
|
47
|
+
end
|
48
|
+
|
49
|
+
def busy?
|
50
|
+
@mutex.locked?
|
51
|
+
end
|
52
|
+
|
53
|
+
def register contract
|
54
|
+
@mutex.synchronize {
|
55
|
+
contract.check or raise ArgumentError, "contract is not OK"
|
56
|
+
units = contract.getProcessedCostU()
|
57
|
+
puts "cost #{units}"
|
58
|
+
parcel = Universa::Parcel.of(contract, @u, [@key])
|
59
|
+
p parcel
|
60
|
+
raise InsufficientFundsException if units > balance
|
61
|
+
# @client.2
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def restore_state(path)
|
68
|
+
@current_name = File.expand_path path
|
69
|
+
# current path may not exist if the, say commit or rollback operation were interrupted
|
70
|
+
if File.exists?(@current_name)
|
71
|
+
@u = load_u(@current_name)
|
72
|
+
if @client.get_state(@u).approved?
|
73
|
+
delete_backup()
|
74
|
+
set_balance()
|
75
|
+
return
|
76
|
+
end
|
77
|
+
end
|
78
|
+
# main state is bad or missing - checking prev state
|
79
|
+
@u = load_u(backup_name)
|
80
|
+
if (@client.get_state(@u)).approved?
|
81
|
+
rollback()
|
82
|
+
else
|
83
|
+
error("No valid U contracts found")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Load and check U contract, check that it is a valid U contract, does not checks it state!
|
88
|
+
# @param [String] path to load contract from
|
89
|
+
# @return [Contract]
|
90
|
+
def load_u(path)
|
91
|
+
u = open(path, 'rb') { |f| Contract.from_packed(f.read) }
|
92
|
+
d = u.definition
|
93
|
+
# {"issuerName"=>"Universa Reserve System", "name"=>"transaction units pack"}
|
94
|
+
# J3uaVvHE7JqhvVb1c26RyDhfJw9eP2KR1KRhm2VdmYx7NwHpzdHTyEPjcmKpgkJAtzWLSPUw
|
95
|
+
p u.issuer.getSimpleAddress.to_s
|
96
|
+
if d['issuerName'] != 'Universa Reserve System' || d['name'] != 'transaction units pack' ||
|
97
|
+
u.issuer.getSimpleAddress.to_s != 'J3uaVvHE7JqhvVb1c26RyDhfJw9eP2KR1KRhm2VdmYx7NwHpzdHTyEPjcmKpgkJAtzWLSPUw'
|
98
|
+
error("not a U contract")
|
99
|
+
end
|
100
|
+
u
|
101
|
+
end
|
102
|
+
|
103
|
+
def delete_backup
|
104
|
+
File.exists?(backup_name) and FileUtils.rm(backup_name)
|
105
|
+
end
|
106
|
+
|
107
|
+
def backup_name
|
108
|
+
@back_name ||= @current_name + "~"
|
109
|
+
end
|
110
|
+
|
111
|
+
def set_balance
|
112
|
+
@balance = @u.state.transaction_units
|
113
|
+
@test_balance = @u.state.test_transaction_units
|
114
|
+
end
|
115
|
+
|
116
|
+
# last become main
|
117
|
+
# main dissapears
|
118
|
+
def rollback
|
119
|
+
File.exists?(@current_name) and FileUtils.rm(@current_name)
|
120
|
+
# if it is interrupted, it will correctly restore on next run
|
121
|
+
FileUtils.move backup_name, @current_name
|
122
|
+
@u = load_u(@current_name)
|
123
|
+
set_balance
|
124
|
+
end
|
125
|
+
|
126
|
+
def check_key(key, keyring)
|
127
|
+
address = @u.owner.getSimpleAddress
|
128
|
+
@key = if key
|
129
|
+
address.isMatchingKey(key.public_key) or raise ArgumentError, "key is wrong"
|
130
|
+
key
|
131
|
+
else
|
132
|
+
keyring[address] or raise ArgumentError, "keyring does not contain required key"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|
@@ -12,9 +12,9 @@ include Universa
|
|
12
12
|
# Show help it nothing to do
|
13
13
|
# ARGV << "-h" if ARGV == []
|
14
14
|
|
15
|
-
|
16
15
|
class Uniring
|
17
16
|
|
17
|
+
include UniversaTools::Commons
|
18
18
|
include UniversaTools
|
19
19
|
|
20
20
|
attr :option_parser
|
@@ -214,14 +214,14 @@ Usage:
|
|
214
214
|
key = Universa::PrivateKey.from_packed(packed, password: password) rescue nil
|
215
215
|
clearstring()
|
216
216
|
key and return key
|
217
|
-
puts error_style("wrong password")
|
217
|
+
puts error_style("wrong password or corrupted key file")
|
218
218
|
end
|
219
219
|
while !key do
|
220
220
|
password = request_password("\rPlease enter password for #{file_name}:")
|
221
221
|
print ANSI.faint("\rdecrypting the key...")
|
222
222
|
key = Universa::PrivateKey.from_packed(packed, password: password) rescue nil
|
223
223
|
clearstring()
|
224
|
-
key or puts error_style("wrong password")
|
224
|
+
key or puts error_style("wrong password or corrupted key file")
|
225
225
|
end
|
226
226
|
key
|
227
227
|
end
|
@@ -0,0 +1,212 @@
|
|
1
|
+
module UniversaTools
|
2
|
+
|
3
|
+
# Tools to work with UNS contracts, part or parsec protocols family
|
4
|
+
class UNS
|
5
|
+
|
6
|
+
# reduce string to its glyph archetypes removing any homological similarities and ambiguity
|
7
|
+
#
|
8
|
+
# @param [String] name to reduce
|
9
|
+
# @return [String] reduced name
|
10
|
+
# @raise [ArgumentError] if name contains unprocessable characters
|
11
|
+
def self.reduce(name)
|
12
|
+
# step 1: remove space and punctuation, step 2: NFKD
|
13
|
+
name = name.downcase.strip.gsub(/([-_=+()*&^%#@±§~`<,>\/?'";:{}\[\]"']|\s)+/, '_').unicode_normalize(:nfkd)
|
14
|
+
# step 3: XLAT1: removing composing characters and ligatures
|
15
|
+
name = name.chars.map { |x| xlat1[x] || x }.join('')
|
16
|
+
# step 4: reduce to glyph archetype
|
17
|
+
name.chars.map { |ch|
|
18
|
+
xlat2[ch] or raise ArgumentError, "illegal character: #{ch.ord}:'#{ch}' in #{name.inspect}"
|
19
|
+
}.join('')
|
20
|
+
end
|
21
|
+
private
|
22
|
+
def self.xlat1
|
23
|
+
@xlat1 ||= read_xlat(DEFAULT_XLAT1, '')
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.xlat2
|
27
|
+
@xlat2 ||= begin
|
28
|
+
result = read_xlat(DEFAULT_XLAT2, :self)
|
29
|
+
read_xlat(DEFAULT_XLAT2_FINALIZER, :self).each { |final_key, final_value|
|
30
|
+
# finalizer algorithm: if it overrides result's value, alter it
|
31
|
+
# not effective at build time, but more effective when processing strings
|
32
|
+
# update all existing values according to final update table
|
33
|
+
affected_keys = result.select { |k, v| v == final_key }.keys
|
34
|
+
affected_keys.each { |k| result[k] = final_value }
|
35
|
+
result[final_key] = final_value
|
36
|
+
}
|
37
|
+
result
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.decode(char)
|
42
|
+
char.strip!
|
43
|
+
if char.start_with?('U+')
|
44
|
+
code = char[2..].to_i(16)
|
45
|
+
[code, code.chr(Encoding::UTF_8)]
|
46
|
+
else
|
47
|
+
[char.ord, char]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.read_xlat(xlat, missing = '')
|
52
|
+
xlat.lines.reduce({}) { |all, line|
|
53
|
+
begin
|
54
|
+
line = line.split('#', 2)[0].strip
|
55
|
+
if line != ''
|
56
|
+
left, right = line.split(/\s+/)
|
57
|
+
case left
|
58
|
+
when /^(.+):(.+)$/
|
59
|
+
# range
|
60
|
+
start, stop = decode($1), decode($2)
|
61
|
+
(start[0]..stop[0]).each { |code|
|
62
|
+
ch = code.chr(Encoding::UTF_8)
|
63
|
+
all[ch] = right || (missing == :self ? ch : missing)
|
64
|
+
}
|
65
|
+
when /^(?!U\+)/
|
66
|
+
# sequence characters or single character
|
67
|
+
left.chars.each { |ch|
|
68
|
+
all[ch] = right || (missing == :self ? ch : missing)
|
69
|
+
}
|
70
|
+
else
|
71
|
+
# single character un U+00000 form
|
72
|
+
right ||= (missing == :self ? left : right)
|
73
|
+
all[decode(left)[1]] = right
|
74
|
+
end
|
75
|
+
end
|
76
|
+
rescue Exception
|
77
|
+
puts "Error in line: #{line.inspect}: #{$!}"
|
78
|
+
raise
|
79
|
+
end
|
80
|
+
all
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
#
|
88
|
+
# Composing characters and ligatures
|
89
|
+
DEFAULT_XLAT1 = <<END
|
90
|
+
# Combining diacritical marks, see https://en.wikipedia.org/wiki/Combining_Diacritical_Marks
|
91
|
+
|
92
|
+
U+0300:U+033C
|
93
|
+
U+033D x
|
94
|
+
U+033E:U+0362
|
95
|
+
U+0363 a
|
96
|
+
U+0364 e
|
97
|
+
U+0365 i
|
98
|
+
U+0366 o
|
99
|
+
U+0367 u
|
100
|
+
U+0368 c
|
101
|
+
U+0369 d
|
102
|
+
U+036A h
|
103
|
+
U+036B m
|
104
|
+
U+036C r
|
105
|
+
U+036D t
|
106
|
+
U+036E v
|
107
|
+
U+036F x
|
108
|
+
|
109
|
+
#
|
110
|
+
# replacing ligatures ------------------------
|
111
|
+
#
|
112
|
+
|
113
|
+
ꜳ aa
|
114
|
+
æ ae
|
115
|
+
ꜵ ao
|
116
|
+
ꜷ au
|
117
|
+
ꜹ av
|
118
|
+
ꜻ av
|
119
|
+
ꜽ ay
|
120
|
+
U+1F670 et
|
121
|
+
ff ff
|
122
|
+
ffi ffi
|
123
|
+
ffl ffl
|
124
|
+
fi phi
|
125
|
+
fl fl
|
126
|
+
œ oe
|
127
|
+
ꝏ oo
|
128
|
+
ß ss
|
129
|
+
st st
|
130
|
+
ſt st
|
131
|
+
ꜩ tz
|
132
|
+
ᵫ ue
|
133
|
+
ꝡ vy
|
134
|
+
|
135
|
+
END
|
136
|
+
|
137
|
+
#
|
138
|
+
# Glyph archetypes
|
139
|
+
#
|
140
|
+
DEFAULT_XLAT2 = <<END
|
141
|
+
|
142
|
+
# Cyrillic letters
|
143
|
+
|
144
|
+
а a
|
145
|
+
б b
|
146
|
+
|
147
|
+
в b # May be similar in uppercase
|
148
|
+
|
149
|
+
г 2 # In some fonts. RFC!
|
150
|
+
д
|
151
|
+
е e
|
152
|
+
ж x
|
153
|
+
з 3
|
154
|
+
и u
|
155
|
+
к k
|
156
|
+
л n
|
157
|
+
м m
|
158
|
+
н h
|
159
|
+
о o
|
160
|
+
п n
|
161
|
+
р p
|
162
|
+
с c
|
163
|
+
т t
|
164
|
+
у y
|
165
|
+
ф
|
166
|
+
х x
|
167
|
+
ц u
|
168
|
+
ч 4
|
169
|
+
ш
|
170
|
+
щ ш
|
171
|
+
ьъ b
|
172
|
+
ы bi
|
173
|
+
э 3
|
174
|
+
ю io
|
175
|
+
я 9
|
176
|
+
|
177
|
+
# Other national languages for characters that will not be
|
178
|
+
# normalized with NFKD to latin set. Do not put here any
|
179
|
+
# characters with diacritic modifications removed by NFKD normalization.
|
180
|
+
|
181
|
+
END
|
182
|
+
|
183
|
+
DEFAULT_XLAT2_FINALIZER = <<END
|
184
|
+
#
|
185
|
+
# Final similarity corrections table
|
186
|
+
#
|
187
|
+
# English correcting similar-looking glyphs. This section MUST be the last
|
188
|
+
# AND should altrer XLAT 2 table the following way:
|
189
|
+
#
|
190
|
+
# foreach ch in final
|
191
|
+
# - if xlat2[*] =
|
192
|
+
|
193
|
+
# first init all with self, for simplicity:
|
194
|
+
a:z
|
195
|
+
0:9
|
196
|
+
|
197
|
+
# Now replace similar glyphs to archetypes:
|
198
|
+
|
199
|
+
il1|! 1
|
200
|
+
o0øº 0
|
201
|
+
u v
|
202
|
+
w vv
|
203
|
+
$s 5
|
204
|
+
b 6
|
205
|
+
|
206
|
+
# Punctuation placeholder:
|
207
|
+
_
|
208
|
+
|
209
|
+
# Cluster delimiter
|
210
|
+
.
|
211
|
+
|
212
|
+
END
|
data/universa_tools.gemspec
CHANGED
@@ -37,7 +37,7 @@ Gem::Specification.new do |spec|
|
|
37
37
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
38
38
|
spec.require_paths = ["lib"]
|
39
39
|
|
40
|
-
spec.add_dependency 'universa', ">= 3.
|
40
|
+
spec.add_dependency 'universa', ">= 3.12.6.1"
|
41
41
|
spec.add_dependency 'ansi'
|
42
42
|
spec.add_dependency 'facets'
|
43
43
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: universa_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sergeych
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: universa
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.
|
19
|
+
version: 3.12.6.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.
|
26
|
+
version: 3.12.6.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: ansi
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -125,7 +125,9 @@ files:
|
|
125
125
|
- lib/universa_tools/errors.rb
|
126
126
|
- lib/universa_tools/keyring.rb
|
127
127
|
- lib/universa_tools/semantic_version.rb
|
128
|
+
- lib/universa_tools/u_wallet.rb
|
128
129
|
- lib/universa_tools/uniring.rb
|
130
|
+
- lib/universa_tools/uns.rb
|
129
131
|
- lib/universa_tools/version.rb
|
130
132
|
- universa_tools.gemspec
|
131
133
|
homepage: https://github.com/sergeych/universa_tools
|