universa 0.1.5 → 0.1.6

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: ff6ba5e26ea3e8ef5c6f66da7c2e13045f752e251ff8783b990376b06f95af31
4
- data.tar.gz: 543afbaaeb3813cfe082171469ef6997dfcd67ad96de62d434556c673d62d198
3
+ metadata.gz: 776f0bcfb9e7585da4111d9993189eae6b511997bf97aa5043b21087eef47fdf
4
+ data.tar.gz: fe9ba7b8e817d8861de95a295384fd42b2ef868989d409b00ab13dbce4fb84a7
5
5
  SHA512:
6
- metadata.gz: 576c85a3a975de182195866635820dcbbb2a1dc531526440aee8dbb8d35d4783db45b2cec8b0c1ac7908caaa7b57de7c4bc893412dee60e84425bd047511e422
7
- data.tar.gz: 677b361b35bcfe73ed8005735123ab6eea59a3077d41646a3dbccea9bd2885169d416dcf7f7929128e46e64347b4e0d9780c4732d9470e13985b839d36101241
6
+ metadata.gz: 6c3d0054df59af8d90215705005d718d845f9aea9bde929aca654968d40f516aeba94d4149faec8c13f9d679c4724cd0ea580ad0eab21738baa05414f7678a37
7
+ data.tar.gz: b2b15a3502bace0b271963bf8003fd64e37d2892cb53b7cfce2fabada446cfd218dae9b033ea3620bae52c9eb322e3efd80c6e810873f8e186dce822e4fcd5f2
data/bin/umi/bin/umi CHANGED
@@ -344,7 +344,7 @@ declare -r lib_dir="$(realpath "${app_home}/../lib")"
344
344
  declare -a app_mainclass=(com.icodici.farcallscala.Main)
345
345
 
346
346
  declare -r script_conf_file="${app_home}/../conf/application.ini"
347
- declare -r app_classpath="$lib_dir/com.icodici.umi-0.8.10.jar:$lib_dir/org.scala-lang.scala-library-2.12.7.jar:$lib_dir/com.icodici.universa_core-3.8.3.jar:$lib_dir/org.yaml.snakeyaml-1.18.jar:$lib_dir/net.sf.jopt-simple.jopt-simple-4.9.jar:$lib_dir/org.postgresql.postgresql-42.1.4.jar:$lib_dir/org.xerial.sqlite-jdbc-3.8.9.1.jar:$lib_dir/com.icodici.nanohttpd-2.1.0.jar:$lib_dir/com.icodici.common_tools-3.8.3.jar:$lib_dir/com.eclipsesource.minimal-json.minimal-json-0.9.4.jar:$lib_dir/net.java.dev.jna.jna-4.5.1.jar:$lib_dir/org.checkerframework.checker-qual-2.3.2.jar:$lib_dir/com.icodici.crypto-3.8.3.jar:$lib_dir/com.madgag.spongycastle.core-1.58.0.0.jar:$lib_dir/com.squareup.jnagmp.jnagmp-2.0.0.jar:$lib_dir/com.typesafe.play.play-json_2.12-2.6.10.jar:$lib_dir/com.typesafe.play.play-functional_2.12-2.6.10.jar:$lib_dir/org.scala-lang.scala-reflect-2.12.7.jar:$lib_dir/org.typelevel.macro-compat_2.12-1.1.1.jar:$lib_dir/joda-time.joda-time-2.9.9.jar:$lib_dir/com.fasterxml.jackson.core.jackson-core-2.8.11.jar:$lib_dir/com.fasterxml.jackson.core.jackson-annotations-2.8.11.jar:$lib_dir/com.fasterxml.jackson.datatype.jackson-datatype-jdk8-2.8.11.jar:$lib_dir/com.fasterxml.jackson.core.jackson-databind-2.8.11.1.jar:$lib_dir/com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.8.11.jar:$lib_dir/org.scala-sbt.ipcsocket.ipcsocket-1.0.0.jar:$lib_dir/net.java.dev.jna.jna-platform-4.5.0.jar"
347
+ declare -r app_classpath="$lib_dir/com.icodici.umi-0.8.11.jar:$lib_dir/org.scala-lang.scala-library-2.12.7.jar:$lib_dir/com.icodici.universa_core-3.8.4.jar:$lib_dir/org.yaml.snakeyaml-1.18.jar:$lib_dir/net.sf.jopt-simple.jopt-simple-4.9.jar:$lib_dir/org.postgresql.postgresql-42.1.4.jar:$lib_dir/org.xerial.sqlite-jdbc-3.8.9.1.jar:$lib_dir/com.icodici.nanohttpd-2.1.0.jar:$lib_dir/com.icodici.common_tools-3.8.4.jar:$lib_dir/com.eclipsesource.minimal-json.minimal-json-0.9.4.jar:$lib_dir/net.java.dev.jna.jna-4.5.1.jar:$lib_dir/org.checkerframework.checker-qual-2.3.2.jar:$lib_dir/com.icodici.crypto-3.8.4.jar:$lib_dir/com.madgag.spongycastle.core-1.58.0.0.jar:$lib_dir/com.squareup.jnagmp.jnagmp-2.0.0.jar:$lib_dir/com.typesafe.play.play-json_2.12-2.6.10.jar:$lib_dir/com.typesafe.play.play-functional_2.12-2.6.10.jar:$lib_dir/org.scala-lang.scala-reflect-2.12.7.jar:$lib_dir/org.typelevel.macro-compat_2.12-1.1.1.jar:$lib_dir/joda-time.joda-time-2.9.9.jar:$lib_dir/com.fasterxml.jackson.core.jackson-core-2.8.11.jar:$lib_dir/com.fasterxml.jackson.core.jackson-annotations-2.8.11.jar:$lib_dir/com.fasterxml.jackson.datatype.jackson-datatype-jdk8-2.8.11.jar:$lib_dir/com.fasterxml.jackson.core.jackson-databind-2.8.11.1.jar:$lib_dir/com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.8.11.jar:$lib_dir/org.scala-sbt.ipcsocket.ipcsocket-1.0.0.jar:$lib_dir/net.java.dev.jna.jna-platform-4.5.0.jar"
348
348
 
349
349
  # java_cmd is overrode in process_args when -java-home is used
350
350
  declare java_cmd=$(get_java_cmd)
data/bin/umi/bin/umi.bat CHANGED
@@ -80,7 +80,7 @@ rem "-J" is stripped, "-D" is left as is, and everything is appended to JAVA_OPT
80
80
  set _JAVA_PARAMS=
81
81
  set _APP_ARGS=
82
82
 
83
- set "APP_CLASSPATH=%APP_LIB_DIR%\com.icodici.umi-0.8.10.jar;%APP_LIB_DIR%\org.scala-lang.scala-library-2.12.7.jar;%APP_LIB_DIR%\com.icodici.universa_core-3.8.3.jar;%APP_LIB_DIR%\org.yaml.snakeyaml-1.18.jar;%APP_LIB_DIR%\net.sf.jopt-simple.jopt-simple-4.9.jar;%APP_LIB_DIR%\org.postgresql.postgresql-42.1.4.jar;%APP_LIB_DIR%\org.xerial.sqlite-jdbc-3.8.9.1.jar;%APP_LIB_DIR%\com.icodici.nanohttpd-2.1.0.jar;%APP_LIB_DIR%\com.icodici.common_tools-3.8.3.jar;%APP_LIB_DIR%\com.eclipsesource.minimal-json.minimal-json-0.9.4.jar;%APP_LIB_DIR%\net.java.dev.jna.jna-4.5.1.jar;%APP_LIB_DIR%\org.checkerframework.checker-qual-2.3.2.jar;%APP_LIB_DIR%\com.icodici.crypto-3.8.3.jar;%APP_LIB_DIR%\com.madgag.spongycastle.core-1.58.0.0.jar;%APP_LIB_DIR%\com.squareup.jnagmp.jnagmp-2.0.0.jar;%APP_LIB_DIR%\com.typesafe.play.play-json_2.12-2.6.10.jar;%APP_LIB_DIR%\com.typesafe.play.play-functional_2.12-2.6.10.jar;%APP_LIB_DIR%\org.scala-lang.scala-reflect-2.12.7.jar;%APP_LIB_DIR%\org.typelevel.macro-compat_2.12-1.1.1.jar;%APP_LIB_DIR%\joda-time.joda-time-2.9.9.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-core-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-annotations-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.datatype.jackson-datatype-jdk8-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-databind-2.8.11.1.jar;%APP_LIB_DIR%\com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.8.11.jar;%APP_LIB_DIR%\org.scala-sbt.ipcsocket.ipcsocket-1.0.0.jar;%APP_LIB_DIR%\net.java.dev.jna.jna-platform-4.5.0.jar"
83
+ set "APP_CLASSPATH=%APP_LIB_DIR%\com.icodici.umi-0.8.11.jar;%APP_LIB_DIR%\org.scala-lang.scala-library-2.12.7.jar;%APP_LIB_DIR%\com.icodici.universa_core-3.8.4.jar;%APP_LIB_DIR%\org.yaml.snakeyaml-1.18.jar;%APP_LIB_DIR%\net.sf.jopt-simple.jopt-simple-4.9.jar;%APP_LIB_DIR%\org.postgresql.postgresql-42.1.4.jar;%APP_LIB_DIR%\org.xerial.sqlite-jdbc-3.8.9.1.jar;%APP_LIB_DIR%\com.icodici.nanohttpd-2.1.0.jar;%APP_LIB_DIR%\com.icodici.common_tools-3.8.4.jar;%APP_LIB_DIR%\com.eclipsesource.minimal-json.minimal-json-0.9.4.jar;%APP_LIB_DIR%\net.java.dev.jna.jna-4.5.1.jar;%APP_LIB_DIR%\org.checkerframework.checker-qual-2.3.2.jar;%APP_LIB_DIR%\com.icodici.crypto-3.8.4.jar;%APP_LIB_DIR%\com.madgag.spongycastle.core-1.58.0.0.jar;%APP_LIB_DIR%\com.squareup.jnagmp.jnagmp-2.0.0.jar;%APP_LIB_DIR%\com.typesafe.play.play-json_2.12-2.6.10.jar;%APP_LIB_DIR%\com.typesafe.play.play-functional_2.12-2.6.10.jar;%APP_LIB_DIR%\org.scala-lang.scala-reflect-2.12.7.jar;%APP_LIB_DIR%\org.typelevel.macro-compat_2.12-1.1.1.jar;%APP_LIB_DIR%\joda-time.joda-time-2.9.9.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-core-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-annotations-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.datatype.jackson-datatype-jdk8-2.8.11.jar;%APP_LIB_DIR%\com.fasterxml.jackson.core.jackson-databind-2.8.11.1.jar;%APP_LIB_DIR%\com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.8.11.jar;%APP_LIB_DIR%\org.scala-sbt.ipcsocket.ipcsocket-1.0.0.jar;%APP_LIB_DIR%\net.java.dev.jna.jna-platform-4.5.0.jar"
84
84
  set "APP_MAIN_CLASS=com.icodici.farcallscala.Main"
85
85
  set "SCRIPT_CONF_FILE=%APP_HOME%\conf\application.ini"
86
86
 
@@ -131,9 +131,6 @@ module Universa
131
131
  .transform_values!(&:sort)
132
132
  # We roughly assume the full network size as:
133
133
  network_max_size = nodes.size
134
- nodes.each {|k, v|
135
- puts "#{k}: (#{v.size}) #{v.map(&:rate)}}"
136
- }
137
134
  # Refine result: takes most voted nodes and only these with 80% consensus
138
135
  # and map it to Connection objects
139
136
  min_rate = n * 0.8
@@ -206,9 +203,7 @@ module Universa
206
203
  # @param [String|Symbol] name of the command
207
204
  # @return [SmartHash] with the command result
208
205
  def execute name, **kwargs
209
- Service.umi.with_trace {
210
- connection.command name.to_s, *kwargs.to_a.flatten
211
- }
206
+ connection.command name.to_s, *kwargs.to_a.flatten
212
207
  end
213
208
 
214
209
  protected
@@ -1,9 +1,70 @@
1
1
  module Universa
2
2
 
3
+ # Adapter for Universa ChangeOwnerPermission
4
+ class ChangeOwnerPermission < RemoteAdapter
5
+ remote_class "com.icodici.universa.contract.permissions.ChangeOwnerPermission"
6
+ end
7
+
8
+ # Adapter for Universa Role
9
+ class Role < RemoteAdapter
10
+ remote_class "com.icodici.universa.contract.roles.Role"
11
+ end
12
+
13
+ # Adapter for Universa Binder class. Provides some ruby-style helpers
14
+ class Binder < RemoteAdapter
15
+ remote_class "net.sergeych.tools.Binder"
16
+
17
+ # Set object for a key
18
+ #
19
+ # @param [Object] key, key.to_s will be used (so use Symbols or Strings freely)
20
+ # @param [Object] value
21
+ def []=(key,value)
22
+ set(key.to_s, value)
23
+ end
24
+
25
+ # Get object by key.
26
+ # @param [Object] key, key.to_s will be used (so use Symbols or Strings freely)
27
+ # @return [Object] or nil
28
+ def [](key)
29
+ get(key.to_s)
30
+ end
31
+ end
32
+
3
33
  # Universa contract adapter.
4
34
  class Contract < RemoteAdapter
5
35
  remote_class "com.icodici.universa.contract.Contract"
6
36
 
37
+ # Create simple contract with preset critical parts:
38
+ #
39
+ # - expiration set to 90 days unless specified else
40
+ # - issuer role is set to the address of the issuer key, short ot long
41
+ # - creator role is set as link to issuer
42
+ # - owner role is set as link to issuer
43
+ # - change owner permission is set to link to owner
44
+ #
45
+ # The while contract is then signed by the issuer key. Not that it will not seal it: caller almost always
46
+ # will add more data before it, then must call #seal().
47
+ #
48
+ # @param [PrivateKey] issuer_key also will be used to sign it
49
+ # @param [Time] expires_at defaults to 90 days
50
+ # @param [Boolean] use_short_address set to true to use short address of the issuer key in the role
51
+ # @return [Contract] simple contact, not sealed
52
+ def self.create issuer_key, expires_at: (Time.now + 90 * 24 * 60 * 60), use_short_address: false
53
+ contract = Contract.new
54
+ contract.set_expires_at expires_at
55
+ contract.set_issuer_keys(use_short_address ? issuer_key.short_address : issuer_key.long_address)
56
+ contract.register_role(contract.issuer.link_as("owner"))
57
+ contract.register_role(contract.issuer.link_as("creator"))
58
+ contract.add_permission ChangeOwnerPermission.new(contract.owner.link_as "@owner")
59
+ contract.add_signer_key issuer_key
60
+ contract
61
+ end
62
+
63
+ # Load from transaction pack
64
+ def self.from_packed packed
65
+ self.invoke_static "fromPackedTransaction", packed
66
+ end
67
+
7
68
  # seal the contract
8
69
  # @return [String] contract packed to the binary string
9
70
  def seal
@@ -16,6 +77,54 @@ module Universa
16
77
  get_keys_to_sign_with
17
78
  end
18
79
 
80
+ # Shortcut ofr get_creator
81
+ # @return [Role] universa role of the creator
82
+ def creator
83
+ get_creator
84
+ end
85
+
86
+ # @return [Role] issuer role
87
+ def issuer
88
+ get_issuer
89
+ end
90
+
91
+ # @return [Role] owner role
92
+ def owner
93
+ get_owner
94
+ end
95
+
96
+ # Shortcut for is_ok
97
+ def ok?
98
+ is_ok
99
+ end
100
+
101
+ # shortcut for getHashId
102
+ def hash_id
103
+ get_id
104
+ end
105
+
106
+ # shortcut for get_expires_at
107
+ def expires_at
108
+ get_expires_at
109
+ end
110
+
111
+ # @return definition data
112
+ def definition
113
+ get_definition.get_data
114
+ end
115
+
116
+ def packed
117
+ get_packed_transaction
118
+ end
119
+
120
+ # trace found errors (call it afer check()): the Java version will not be able to trace to the
121
+ # process stdout, so we reqrite it here
122
+ def trace_errors
123
+ getErrors.each {|e|
124
+ puts "(#{e.object || ''}): #{e.error}"
125
+ }
126
+ end
127
+
19
128
  end
20
129
 
21
130
  end
data/lib/universa/keys.rb CHANGED
@@ -47,6 +47,21 @@ module Universa
47
47
  def to_s
48
48
  @string ||= toString()
49
49
  end
50
+
51
+ # Unpack from binary bytes
52
+ # @param [String] binary_string with binary packed bytes
53
+ def self.from_packed(binary_string)
54
+ binary_string.force_encoding 'binary'
55
+ KeyAddress.new(binary_string)
56
+ end
57
+
58
+ # returns binary representation. It is not a string representation!
59
+ # @return [String] binary string representation
60
+ def packed
61
+ s = get_packed
62
+ s.force_encoding 'binary'
63
+ s
64
+ end
50
65
  end
51
66
 
52
67
  end
@@ -14,7 +14,7 @@ module Universa
14
14
  def initialize
15
15
  @config = SmartHash.new path: nil
16
16
  @known_proxies = {}
17
- [Contract, PrivateKey, PublicKey, KeyAddress].each {|klass| register_proxy klass}
17
+ [Contract, PrivateKey, PublicKey, KeyAddress, Binder, Role, ChangeOwnerPermission].each {|klass| register_proxy klass}
18
18
  end
19
19
 
20
20
  # Implementation of {Service.configure}
@@ -92,7 +92,7 @@ module Universa
92
92
  # User called constructor
93
93
  remote_class_name = self.class.remote_class_name
94
94
  remote_class_name&.length or raise Error, "provide remote_class_name"
95
- @remote = Service.umi.instantiate remote_class_name.split('.')[-1], *args, adapter: self
95
+ @remote = Service.umi.instantiate remote_class_name, *args, adapter: self
96
96
  end
97
97
  end
98
98
 
@@ -119,13 +119,13 @@ module Universa
119
119
  #
120
120
  # @return [String] remote class name
121
121
  def self.remote_class_name
122
- raise Error, "provde remote class name"
122
+ @remote_class_name or raise Error, "provde remote class name"
123
123
  end
124
124
 
125
125
  # Registers remote class name to be used with this adapted. Call it early in descendant class
126
126
  # declaration.
127
127
  def self.remote_class name
128
- class_eval "def self.remote_class_name; '#{name}'; end"
128
+ @remote_class_name = name
129
129
  end
130
130
 
131
131
  # debugging label
@@ -138,6 +138,10 @@ module Universa
138
138
  def to_s
139
139
  toString()
140
140
  end
141
+
142
+ def self.invoke_static(method_name, *args)
143
+ Service.umi.invoke_static @remote_class_name, method_name, *args
144
+ end
141
145
  end
142
146
 
143
147
  end
data/lib/universa/umi.rb CHANGED
@@ -106,10 +106,13 @@ module Universa
106
106
  ensure_open
107
107
  ref._umi == self or raise InterchangeError
108
108
  @convert_case and method = method.to_s.camelize_lower
109
+ # p ["invoke", ref._remote_id, method, *prepare_args(args)]
109
110
  result = call("invoke", ref._remote_id, method, *prepare_args(args))
110
111
  encode_result result
111
- rescue
112
- $!.print_stack_trace
112
+ end
113
+
114
+ def invoke_static(class_name, method, *args)
115
+ encode_result call("invoke", class_name, method, *prepare_args(args))
113
116
  end
114
117
 
115
118
  # Close child process. No remote calls should occur after it.
@@ -236,6 +239,8 @@ module Universa
236
239
  x._as_umi_arg(self)
237
240
  else
238
241
  case x
242
+ when Time
243
+ { __type: 'unixtime', seconds: x.to_i}
239
244
  when String
240
245
  x.encoding == Encoding::BINARY ? {__type: 'binary', base64: Base64.encode64(x)} : x
241
246
  else
@@ -280,6 +285,13 @@ module Universa
280
285
  result = @endpoint.sync_call(command, *args, **EMPTY_KWARGS)
281
286
  log "<< #{result}"
282
287
  result
288
+ rescue Farcall::RemoteError => e
289
+ case e.remote_class
290
+ when 'NoSuchMethodException'
291
+ raise NoMethodError, e.message
292
+ else
293
+ raise
294
+ end
283
295
  end
284
296
 
285
297
  def log msg
@@ -362,7 +374,7 @@ module Universa
362
374
  method_name[0] == '_' || LOCAL_METHODS.include?(method_name) ? super : true
363
375
  end
364
376
 
365
- #Internal use only. Call remote method as needed. This is where all the magick comes from: it call remote method instead of the
377
+ # Internal use only. Call remote method as needed. This is where all the magick comes from: it call remote method instead of the
366
378
  # local one, exactly like it is local.
367
379
  def method_missing(method_name, *args, &block)
368
380
  if method_name[0] == '_'
@@ -1,4 +1,4 @@
1
1
  module Universa
2
2
  # Current gem version
3
- VERSION = "0.1.5"
3
+ VERSION = "0.1.6"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: universa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - sergeych
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-10 00:00:00.000000000 Z
11
+ date: 2018-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: farcall
@@ -134,11 +134,11 @@ files:
134
134
  - bin/umi/lib/com.fasterxml.jackson.core.jackson-databind-2.8.11.1.jar
135
135
  - bin/umi/lib/com.fasterxml.jackson.datatype.jackson-datatype-jdk8-2.8.11.jar
136
136
  - bin/umi/lib/com.fasterxml.jackson.datatype.jackson-datatype-jsr310-2.8.11.jar
137
- - bin/umi/lib/com.icodici.common_tools-3.8.3.jar
138
- - bin/umi/lib/com.icodici.crypto-3.8.3.jar
137
+ - bin/umi/lib/com.icodici.common_tools-3.8.4.jar
138
+ - bin/umi/lib/com.icodici.crypto-3.8.4.jar
139
139
  - bin/umi/lib/com.icodici.nanohttpd-2.1.0.jar
140
- - bin/umi/lib/com.icodici.umi-0.8.10.jar
141
- - bin/umi/lib/com.icodici.universa_core-3.8.3.jar
140
+ - bin/umi/lib/com.icodici.umi-0.8.11.jar
141
+ - bin/umi/lib/com.icodici.universa_core-3.8.4.jar
142
142
  - bin/umi/lib/com.madgag.spongycastle.core-1.58.0.0.jar
143
143
  - bin/umi/lib/com.squareup.jnagmp.jnagmp-2.0.0.jar
144
144
  - bin/umi/lib/com.typesafe.play.play-functional_2.12-2.6.10.jar