universa 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -0
- data/bin/umi/bin/umi +2 -2
- data/bin/umi/bin/umi.bat +1 -1
- data/lib/universa.rb +4 -0
- data/lib/universa/contract.rb +20 -0
- data/lib/universa/keys.rb +52 -0
- data/lib/universa/service.rb +143 -0
- data/lib/universa/tools.rb +8 -0
- data/lib/universa/umi.rb +51 -12
- data/lib/universa/version.rb +1 -1
- metadata +6 -3
- data/bin/umi/lib/com.icodici.umi-0.8.8.jar +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61a9637495cf67d3ac90b3447038b6b224646cd4f36a2db7619aae13274232af
|
4
|
+
data.tar.gz: 2b6b963df5082f420ab80bf3bd47c509846ddb4d3085cc9eb19939e4c906c9ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 973eb722475a35230ce1c595faab7c47e730eb7573f737d113475d5cb4405f4d5fc6c1a3f02393e7e177e5a384d838acf53aa65641a5b5f76172ee42e60bc88b
|
7
|
+
data.tar.gz: a901518e1151a239f43f309512d1e9e8bf6f87e40a31f111b994c6f9086aad9e41cd31cb5fae7c6370d80309f6d37c6c522b7b14c347baaed12f5f09bcc56c49
|
data/README.md
CHANGED
@@ -29,6 +29,8 @@ Or install it yourself as:
|
|
29
29
|
|
30
30
|
## Usage
|
31
31
|
|
32
|
+
### Direct access to UMI
|
33
|
+
|
32
34
|
So far, you can only get direct access the the Java API functions. To get it:
|
33
35
|
|
34
36
|
```ruby
|
@@ -55,6 +57,22 @@ for more information see:
|
|
55
57
|
- Universa UMI server: https://kb.universa.io/umi_protocol/98
|
56
58
|
- Farcall [gem](https://github.com/sergeych/farcall) and [protocol](https://github.com/sergeych/farcall/wiki).
|
57
59
|
|
60
|
+
### Use UMI service (alfa state)
|
61
|
+
|
62
|
+
The Universa::Service greatly simplify work taking all boilerplate. Just create objects almost as usual and use them
|
63
|
+
as is they are local:
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
key = PrivateKey,new(open('mykey.private.unikey', 'rb').read)
|
67
|
+
contract = Contract.new(key)
|
68
|
+
|
69
|
+
contract.seal()
|
70
|
+
p contract.check()
|
71
|
+
```
|
72
|
+
|
73
|
+
The system will create UMI server and do all the work for you. Look at the RemoteAdapter class to see how does it
|
74
|
+
work. Soon we'll add adapters for all frequently used Universa classes.
|
75
|
+
|
58
76
|
## Development
|
59
77
|
|
60
78
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/bin/umi/bin/umi
CHANGED
@@ -267,7 +267,7 @@ loadConfigFile() {
|
|
267
267
|
}
|
268
268
|
|
269
269
|
# Now check to see if it's a good enough version
|
270
|
-
# TODO - Check to see if we have a configured default java version, otherwise use 1.
|
270
|
+
# TODO - Check to see if we have a configured default java version, otherwise use 1.8
|
271
271
|
java_version_check() {
|
272
272
|
readonly java_version=$("$java_cmd" -version 2>&1 | awk -F '"' '/version/ {print $2}')
|
273
273
|
if [[ "$java_version" == "" ]]; then
|
@@ -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.
|
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"
|
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.
|
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"
|
84
84
|
set "APP_MAIN_CLASS=com.icodici.farcallscala.Main"
|
85
85
|
set "SCRIPT_CONF_FILE=%APP_HOME%\conf\application.ini"
|
86
86
|
|
data/lib/universa.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Universa
|
2
|
+
|
3
|
+
# Universa contract adapter.
|
4
|
+
class Contract < RemoteAdapter
|
5
|
+
remote_class "com.icodici.universa.contract.Contract"
|
6
|
+
|
7
|
+
# seal the contract
|
8
|
+
# @return [String] contract packed to the binary string
|
9
|
+
def seal
|
10
|
+
@proxy.seal()
|
11
|
+
end
|
12
|
+
|
13
|
+
# returns keys that will be used to sign this contract on next {seal}.
|
14
|
+
# @return [Set<PrivateKey>] set of private keys
|
15
|
+
def signing_keys
|
16
|
+
get_keys_to_sign_with
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Universa
|
2
|
+
|
3
|
+
# A +com.icodici.crypto.PrivateKey+ extension. As the key is immutable,
|
4
|
+
# caching is used to avoid innecessary UMI calls.
|
5
|
+
class PrivateKey < RemoteAdapter
|
6
|
+
remote_class 'com.icodici.crypto.PrivateKey'
|
7
|
+
|
8
|
+
# @return [KeyAddress] short address of the corresponding public key
|
9
|
+
def short_address
|
10
|
+
@short_address ||= public_key.short_address
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [KeyAddress] long address of the corresponding public key
|
14
|
+
def long_address
|
15
|
+
@long_address ||= public_key.long_address
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [PublicKey] public key that matches this
|
19
|
+
def public_key
|
20
|
+
@public_key ||= get_public_key
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# A +com.icodici.crypto.PublicKey+ extension. As the key is immutable,
|
25
|
+
# caching is used to avoid innecessary UMI calls.
|
26
|
+
class PublicKey < RemoteAdapter
|
27
|
+
remote_class 'com.icodici.crypto.PublicKey'
|
28
|
+
|
29
|
+
# @return [KeyAddress] short address
|
30
|
+
def short_address
|
31
|
+
@short_address ||= get_short_address()
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [KeyAddress] long address
|
35
|
+
def long_address
|
36
|
+
@long_address ||= get_long_address()
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# The +com.icodici.crypto.KeyAddress+ extension. As it is immutable, caching is
|
41
|
+
# used to avoid unnecessary UMI calls.
|
42
|
+
class KeyAddress < RemoteAdapter
|
43
|
+
remote_class 'com.icodici.crypto.KeyAddress'
|
44
|
+
|
45
|
+
# String form of the key which could be used to unpack it back
|
46
|
+
# @return [String] packed string representation
|
47
|
+
def to_s
|
48
|
+
@string ||= toString()
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module Universa
|
4
|
+
|
5
|
+
# The service is a singleton to provide porcess-wide objects and methods. For example,
|
6
|
+
# the {UMI} interface and reference class factory are unique per-process for Universa
|
7
|
+
# library. It uses exactly one lazy created {UMI} connection which is shared among all threads.
|
8
|
+
# As UMI server is multithreaded by nature, is will not block ruby threads waiting for remote
|
9
|
+
# invocation.
|
10
|
+
class Service
|
11
|
+
include Singleton
|
12
|
+
|
13
|
+
# Setup service initial parameters
|
14
|
+
def initialize
|
15
|
+
@config = SmartHash.new path: nil
|
16
|
+
@known_proxies = {}
|
17
|
+
[Contract, PrivateKey, PublicKey, KeyAddress].each {|klass| register_proxy klass}
|
18
|
+
end
|
19
|
+
|
20
|
+
# Implementation of {Service.configure}
|
21
|
+
def configure &block
|
22
|
+
raise Error, "config call must happen before interface creation" if @umi
|
23
|
+
block.call @config
|
24
|
+
end
|
25
|
+
|
26
|
+
# Implementation of {Service.umi}
|
27
|
+
def umi
|
28
|
+
c = @config.to_h.transform_keys(&:to_sym).update(convert_case: true)
|
29
|
+
c[:factory] = -> (ref) {create_proxy(ref)}
|
30
|
+
@umi ||= UMI.new(c.delete(:path), **c)
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
# push string to service log
|
35
|
+
def log msg
|
36
|
+
puts "U:Service: #{msg}"
|
37
|
+
end
|
38
|
+
|
39
|
+
# Create objectproxy for known types
|
40
|
+
# @param [Ref] ref to transform
|
41
|
+
# @return [RemoteAdapter | Ref] transformed or source reference
|
42
|
+
def create_proxy ref
|
43
|
+
proxy_class = @known_proxies[ref._remote_class_name]
|
44
|
+
return ref unless proxy_class
|
45
|
+
proxy_class.new(ReferenceCreationData.new(ref))
|
46
|
+
end
|
47
|
+
|
48
|
+
class << self
|
49
|
+
|
50
|
+
# Call it before everything to update UMI interface parameters before is is created.
|
51
|
+
# Calling it when UMI is already constructed raises Error.
|
52
|
+
def configure &block
|
53
|
+
instance.configure &block
|
54
|
+
end
|
55
|
+
|
56
|
+
# Get the global UMI interface, creating it if need.
|
57
|
+
# @return [UMI] ready interface
|
58
|
+
def umi
|
59
|
+
instance.umi
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def register_proxy klass
|
66
|
+
remote_class_name = klass.remote_class_name
|
67
|
+
raise Error, "#{remote_class_name} is already registered in Service" if @known_proxies.include?(remote_class_name)
|
68
|
+
@known_proxies[remote_class_name] = klass
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# The basic class to write remote class adapters (extensions). Delegates contained {Ref} instance therefore behaves
|
73
|
+
# like remote interface with some extensions.
|
74
|
+
#
|
75
|
+
# Key feature of RemoteAdapter class is the cross-call persistence. It means once created instances of the
|
76
|
+
# RemoteAdapter descendants are cached just like (in fact, instead of) {Ref} instances, so when the remote party
|
77
|
+
# returns the reference to the object once wrapped by this instance, the instance will be returned unless it is
|
78
|
+
# already garbage collected. instance will be returned, what means sort of cross-platform calls persistence.
|
79
|
+
#
|
80
|
+
# Extending this class normally should not implement the constructor, By defaul the constructor is passed to
|
81
|
+
# the remote to create remote instance.
|
82
|
+
class RemoteAdapter < Delegator
|
83
|
+
|
84
|
+
# Instantiate new proxy object passing arguments to the remote constructor. The UMO host will try
|
85
|
+
# ot find overloaded constructor that matches the arguments.
|
86
|
+
#
|
87
|
+
# @param [*Any] args any arguments that remote constructor may accept.
|
88
|
+
def initialize(*args)
|
89
|
+
if args.length == 1 && args[0].is_a?(ReferenceCreationData)
|
90
|
+
@remote = args[0].ref
|
91
|
+
else
|
92
|
+
# User called constructor
|
93
|
+
remote_class_name = self.class.remote_class_name
|
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
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Delegated object
|
100
|
+
# @return [Ref] the wrapped instance whose methpds are delegated by this
|
101
|
+
def __getobj__
|
102
|
+
@remote
|
103
|
+
end
|
104
|
+
|
105
|
+
# Updating proxied object is not allowed. Raises error.
|
106
|
+
def __setobj__
|
107
|
+
raise "ObectProxy does not support changing referenced object"
|
108
|
+
end
|
109
|
+
|
110
|
+
# Returns remote class name. There is no need to override it, when inheriting it use +remote_class+ helper:
|
111
|
+
#
|
112
|
+
# class MyKeyAddress < ObjectProxy
|
113
|
+
# remote_class 'com.icodici.crypto.KeyAddress'
|
114
|
+
#
|
115
|
+
# #...
|
116
|
+
# end
|
117
|
+
#
|
118
|
+
# Notice: remote_class will do allnecessary work for you.
|
119
|
+
#
|
120
|
+
# @return [String] remote class name
|
121
|
+
def self.remote_class_name
|
122
|
+
raise Error, "provde remote class name"
|
123
|
+
end
|
124
|
+
|
125
|
+
# Registers remote class name to be used with this adapted. Call it early in descendant class
|
126
|
+
# declaration.
|
127
|
+
def self.remote_class name
|
128
|
+
class_eval "def self.remote_class_name; '#{name}'; end"
|
129
|
+
end
|
130
|
+
|
131
|
+
# debugging label
|
132
|
+
def inspect
|
133
|
+
"<#{self.class.name}:#{__id__}:#{@remote._remote_class_name}:#{@remote._remote_id}}>"
|
134
|
+
end
|
135
|
+
|
136
|
+
# call the remote toString(). Does not cache it.
|
137
|
+
# @return [String]
|
138
|
+
def to_s
|
139
|
+
toString()
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
data/lib/universa/umi.rb
CHANGED
@@ -64,7 +64,7 @@ module Universa
|
|
64
64
|
# @param [String] system expected on the remote side. 'UMI' us a universa umi server.
|
65
65
|
# @param [Boolean] convert_case it true, convert ruby style snake case `get_some_stuff()` to java style lower camel
|
66
66
|
# case `getSomeStuff()` while calling methods. Does not affect class names on {instantiate}.
|
67
|
-
def initialize(path = nil, version_check: /./, system: "UMI", log: 'sessionlog.txt', convert_case: true)
|
67
|
+
def initialize(path = nil, version_check: /./, system: "UMI", log: 'sessionlog.txt', convert_case: true, factory: nil)
|
68
68
|
path ||= File.expand_path(File.split(__FILE__)[0] + "/../../bin/umi/bin/umi")
|
69
69
|
@in, @out, @err, @wtr = Open3.popen3("#{path} #{log ? "-log #{log}" : ''}")
|
70
70
|
@endpoint = Farcall::Endpoint.new(
|
@@ -73,7 +73,7 @@ module Universa
|
|
73
73
|
@lock = Monitor.new
|
74
74
|
@cache = {}
|
75
75
|
@closed = false
|
76
|
-
@convert_case = convert_case
|
76
|
+
@convert_case, @factory = convert_case, factory
|
77
77
|
@references = {}
|
78
78
|
start_cleanup_queue
|
79
79
|
@version = call("version")
|
@@ -95,9 +95,9 @@ module Universa
|
|
95
95
|
# housekeeping required, like memory leaks prevention and direct method calling.
|
96
96
|
#
|
97
97
|
# @return [Ref] reference to the remotely created object. See {Ref}.
|
98
|
-
def instantiate(object_class_name, *args)
|
98
|
+
def instantiate(object_class_name, *args, adapter: nil)
|
99
99
|
ensure_open
|
100
|
-
create_reference call("instantiate", object_class_name, *prepare_args(args))
|
100
|
+
create_reference call("instantiate", object_class_name, *prepare_args(args)), adapter
|
101
101
|
end
|
102
102
|
|
103
103
|
# Invoke method by name. Should not be used directly; use {Ref} instance to call its methods.
|
@@ -163,8 +163,9 @@ module Universa
|
|
163
163
|
|
164
164
|
# Create a reference correcting adapting remote types to ruby ecosystem, for example loads
|
165
165
|
# remote Java Set to a local ruby Set.
|
166
|
-
def create_reference
|
167
|
-
r = build_reference reference_record
|
166
|
+
def create_reference(reference_record, adapter = nil)
|
167
|
+
r = build_reference reference_record, adapter
|
168
|
+
return r if adapter
|
168
169
|
case reference_record.className
|
169
170
|
when 'java.util.HashSet'
|
170
171
|
r.toArray()
|
@@ -175,16 +176,31 @@ module Universa
|
|
175
176
|
|
176
177
|
# Create a reference from UMI remote object reference structure. Returns existing object if any. Takes care
|
177
178
|
# of dropping remote object when ruby object gets collected.
|
178
|
-
def build_reference
|
179
|
+
def build_reference(reference_record, proxy)
|
179
180
|
@lock.synchronize {
|
180
181
|
remote_id = reference_record.id
|
181
182
|
ref = @cache[remote_id]&.get
|
182
183
|
if !ref
|
183
184
|
# log "Creating new reference to remote #{remote_id}"
|
184
185
|
ref = Ref.new(self, reference_record)
|
185
|
-
|
186
|
-
|
186
|
+
# IF we provide proxy that will consume the ref, we'll cache the proxy object,
|
187
|
+
# otherwise we run factory and cahce whatever it returns or the ref itself
|
188
|
+
obj = if proxy
|
189
|
+
# Proxy object will delegate the ref we return from there
|
190
|
+
# no action need
|
191
|
+
proxy
|
192
|
+
else
|
193
|
+
# new object: factory may create proxy for us and we'll cache it for later
|
194
|
+
# use:
|
195
|
+
@factory and ref = @factory.call(ref)
|
196
|
+
ref
|
197
|
+
end
|
198
|
+
# Important: we set finalizer fot the target object
|
199
|
+
ObjectSpace.define_finalizer(obj, create_finalizer(remote_id))
|
200
|
+
# and we cache target object
|
201
|
+
@cache[remote_id] = WeakReference.new(obj)
|
187
202
|
end
|
203
|
+
# but we return reference: it the proxy constructor calls us, it'll need the ref:
|
188
204
|
ref
|
189
205
|
}
|
190
206
|
end
|
@@ -334,9 +350,14 @@ module Universa
|
|
334
350
|
@id
|
335
351
|
end
|
336
352
|
|
353
|
+
# name of the remote class (provided by remote)
|
354
|
+
def _remote_class_name
|
355
|
+
@ref.className
|
356
|
+
end
|
357
|
+
|
337
358
|
# Internal use only. Allow processing remote commands as local calls
|
338
359
|
def respond_to_missing?(method_name, include_private = false)
|
339
|
-
method_name[0] == '_' ? super : true
|
360
|
+
method_name[0] == '_' || LOCAL_METHODS.include?(method_name) ? super : true
|
340
361
|
end
|
341
362
|
|
342
363
|
#Internal use only. Call remote method as needed. This is where all the magick comes from: it call remote method instead of the
|
@@ -357,13 +378,13 @@ module Universa
|
|
357
378
|
|
358
379
|
# short data label for instance
|
359
380
|
def inspect
|
360
|
-
"<UMI:Ref:#{@umi.__id__}:#{@ref.className}:#{@id}
|
381
|
+
"<UMI:Ref:#{@umi.__id__}:#{@ref.className}:#{@id}>"
|
361
382
|
end
|
362
383
|
|
363
384
|
# Checks that references are euqal: either both point to the same remote object or respective remote objects
|
364
385
|
# are reported equals by the remote +equals()+ call.
|
365
386
|
def ==(other)
|
366
|
-
other.is_a?(Ref) && other._umi == @umi &&
|
387
|
+
(other.is_a?(Ref) || other.is_a?(RemoteAdapter)) && other._umi == @umi &&
|
367
388
|
(other._remote_id == @id || other.equals(self))
|
368
389
|
end
|
369
390
|
|
@@ -373,6 +394,24 @@ module Universa
|
|
373
394
|
other.is_a?(Ref) && other._umi == @umi && other._remote_id == @id
|
374
395
|
end
|
375
396
|
|
397
|
+
private
|
398
|
+
|
399
|
+
LOCAL_METHODS = Set.new(%i[i_respond_to_everything_so_im_not_really_a_matcher to_hash to_ary description])
|
400
|
+
end
|
401
|
+
|
402
|
+
# Service uses this class to contruct {RemoteAdapter} pointing to the existing remote object instead
|
403
|
+
# of instantiating new one.
|
404
|
+
#
|
405
|
+
class ReferenceCreationData
|
406
|
+
# reference to create proxy for
|
407
|
+
# @return [Ref]
|
408
|
+
attr :ref
|
409
|
+
|
410
|
+
# we need to wrap this ref
|
411
|
+
# @param [Ref] ref to wrap in {RemoteAdapter}
|
412
|
+
def initialize ref
|
413
|
+
@ref = ref
|
414
|
+
end
|
376
415
|
end
|
377
416
|
|
378
417
|
end
|
data/lib/universa/version.rb
CHANGED
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.
|
4
|
+
version: 0.1.3
|
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-
|
11
|
+
date: 2018-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: farcall
|
@@ -95,7 +95,6 @@ files:
|
|
95
95
|
- bin/umi/lib/com.icodici.common_tools-3.8.3.jar
|
96
96
|
- bin/umi/lib/com.icodici.crypto-3.8.3.jar
|
97
97
|
- bin/umi/lib/com.icodici.nanohttpd-2.1.0.jar
|
98
|
-
- bin/umi/lib/com.icodici.umi-0.8.8.jar
|
99
98
|
- bin/umi/lib/com.icodici.universa_core-3.8.3.jar
|
100
99
|
- bin/umi/lib/com.madgag.spongycastle.core-1.58.0.0.jar
|
101
100
|
- bin/umi/lib/com.squareup.jnagmp.jnagmp-2.0.0.jar
|
@@ -111,8 +110,12 @@ files:
|
|
111
110
|
- bin/umi/lib/org.yaml.snakeyaml-1.18.jar
|
112
111
|
- exe/universa
|
113
112
|
- lib/universa.rb
|
113
|
+
- lib/universa/contract.rb
|
114
114
|
- lib/universa/errors.rb
|
115
|
+
- lib/universa/keys.rb
|
116
|
+
- lib/universa/service.rb
|
115
117
|
- lib/universa/string_utils.rb
|
118
|
+
- lib/universa/tools.rb
|
116
119
|
- lib/universa/umi.rb
|
117
120
|
- lib/universa/version.rb
|
118
121
|
- lib/universa/weak_reference.rb
|
Binary file
|