erlang-etf 1.1.1 → 2.0.0
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 +4 -4
- data/.editorconfig +20 -0
- data/.gitignore +10 -18
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +15 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile +10 -6
- data/LICENSE.txt +1 -1
- data/README.md +13 -13
- data/Rakefile +8 -6
- data/erlang-etf.gemspec +10 -10
- data/lib/erlang-etf.rb +1 -0
- data/lib/erlang/etf.rb +363 -30
- data/lib/erlang/etf/atom.rb +28 -48
- data/lib/erlang/etf/atom_utf8.rb +28 -48
- data/lib/erlang/etf/binary.rb +24 -23
- data/lib/erlang/etf/bit_binary.rb +35 -27
- data/lib/erlang/etf/compressed.rb +61 -35
- data/lib/erlang/etf/export.rb +44 -21
- data/lib/erlang/etf/float.rb +33 -29
- data/lib/erlang/etf/fun.rb +54 -32
- data/lib/erlang/etf/integer.rb +24 -12
- data/lib/erlang/etf/large_big.rb +31 -37
- data/lib/erlang/etf/large_tuple.rb +41 -30
- data/lib/erlang/etf/list.rb +55 -25
- data/lib/erlang/etf/map.rb +58 -28
- data/lib/erlang/etf/new_float.rb +25 -14
- data/lib/erlang/etf/new_fun.rb +70 -47
- data/lib/erlang/etf/new_reference.rb +51 -24
- data/lib/erlang/etf/nil.rb +21 -6
- data/lib/erlang/etf/pid.rb +48 -21
- data/lib/erlang/etf/port.rb +49 -13
- data/lib/erlang/etf/reference.rb +49 -13
- data/lib/erlang/etf/small_atom.rb +31 -27
- data/lib/erlang/etf/small_atom_utf8.rb +31 -27
- data/lib/erlang/etf/small_big.rb +30 -39
- data/lib/erlang/etf/small_integer.rb +27 -12
- data/lib/erlang/etf/small_tuple.rb +41 -30
- data/lib/erlang/etf/string.rb +23 -23
- data/lib/erlang/etf/term.rb +109 -70
- data/lib/erlang/etf/version.rb +1 -1
- metadata +33 -169
- data/.rspec +0 -2
- data/lib/erlang/etf/bert.rb +0 -74
- data/lib/erlang/etf/extensions.rb +0 -144
- data/lib/erlang/etf/extensions/array.rb +0 -27
- data/lib/erlang/etf/extensions/big_decimal.rb +0 -20
- data/lib/erlang/etf/extensions/erlang-export.rb +0 -24
- data/lib/erlang/etf/extensions/erlang-list.rb +0 -29
- data/lib/erlang/etf/extensions/erlang-map.rb +0 -26
- data/lib/erlang/etf/extensions/erlang-nil.rb +0 -20
- data/lib/erlang/etf/extensions/erlang-pid.rb +0 -20
- data/lib/erlang/etf/extensions/erlang-string.rb +0 -31
- data/lib/erlang/etf/extensions/erlang-tuple.rb +0 -29
- data/lib/erlang/etf/extensions/false_class.rb +0 -26
- data/lib/erlang/etf/extensions/float.rb +0 -18
- data/lib/erlang/etf/extensions/hash.rb +0 -30
- data/lib/erlang/etf/extensions/integer.rb +0 -46
- data/lib/erlang/etf/extensions/nil_class.rb +0 -27
- data/lib/erlang/etf/extensions/object.rb +0 -22
- data/lib/erlang/etf/extensions/regexp.rb +0 -32
- data/lib/erlang/etf/extensions/string.rb +0 -33
- data/lib/erlang/etf/extensions/symbol.rb +0 -43
- data/lib/erlang/etf/extensions/time.rb +0 -27
- data/lib/erlang/etf/extensions/true_class.rb +0 -26
- data/lib/erlang/etf/terms.rb +0 -132
- data/spec/erlang/etf/atom_spec.rb +0 -90
- data/spec/erlang/etf/atom_utf8_spec.rb +0 -90
- data/spec/erlang/etf/binary_spec.rb +0 -90
- data/spec/erlang/etf/bit_binary_spec.rb +0 -99
- data/spec/erlang/etf/compressed_spec.rb +0 -37
- data/spec/erlang/etf/export_spec.rb +0 -58
- data/spec/erlang/etf/extensions/array_spec.rb +0 -40
- data/spec/erlang/etf/extensions/big_decimal_spec.rb +0 -26
- data/spec/erlang/etf/extensions/erlang-export_spec.rb +0 -32
- data/spec/erlang/etf/extensions/erlang-list_spec.rb +0 -76
- data/spec/erlang/etf/extensions/erlang-map_spec.rb +0 -48
- data/spec/erlang/etf/extensions/erlang-nil_spec.rb +0 -24
- data/spec/erlang/etf/extensions/erlang-pid_spec.rb +0 -33
- data/spec/erlang/etf/extensions/erlang-string_spec.rb +0 -41
- data/spec/erlang/etf/extensions/erlang-tuple_spec.rb +0 -57
- data/spec/erlang/etf/extensions/false_class_spec.rb +0 -29
- data/spec/erlang/etf/extensions/float_spec.rb +0 -24
- data/spec/erlang/etf/extensions/hash_spec.rb +0 -90
- data/spec/erlang/etf/extensions/integer_spec.rb +0 -259
- data/spec/erlang/etf/extensions/nil_class_spec.rb +0 -29
- data/spec/erlang/etf/extensions/object_spec.rb +0 -30
- data/spec/erlang/etf/extensions/regexp_spec.rb +0 -35
- data/spec/erlang/etf/extensions/string_spec.rb +0 -43
- data/spec/erlang/etf/extensions/symbol_spec.rb +0 -64
- data/spec/erlang/etf/extensions/time_spec.rb +0 -32
- data/spec/erlang/etf/extensions/true_class_spec.rb +0 -29
- data/spec/erlang/etf/float_spec.rb +0 -92
- data/spec/erlang/etf/fun_spec.rb +0 -132
- data/spec/erlang/etf/integer_spec.rb +0 -57
- data/spec/erlang/etf/large_big_spec.rb +0 -67
- data/spec/erlang/etf/large_tuple_spec.rb +0 -119
- data/spec/erlang/etf/list_spec.rb +0 -159
- data/spec/erlang/etf/map_spec.rb +0 -100
- data/spec/erlang/etf/new_float_spec.rb +0 -92
- data/spec/erlang/etf/new_fun_spec.rb +0 -146
- data/spec/erlang/etf/new_reference_spec.rb +0 -60
- data/spec/erlang/etf/nil_spec.rb +0 -50
- data/spec/erlang/etf/pid_spec.rb +0 -61
- data/spec/erlang/etf/port_spec.rb +0 -58
- data/spec/erlang/etf/reference_spec.rb +0 -58
- data/spec/erlang/etf/small_atom_spec.rb +0 -90
- data/spec/erlang/etf/small_atom_utf8_spec.rb +0 -90
- data/spec/erlang/etf/small_big_spec.rb +0 -67
- data/spec/erlang/etf/small_integer_spec.rb +0 -57
- data/spec/erlang/etf/small_tuple_spec.rb +0 -112
- data/spec/erlang/etf/string_spec.rb +0 -92
- data/spec/erlang/etf/term_spec.rb +0 -27
- data/spec/erlang/etf/terms_spec.rb +0 -23
- data/spec/erlang/etf_spec.rb +0 -23
- data/spec/erlang_spec.rb +0 -95
- data/spec/spec_helper.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3781a7262d7a19086a4fd9bdf06b8af1c40b5fc7
|
4
|
+
data.tar.gz: 2fe7d74a025640903e188be88a465174685a6d6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '042448d3a9c743edddb837bf2677f9ee9ec44c682851d160b2f6fa2f5ce788ab8df9b0159227324baee69a5d96a7d009460fefad460a1962c8de96040ce624ff'
|
7
|
+
data.tar.gz: bc027fc5ffbcb6b73da22da2bd2c3cbcdf7722f51aa0ee942c8d7e947e0c5c38d94db37d4b957b3d7991e7916ad203bb34ede40dadeaf4698b60514aa5a7f4a4
|
data/.editorconfig
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# EditorConfig helps developers define and maintain consistent
|
2
|
+
# coding styles between different editors and IDEs
|
3
|
+
# editorconfig.org
|
4
|
+
|
5
|
+
root = true
|
6
|
+
|
7
|
+
[*]
|
8
|
+
|
9
|
+
# Change these settings to your own preference
|
10
|
+
indent_style = space
|
11
|
+
indent_size = 2
|
12
|
+
|
13
|
+
# We recommend you to keep these unchanged
|
14
|
+
end_of_line = lf
|
15
|
+
charset = utf-8
|
16
|
+
trim_trailing_whitespace = true
|
17
|
+
insert_final_newline = true
|
18
|
+
|
19
|
+
[*.md]
|
20
|
+
trim_trailing_whitespace = false
|
data/.gitignore
CHANGED
@@ -1,18 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
.
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
doc/
|
12
|
-
lib/bundler/man
|
13
|
-
pkg
|
14
|
-
rdoc
|
15
|
-
spec/reports
|
16
|
-
test/tmp
|
17
|
-
test/version_tmp
|
18
|
-
tmp
|
1
|
+
/.bundle/
|
2
|
+
/.minitest-perf.db
|
3
|
+
/.yardoc
|
4
|
+
/Gemfile.lock
|
5
|
+
/_yardoc/
|
6
|
+
/coverage/
|
7
|
+
/doc/
|
8
|
+
/pkg/
|
9
|
+
/spec/reports/
|
10
|
+
/tmp/
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
erlang-etf
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.4.1
|
data/.travis.yml
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
language: ruby
|
2
|
+
|
3
|
+
sudo: required
|
4
|
+
dist: trusty
|
5
|
+
|
6
|
+
env:
|
7
|
+
global:
|
8
|
+
- RUBYOPT="-W0"
|
9
|
+
|
2
10
|
rvm:
|
3
|
-
-
|
4
|
-
|
5
|
-
|
6
|
-
|
11
|
+
- 2.4.1
|
12
|
+
|
13
|
+
notifications:
|
14
|
+
email: false
|
15
|
+
|
16
|
+
before_install:
|
17
|
+
- "gem install bundler -v 1.15.1"
|
data/CHANGELOG.md
ADDED
data/Gemfile
CHANGED
@@ -2,19 +2,23 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
platforms :ruby do
|
4
4
|
group :development do
|
5
|
-
gem
|
6
|
-
gem
|
7
|
-
gem
|
8
|
-
gem
|
5
|
+
gem 'pry'
|
6
|
+
gem 'pry-doc'
|
7
|
+
# gem 'redcarpet'
|
8
|
+
gem 'yard'
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
group :test do
|
13
|
-
gem
|
13
|
+
gem 'minitest-focus', require: false
|
14
|
+
gem 'minitest-perf', require: false
|
15
|
+
gem 'minitest-reporters', require: false
|
16
|
+
gem 'rantly', require: false
|
17
|
+
gem 'simplecov', require: false
|
14
18
|
if ENV['CI']
|
15
19
|
gem 'coveralls', require: false
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
19
|
-
# Specify your gem's dependencies in
|
23
|
+
# Specify your gem's dependencies in jose.gemspec
|
20
24
|
gemspec
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,26 +1,26 @@
|
|
1
|
-
# Erlang::ETF
|
1
|
+
# Erlang::ETF
|
2
|
+
|
3
|
+
[](https://travis-ci.org/potatosalad/ruby-erlang-etf) [](https://coveralls.io/github/potatosalad/ruby-erlang-etf?branch=master) [](https://rubygems.org/gems/erlang-etf) [](http://www.rubydoc.info/gems/erlang-etf) [](http://inch-ci.org/github/potatosalad/ruby-erlang-etf)
|
2
4
|
|
3
5
|
Erlang [External Term Format](http://erlang.org/doc/apps/erts/erl_ext_dist.html) (ETF) for Ruby.
|
4
6
|
|
7
|
+
*Note:* Please see the [erlang-terms](https://github.com/potatosalad/ruby-erlang-terms) gem for more information about the Erlang-to-Ruby type mappings (for example, `Erlang::Pid`).
|
8
|
+
|
5
9
|
## Installation
|
6
10
|
|
7
11
|
Add this line to your application's Gemfile:
|
8
12
|
|
9
13
|
```ruby
|
10
|
-
gem 'erlang-etf',
|
14
|
+
gem 'erlang-etf', '~> 2.0'
|
11
15
|
```
|
12
16
|
|
13
17
|
And then execute:
|
14
18
|
|
15
|
-
|
16
|
-
$ bundle
|
17
|
-
```
|
19
|
+
$ bundle
|
18
20
|
|
19
21
|
Or install it yourself as:
|
20
22
|
|
21
|
-
|
22
|
-
$ gem install erlang-etf
|
23
|
-
```
|
23
|
+
$ gem install erlang-etf
|
24
24
|
|
25
25
|
## Usage
|
26
26
|
|
@@ -47,8 +47,8 @@ Erlang.binary_to_term("\x83s\x04atom")
|
|
47
47
|
|
48
48
|
## Contributing
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
50
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/potatosalad/ruby-erlang-etf. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
|
51
|
+
|
52
|
+
## License
|
53
|
+
|
54
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
-
require "
|
3
|
-
require "yard"
|
2
|
+
require "rake/testtask"
|
4
3
|
|
5
|
-
|
4
|
+
Rake::TestTask.new(:test) do |t|
|
5
|
+
t.libs << "test"
|
6
|
+
t.libs << "lib"
|
7
|
+
t.test_files = FileList['test/**/*_test.rb']
|
8
|
+
t.warning = false
|
9
|
+
end
|
6
10
|
|
7
|
-
|
8
|
-
|
9
|
-
task :default => [:spec]
|
11
|
+
task :default => :test
|
data/erlang-etf.gemspec
CHANGED
@@ -7,21 +7,21 @@ Gem::Specification.new do |spec|
|
|
7
7
|
spec.name = "erlang-etf"
|
8
8
|
spec.version = Erlang::ETF::VERSION
|
9
9
|
spec.authors = ["Andrew Bennett"]
|
10
|
-
spec.email = ["andrew@
|
10
|
+
spec.email = ["andrew@pixid.com"]
|
11
|
+
|
11
12
|
spec.description = %q{Erlang External Term Format (ETF) for Ruby}
|
12
13
|
spec.summary = %q{Erlang External Term Format (ETF) for Ruby}
|
13
|
-
spec.homepage = "https://github.com/potatosalad/erlang-etf"
|
14
|
+
spec.homepage = "https://github.com/potatosalad/ruby-erlang-etf"
|
14
15
|
spec.license = "MIT"
|
15
16
|
|
16
|
-
spec.files = `git ls-files`.split(
|
17
|
-
spec.
|
18
|
-
spec.
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
20
|
spec.require_paths = ["lib"]
|
20
21
|
|
21
|
-
spec.add_dependency "
|
22
|
-
spec.add_dependency "erlang-terms", ">= 1.1.0"
|
22
|
+
spec.add_dependency "erlang-terms", "~> 2.0"
|
23
23
|
|
24
|
-
spec.add_development_dependency "bundler", "~> 1.
|
25
|
-
spec.add_development_dependency "rake"
|
26
|
-
spec.add_development_dependency "
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.15"
|
25
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
26
|
+
spec.add_development_dependency "minitest"
|
27
27
|
end
|
data/lib/erlang-etf.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'erlang/etf'
|
data/lib/erlang/etf.rb
CHANGED
@@ -1,51 +1,384 @@
|
|
1
|
-
require
|
2
|
-
require "erlang/terms"
|
1
|
+
require 'erlang/etf/version'
|
3
2
|
|
4
|
-
require
|
5
|
-
|
6
|
-
require
|
3
|
+
require 'erlang/terms'
|
4
|
+
|
5
|
+
require 'erlang/etf/term'
|
6
|
+
|
7
|
+
require 'erlang/etf/atom'
|
8
|
+
require 'erlang/etf/atom_utf8'
|
9
|
+
require 'erlang/etf/binary'
|
10
|
+
require 'erlang/etf/bit_binary'
|
11
|
+
require 'erlang/etf/compressed'
|
12
|
+
require 'erlang/etf/export'
|
13
|
+
require 'erlang/etf/float'
|
14
|
+
require 'erlang/etf/fun'
|
15
|
+
require 'erlang/etf/integer'
|
16
|
+
require 'erlang/etf/large_big'
|
17
|
+
require 'erlang/etf/large_tuple'
|
18
|
+
require 'erlang/etf/list'
|
19
|
+
require 'erlang/etf/map'
|
20
|
+
require 'erlang/etf/new_float'
|
21
|
+
require 'erlang/etf/new_fun'
|
22
|
+
require 'erlang/etf/new_reference'
|
23
|
+
require 'erlang/etf/nil'
|
24
|
+
require 'erlang/etf/pid'
|
25
|
+
require 'erlang/etf/port'
|
26
|
+
require 'erlang/etf/reference'
|
27
|
+
require 'erlang/etf/small_atom'
|
28
|
+
require 'erlang/etf/small_atom_utf8'
|
29
|
+
require 'erlang/etf/small_big'
|
30
|
+
require 'erlang/etf/small_integer'
|
31
|
+
require 'erlang/etf/small_tuple'
|
32
|
+
require 'erlang/etf/string'
|
7
33
|
|
8
34
|
module Erlang
|
9
35
|
module ETF
|
36
|
+
# @private
|
37
|
+
B2T = ::Hash[*[
|
38
|
+
[ Erlang::ETF::Term::SMALL_INTEGER_EXT, Erlang::ETF::SmallInteger ],
|
39
|
+
[ Erlang::ETF::Term::INTEGER_EXT, Erlang::ETF::Integer ],
|
40
|
+
[ Erlang::ETF::Term::FLOAT_EXT, Erlang::ETF::Float ],
|
41
|
+
[ Erlang::ETF::Term::ATOM_EXT, Erlang::ETF::Atom ],
|
42
|
+
[ Erlang::ETF::Term::REFERENCE_EXT, Erlang::ETF::Reference ],
|
43
|
+
[ Erlang::ETF::Term::PORT_EXT, Erlang::ETF::Port ],
|
44
|
+
[ Erlang::ETF::Term::PID_EXT, Erlang::ETF::Pid ],
|
45
|
+
[ Erlang::ETF::Term::SMALL_TUPLE_EXT, Erlang::ETF::SmallTuple ],
|
46
|
+
[ Erlang::ETF::Term::LARGE_TUPLE_EXT, Erlang::ETF::LargeTuple ],
|
47
|
+
[ Erlang::ETF::Term::NIL_EXT, Erlang::ETF::Nil ],
|
48
|
+
[ Erlang::ETF::Term::STRING_EXT, Erlang::ETF::String ],
|
49
|
+
[ Erlang::ETF::Term::LIST_EXT, Erlang::ETF::List ],
|
50
|
+
[ Erlang::ETF::Term::BINARY_EXT, Erlang::ETF::Binary ],
|
51
|
+
[ Erlang::ETF::Term::SMALL_BIG_EXT, Erlang::ETF::SmallBig ],
|
52
|
+
[ Erlang::ETF::Term::LARGE_BIG_EXT, Erlang::ETF::LargeBig ],
|
53
|
+
[ Erlang::ETF::Term::NEW_REFERENCE_EXT, Erlang::ETF::NewReference ],
|
54
|
+
[ Erlang::ETF::Term::SMALL_ATOM_EXT, Erlang::ETF::SmallAtom ],
|
55
|
+
[ Erlang::ETF::Term::FUN_EXT, Erlang::ETF::Fun ],
|
56
|
+
[ Erlang::ETF::Term::NEW_FUN_EXT, Erlang::ETF::NewFun ],
|
57
|
+
[ Erlang::ETF::Term::EXPORT_EXT, Erlang::ETF::Export ],
|
58
|
+
[ Erlang::ETF::Term::BIT_BINARY_EXT, Erlang::ETF::BitBinary ],
|
59
|
+
[ Erlang::ETF::Term::NEW_FLOAT_EXT, Erlang::ETF::NewFloat ],
|
60
|
+
[ Erlang::ETF::Term::ATOM_UTF8_EXT, Erlang::ETF::AtomUTF8 ],
|
61
|
+
[ Erlang::ETF::Term::SMALL_ATOM_UTF8_EXT, Erlang::ETF::SmallAtomUTF8 ],
|
62
|
+
[ Erlang::ETF::Term::MAP_EXT, Erlang::ETF::Map ],
|
63
|
+
# [ Erlang::ETF::Term::DIST_HEADER, NotImplementedError ],
|
64
|
+
# [ Erlang::ETF::Term::ATOM_CACHE_REF, NotImplementedError ],
|
65
|
+
# [ Erlang::ETF::Term::ATOM_INTERNAL_REF2, NotImplementedError ],
|
66
|
+
# [ Erlang::ETF::Term::ATOM_INTERNAL_REF3, NotImplementedError ],
|
67
|
+
# [ Erlang::ETF::Term::BINARY_INTERNAL_REF, NotImplementedError ],
|
68
|
+
# [ Erlang::ETF::Term::BIT_BINARY_INTERNAL_REF, NotImplementedError ],
|
69
|
+
[ Erlang::ETF::Term::COMPRESSED, Erlang::ETF::Compressed ]
|
70
|
+
].flatten].freeze
|
71
|
+
|
72
|
+
# @private
|
73
|
+
T2B = B2T.invert.freeze
|
74
|
+
|
75
|
+
# @private
|
76
|
+
TYPE = ::Hash[*[
|
77
|
+
[ :atom, Erlang::ETF::Atom ],
|
78
|
+
[ :atom_utf8, Erlang::ETF::AtomUTF8 ],
|
79
|
+
[ :binary, Erlang::ETF::Binary ],
|
80
|
+
[ :bit_binary, Erlang::ETF::BitBinary ],
|
81
|
+
[ :export, Erlang::ETF::Export ],
|
82
|
+
[ :float, Erlang::ETF::Float ],
|
83
|
+
[ :fun, Erlang::ETF::Fun ],
|
84
|
+
[ :integer, Erlang::ETF::Integer ],
|
85
|
+
[ :large_big, Erlang::ETF::LargeBig ],
|
86
|
+
[ :large_tuple, Erlang::ETF::LargeTuple ],
|
87
|
+
[ :list, Erlang::ETF::List ],
|
88
|
+
[ :map, Erlang::ETF::Map ],
|
89
|
+
[ :new_float, Erlang::ETF::NewFloat ],
|
90
|
+
[ :new_fun, Erlang::ETF::NewFun ],
|
91
|
+
[ :new_reference, Erlang::ETF::NewReference ],
|
92
|
+
[ :nil, Erlang::ETF::Nil ],
|
93
|
+
[ :pid, Erlang::ETF::Pid ],
|
94
|
+
[ :port, Erlang::ETF::Port ],
|
95
|
+
[ :reference, Erlang::ETF::Reference ],
|
96
|
+
[ :small_atom, Erlang::ETF::SmallAtom ],
|
97
|
+
[ :small_atom_utf8, Erlang::ETF::SmallAtomUTF8 ],
|
98
|
+
[ :small_big, Erlang::ETF::SmallBig ],
|
99
|
+
[ :small_integer, Erlang::ETF::SmallInteger ],
|
100
|
+
[ :small_tuple, Erlang::ETF::SmallTuple ],
|
101
|
+
[ :string, Erlang::ETF::String ]
|
102
|
+
].flatten].freeze
|
103
|
+
|
104
|
+
def self.is_atom(term)
|
105
|
+
return true if term.kind_of?(TYPE[:atom])
|
106
|
+
return true if Erlang.is_atom(term) and term.size >= 256 and term.utf8 == false
|
107
|
+
return false
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.is_atom_utf8(term)
|
111
|
+
return true if term.kind_of?(TYPE[:atom_utf8])
|
112
|
+
return true if Erlang.is_atom(term) and term.size >= 256 and term.utf8 == true
|
113
|
+
return false
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.is_binary(term)
|
117
|
+
return true if term.kind_of?(TYPE[:binary])
|
118
|
+
return true if Erlang.is_binary(term)
|
119
|
+
return false
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.is_bit_binary(term)
|
123
|
+
return true if term.kind_of?(TYPE[:bit_binary])
|
124
|
+
return true if not Erlang.is_binary(term) and Erlang.is_bitstring(term)
|
125
|
+
return false
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.is_export(term)
|
129
|
+
return true if term.kind_of?(TYPE[:export])
|
130
|
+
return true if Erlang.is_function(term) and term.kind_of?(Erlang::Export)
|
131
|
+
return false
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.is_float(term)
|
135
|
+
return true if term.kind_of?(TYPE[:float])
|
136
|
+
return true if Erlang.is_float(term) and term.old == true
|
137
|
+
return false
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.is_fun(term)
|
141
|
+
return true if term.kind_of?(TYPE[:fun])
|
142
|
+
return true if Erlang.is_function(term) and not is_export(term) and not term.new_function?
|
143
|
+
return false
|
144
|
+
end
|
145
|
+
|
146
|
+
def self.is_integer(term)
|
147
|
+
return true if term.kind_of?(TYPE[:integer])
|
148
|
+
return true if Erlang.is_integer(term) and not is_small_integer(term) and term >= (-(1 << 31) + 1) and term <= (+(1 << 31) - 1)
|
149
|
+
return false
|
150
|
+
end
|
151
|
+
|
152
|
+
def self.is_large_big(term)
|
153
|
+
return true if term.kind_of?(TYPE[:large_big])
|
154
|
+
return true if Erlang.is_integer(term) and not is_small_integer(term) and not is_integer(term) and not is_small_big(term)
|
155
|
+
return false
|
156
|
+
end
|
157
|
+
|
158
|
+
def self.is_large_tuple(term)
|
159
|
+
return true if term.kind_of?(TYPE[:large_tuple])
|
160
|
+
return true if Erlang.is_tuple(term) and not is_small_tuple(term)
|
161
|
+
return false
|
162
|
+
end
|
163
|
+
|
164
|
+
def self.is_list(term)
|
165
|
+
return true if term.kind_of?(TYPE[:list])
|
166
|
+
return true if Erlang.is_list(term) and not is_nil(term) and not is_string(term)
|
167
|
+
return false
|
168
|
+
end
|
169
|
+
|
170
|
+
def self.is_map(term)
|
171
|
+
return true if term.kind_of?(TYPE[:map])
|
172
|
+
return true if Erlang.is_map(term)
|
173
|
+
return false
|
174
|
+
end
|
175
|
+
|
176
|
+
def self.is_new_float(term)
|
177
|
+
return true if term.kind_of?(TYPE[:new_float])
|
178
|
+
return true if Erlang.is_float(term) and term.old == false
|
179
|
+
return false
|
180
|
+
end
|
181
|
+
|
182
|
+
def self.is_new_fun(term)
|
183
|
+
return true if term.kind_of?(TYPE[:new_fun])
|
184
|
+
return true if Erlang.is_function(term) and not is_export(term) and term.new_function?
|
185
|
+
return false
|
186
|
+
end
|
187
|
+
|
188
|
+
def self.is_new_reference(term)
|
189
|
+
return true if term.kind_of?(TYPE[:new_reference])
|
190
|
+
return true if Erlang.is_reference(term) and term.new_reference?
|
191
|
+
return false
|
192
|
+
end
|
10
193
|
|
11
|
-
|
194
|
+
def self.is_nil(term)
|
195
|
+
return true if term.kind_of?(TYPE[:nil])
|
196
|
+
return true if Erlang.is_list(term) and term.empty?
|
197
|
+
return false
|
198
|
+
end
|
199
|
+
|
200
|
+
def self.is_pid(term)
|
201
|
+
return true if term.kind_of?(TYPE[:pid])
|
202
|
+
return true if Erlang.is_pid(term)
|
203
|
+
return false
|
204
|
+
end
|
205
|
+
|
206
|
+
def self.is_port(term)
|
207
|
+
return true if term.kind_of?(TYPE[:port])
|
208
|
+
return true if Erlang.is_port(term)
|
209
|
+
return false
|
210
|
+
end
|
211
|
+
|
212
|
+
def self.is_reference(term)
|
213
|
+
return true if term.kind_of?(TYPE[:reference])
|
214
|
+
return true if Erlang.is_reference(term) and not term.new_reference?
|
215
|
+
return false
|
216
|
+
end
|
217
|
+
|
218
|
+
def self.is_small_atom(term)
|
219
|
+
return true if term.kind_of?(TYPE[:small_atom])
|
220
|
+
return true if Erlang.is_atom(term) and term.size < 256 and term.utf8 == false
|
221
|
+
return false
|
222
|
+
end
|
223
|
+
|
224
|
+
def self.is_small_atom_utf8(term)
|
225
|
+
return true if term.kind_of?(TYPE[:small_atom_utf8])
|
226
|
+
return true if Erlang.is_atom(term) and term.size < 256 and term.utf8 == true
|
227
|
+
return false
|
228
|
+
end
|
229
|
+
|
230
|
+
def self.is_small_big(term)
|
231
|
+
return true if term.kind_of?(TYPE[:small_big])
|
232
|
+
return true if Erlang.is_integer(term) and not is_small_integer(term) and not is_integer(term) and intlog2div8(term) < 256
|
233
|
+
return false
|
234
|
+
end
|
235
|
+
|
236
|
+
def self.is_small_integer(term)
|
237
|
+
return true if term.kind_of?(TYPE[:small_integer])
|
238
|
+
return true if Erlang.is_integer(term) and term >= 0 and term <= (+(1 << 8) - 1)
|
239
|
+
return false
|
240
|
+
end
|
241
|
+
|
242
|
+
def self.is_small_tuple(term)
|
243
|
+
return true if term.kind_of?(TYPE[:small_tuple])
|
244
|
+
return true if Erlang.is_tuple(term) and term.arity < 256
|
245
|
+
return false
|
246
|
+
end
|
12
247
|
|
13
|
-
|
248
|
+
def self.is_string(term)
|
249
|
+
return true if term.kind_of?(TYPE[:string])
|
250
|
+
return true if Erlang.is_list(term) and not is_nil(term) and term.kind_of?(Erlang::String) and term.length < (+(1 << 16) - 1)
|
251
|
+
return false
|
252
|
+
end
|
14
253
|
|
15
|
-
|
16
|
-
|
17
|
-
if
|
18
|
-
|
254
|
+
# @private
|
255
|
+
def self.intlog2(x)
|
256
|
+
raise ArgumentError, "x must be a positive Integer" if not x.is_a?(::Integer) or x < 1
|
257
|
+
r = 0
|
258
|
+
loop do
|
259
|
+
break if x == 0
|
260
|
+
x >>= 1
|
261
|
+
r += 1
|
262
|
+
end
|
263
|
+
return r
|
264
|
+
end
|
265
|
+
|
266
|
+
# @private
|
267
|
+
def self.intlog2div8(x)
|
268
|
+
raise ArgumentError, "x must be a non-negative Integer" if not x.is_a?(::Integer)
|
269
|
+
x = x.abs if x < 0
|
270
|
+
return 1 if x == 0
|
271
|
+
x = intlog2(x)
|
272
|
+
return 1 + ((x - 1).div(8))
|
273
|
+
end
|
274
|
+
|
275
|
+
# @private
|
276
|
+
def self.binary_to_term(buffer, etf)
|
277
|
+
magic = buffer.getc
|
278
|
+
if magic == Erlang::ETF::Term::ERLANG_MAGIC_BYTE
|
279
|
+
term = nil
|
280
|
+
begin
|
281
|
+
term = read_term(buffer)
|
282
|
+
rescue NotImplementedError => e
|
283
|
+
buffer.ungetc(magic)
|
284
|
+
raise e
|
285
|
+
end
|
286
|
+
return Erlang.from(term) if etf == false
|
287
|
+
return term
|
19
288
|
else
|
20
|
-
|
289
|
+
buffer.ungetc(magic)
|
290
|
+
raise NotImplementedError, "unknown Erlang magic byte #{magic.inspect} (should be #{Erlang::ETF::Term::ERLANG_MAGIC_BYTE.inspect})"
|
21
291
|
end
|
292
|
+
# mzbuffer.read(1)
|
293
|
+
# magic = buffer.read(1)
|
294
|
+
# if magic == Erlang::ETF::Term::ERLANG_MAGIC_BYTE
|
295
|
+
# Terms.evolve(buffer)
|
296
|
+
# else
|
297
|
+
# raise NotImplementedError, "unknown Erlang magic byte #{magic.inspect} (should be #{Erlang::ETF::Term::ERLANG_MAGIC_BYTE.inspect})"
|
298
|
+
# end
|
22
299
|
end
|
23
300
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
301
|
+
# @private
|
302
|
+
def self.read_term(buffer)
|
303
|
+
tag = buffer.getbyte
|
304
|
+
if B2T.key?(tag)
|
305
|
+
return B2T[tag].erlang_load(buffer)
|
28
306
|
else
|
29
|
-
|
307
|
+
buffer.ungetbyte(tag)
|
308
|
+
raise NotImplementedError, "unknown Erlang External Format tag #{tag.inspect} (see http://erlang.org/doc/apps/erts/erl_ext_dist.html)"
|
30
309
|
end
|
31
310
|
end
|
32
311
|
|
312
|
+
# @private
|
313
|
+
def self.term_to_binary(term, buffer, compressed)
|
314
|
+
buffer << Erlang::ETF::Term::ERLANG_MAGIC_BYTE
|
315
|
+
if compressed == false
|
316
|
+
return term.erlang_dump(buffer)
|
317
|
+
else
|
318
|
+
return Erlang::ETF::Compressed[term, level: compressed].erlang_dump(buffer)
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
# @private
|
323
|
+
def self.write_term(term, buffer)
|
324
|
+
term = Erlang.etf(term)
|
325
|
+
return term.erlang_dump(buffer)
|
326
|
+
end
|
327
|
+
|
33
328
|
end
|
34
329
|
|
35
|
-
def self.
|
36
|
-
|
37
|
-
|
330
|
+
def self.etf(term)
|
331
|
+
return term.to_erlang_etf if term.respond_to?(:to_erlang_etf)
|
332
|
+
return term if term.kind_of?(Erlang::ETF::Term)
|
333
|
+
term = Erlang.from(term)
|
334
|
+
return term.to_erlang_etf if term.respond_to?(:to_erlang_etf)
|
335
|
+
type = external_type(term)
|
336
|
+
constructor = Erlang::ETF::TYPE[type]
|
337
|
+
raise NotImplementedError, "unsupported type #{type.inspect}" if constructor.nil?
|
338
|
+
return term if term.kind_of?(constructor)
|
339
|
+
return constructor[term]
|
38
340
|
end
|
39
341
|
|
40
|
-
def self.
|
41
|
-
if
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
ETF.
|
342
|
+
def self.external_type(term)
|
343
|
+
return term.erlang_external_type if term.respond_to?(:erlang_external_type)
|
344
|
+
term = Erlang.from(term)
|
345
|
+
return :atom if Erlang::ETF.is_atom(term)
|
346
|
+
return :atom_utf8 if Erlang::ETF.is_atom_utf8(term)
|
347
|
+
return :binary if Erlang::ETF.is_binary(term)
|
348
|
+
return :bit_binary if Erlang::ETF.is_bit_binary(term)
|
349
|
+
return :export if Erlang::ETF.is_export(term)
|
350
|
+
return :float if Erlang::ETF.is_float(term)
|
351
|
+
return :fun if Erlang::ETF.is_fun(term)
|
352
|
+
return :integer if Erlang::ETF.is_integer(term)
|
353
|
+
return :large_big if Erlang::ETF.is_large_big(term)
|
354
|
+
return :large_tuple if Erlang::ETF.is_large_tuple(term)
|
355
|
+
return :list if Erlang::ETF.is_list(term)
|
356
|
+
return :map if Erlang::ETF.is_map(term)
|
357
|
+
return :new_float if Erlang::ETF.is_new_float(term)
|
358
|
+
return :new_fun if Erlang::ETF.is_new_fun(term)
|
359
|
+
return :new_reference if Erlang::ETF.is_new_reference(term)
|
360
|
+
return :nil if Erlang::ETF.is_nil(term)
|
361
|
+
return :pid if Erlang::ETF.is_pid(term)
|
362
|
+
return :port if Erlang::ETF.is_port(term)
|
363
|
+
return :reference if Erlang::ETF.is_reference(term)
|
364
|
+
return :small_atom if Erlang::ETF.is_small_atom(term)
|
365
|
+
return :small_atom_utf8 if Erlang::ETF.is_small_atom_utf8(term)
|
366
|
+
return :small_big if Erlang::ETF.is_small_big(term)
|
367
|
+
return :small_integer if Erlang::ETF.is_small_integer(term)
|
368
|
+
return :small_tuple if Erlang::ETF.is_small_tuple(term)
|
369
|
+
return :string if Erlang::ETF.is_string(term)
|
370
|
+
raise NotImplementedError
|
371
|
+
end
|
372
|
+
|
373
|
+
def self.binary_to_term(buffer, etf: false)
|
374
|
+
buffer = ::StringIO.new(Erlang::ETF::Term.binary_encoding(buffer)) if buffer.respond_to?(:force_encoding)
|
375
|
+
return Erlang::ETF.binary_to_term(buffer, etf)
|
376
|
+
end
|
377
|
+
|
378
|
+
def self.term_to_binary(term, buffer: ::String.new, compressed: false)
|
379
|
+
term = Erlang.etf(term)
|
380
|
+
buffer = Erlang::ETF::Term.binary_encoding(buffer)
|
381
|
+
return Erlang::ETF.term_to_binary(term, buffer, compressed)
|
49
382
|
end
|
50
383
|
|
51
|
-
end
|
384
|
+
end
|