erlang-etf 1.1.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Travis](https://img.shields.io/travis/potatosalad/ruby-erlang-etf.svg?maxAge=86400)](https://travis-ci.org/potatosalad/ruby-erlang-etf) [![Coverage Status](https://coveralls.io/repos/github/potatosalad/ruby-erlang-etf/badge.svg?branch=master)](https://coveralls.io/github/potatosalad/ruby-erlang-etf?branch=master) [![Gem](https://img.shields.io/gem/v/erlang-etf.svg?maxAge=86400)](https://rubygems.org/gems/erlang-etf) [![Docs](https://img.shields.io/badge/yard-docs-blue.svg?maxAge=86400)](http://www.rubydoc.info/gems/erlang-etf) [![Inline docs](http://inch-ci.org/github/potatosalad/ruby-erlang-etf.svg?branch=master&style=shields)](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
|