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.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +20 -0
  3. data/.gitignore +10 -18
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +15 -4
  7. data/CHANGELOG.md +7 -0
  8. data/Gemfile +10 -6
  9. data/LICENSE.txt +1 -1
  10. data/README.md +13 -13
  11. data/Rakefile +8 -6
  12. data/erlang-etf.gemspec +10 -10
  13. data/lib/erlang-etf.rb +1 -0
  14. data/lib/erlang/etf.rb +363 -30
  15. data/lib/erlang/etf/atom.rb +28 -48
  16. data/lib/erlang/etf/atom_utf8.rb +28 -48
  17. data/lib/erlang/etf/binary.rb +24 -23
  18. data/lib/erlang/etf/bit_binary.rb +35 -27
  19. data/lib/erlang/etf/compressed.rb +61 -35
  20. data/lib/erlang/etf/export.rb +44 -21
  21. data/lib/erlang/etf/float.rb +33 -29
  22. data/lib/erlang/etf/fun.rb +54 -32
  23. data/lib/erlang/etf/integer.rb +24 -12
  24. data/lib/erlang/etf/large_big.rb +31 -37
  25. data/lib/erlang/etf/large_tuple.rb +41 -30
  26. data/lib/erlang/etf/list.rb +55 -25
  27. data/lib/erlang/etf/map.rb +58 -28
  28. data/lib/erlang/etf/new_float.rb +25 -14
  29. data/lib/erlang/etf/new_fun.rb +70 -47
  30. data/lib/erlang/etf/new_reference.rb +51 -24
  31. data/lib/erlang/etf/nil.rb +21 -6
  32. data/lib/erlang/etf/pid.rb +48 -21
  33. data/lib/erlang/etf/port.rb +49 -13
  34. data/lib/erlang/etf/reference.rb +49 -13
  35. data/lib/erlang/etf/small_atom.rb +31 -27
  36. data/lib/erlang/etf/small_atom_utf8.rb +31 -27
  37. data/lib/erlang/etf/small_big.rb +30 -39
  38. data/lib/erlang/etf/small_integer.rb +27 -12
  39. data/lib/erlang/etf/small_tuple.rb +41 -30
  40. data/lib/erlang/etf/string.rb +23 -23
  41. data/lib/erlang/etf/term.rb +109 -70
  42. data/lib/erlang/etf/version.rb +1 -1
  43. metadata +33 -169
  44. data/.rspec +0 -2
  45. data/lib/erlang/etf/bert.rb +0 -74
  46. data/lib/erlang/etf/extensions.rb +0 -144
  47. data/lib/erlang/etf/extensions/array.rb +0 -27
  48. data/lib/erlang/etf/extensions/big_decimal.rb +0 -20
  49. data/lib/erlang/etf/extensions/erlang-export.rb +0 -24
  50. data/lib/erlang/etf/extensions/erlang-list.rb +0 -29
  51. data/lib/erlang/etf/extensions/erlang-map.rb +0 -26
  52. data/lib/erlang/etf/extensions/erlang-nil.rb +0 -20
  53. data/lib/erlang/etf/extensions/erlang-pid.rb +0 -20
  54. data/lib/erlang/etf/extensions/erlang-string.rb +0 -31
  55. data/lib/erlang/etf/extensions/erlang-tuple.rb +0 -29
  56. data/lib/erlang/etf/extensions/false_class.rb +0 -26
  57. data/lib/erlang/etf/extensions/float.rb +0 -18
  58. data/lib/erlang/etf/extensions/hash.rb +0 -30
  59. data/lib/erlang/etf/extensions/integer.rb +0 -46
  60. data/lib/erlang/etf/extensions/nil_class.rb +0 -27
  61. data/lib/erlang/etf/extensions/object.rb +0 -22
  62. data/lib/erlang/etf/extensions/regexp.rb +0 -32
  63. data/lib/erlang/etf/extensions/string.rb +0 -33
  64. data/lib/erlang/etf/extensions/symbol.rb +0 -43
  65. data/lib/erlang/etf/extensions/time.rb +0 -27
  66. data/lib/erlang/etf/extensions/true_class.rb +0 -26
  67. data/lib/erlang/etf/terms.rb +0 -132
  68. data/spec/erlang/etf/atom_spec.rb +0 -90
  69. data/spec/erlang/etf/atom_utf8_spec.rb +0 -90
  70. data/spec/erlang/etf/binary_spec.rb +0 -90
  71. data/spec/erlang/etf/bit_binary_spec.rb +0 -99
  72. data/spec/erlang/etf/compressed_spec.rb +0 -37
  73. data/spec/erlang/etf/export_spec.rb +0 -58
  74. data/spec/erlang/etf/extensions/array_spec.rb +0 -40
  75. data/spec/erlang/etf/extensions/big_decimal_spec.rb +0 -26
  76. data/spec/erlang/etf/extensions/erlang-export_spec.rb +0 -32
  77. data/spec/erlang/etf/extensions/erlang-list_spec.rb +0 -76
  78. data/spec/erlang/etf/extensions/erlang-map_spec.rb +0 -48
  79. data/spec/erlang/etf/extensions/erlang-nil_spec.rb +0 -24
  80. data/spec/erlang/etf/extensions/erlang-pid_spec.rb +0 -33
  81. data/spec/erlang/etf/extensions/erlang-string_spec.rb +0 -41
  82. data/spec/erlang/etf/extensions/erlang-tuple_spec.rb +0 -57
  83. data/spec/erlang/etf/extensions/false_class_spec.rb +0 -29
  84. data/spec/erlang/etf/extensions/float_spec.rb +0 -24
  85. data/spec/erlang/etf/extensions/hash_spec.rb +0 -90
  86. data/spec/erlang/etf/extensions/integer_spec.rb +0 -259
  87. data/spec/erlang/etf/extensions/nil_class_spec.rb +0 -29
  88. data/spec/erlang/etf/extensions/object_spec.rb +0 -30
  89. data/spec/erlang/etf/extensions/regexp_spec.rb +0 -35
  90. data/spec/erlang/etf/extensions/string_spec.rb +0 -43
  91. data/spec/erlang/etf/extensions/symbol_spec.rb +0 -64
  92. data/spec/erlang/etf/extensions/time_spec.rb +0 -32
  93. data/spec/erlang/etf/extensions/true_class_spec.rb +0 -29
  94. data/spec/erlang/etf/float_spec.rb +0 -92
  95. data/spec/erlang/etf/fun_spec.rb +0 -132
  96. data/spec/erlang/etf/integer_spec.rb +0 -57
  97. data/spec/erlang/etf/large_big_spec.rb +0 -67
  98. data/spec/erlang/etf/large_tuple_spec.rb +0 -119
  99. data/spec/erlang/etf/list_spec.rb +0 -159
  100. data/spec/erlang/etf/map_spec.rb +0 -100
  101. data/spec/erlang/etf/new_float_spec.rb +0 -92
  102. data/spec/erlang/etf/new_fun_spec.rb +0 -146
  103. data/spec/erlang/etf/new_reference_spec.rb +0 -60
  104. data/spec/erlang/etf/nil_spec.rb +0 -50
  105. data/spec/erlang/etf/pid_spec.rb +0 -61
  106. data/spec/erlang/etf/port_spec.rb +0 -58
  107. data/spec/erlang/etf/reference_spec.rb +0 -58
  108. data/spec/erlang/etf/small_atom_spec.rb +0 -90
  109. data/spec/erlang/etf/small_atom_utf8_spec.rb +0 -90
  110. data/spec/erlang/etf/small_big_spec.rb +0 -67
  111. data/spec/erlang/etf/small_integer_spec.rb +0 -57
  112. data/spec/erlang/etf/small_tuple_spec.rb +0 -112
  113. data/spec/erlang/etf/string_spec.rb +0 -92
  114. data/spec/erlang/etf/term_spec.rb +0 -27
  115. data/spec/erlang/etf/terms_spec.rb +0 -23
  116. data/spec/erlang/etf_spec.rb +0 -23
  117. data/spec/erlang_spec.rb +0 -95
  118. data/spec/spec_helper.rb +0 -31
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 320c12034e0d50d1f92aeeadcc0042a121f972de
4
- data.tar.gz: c739e92472dbdef20ab555ddfb53b8404a7100d0
3
+ metadata.gz: 3781a7262d7a19086a4fd9bdf06b8af1c40b5fc7
4
+ data.tar.gz: 2fe7d74a025640903e188be88a465174685a6d6e
5
5
  SHA512:
6
- metadata.gz: d793115fb5b5bfe1694c0a23a0b0819435e206c91f8c55876cdbd0327e4bec433f0eafa9a4893e6e292832fb0a698e63c95db38c56d0a69857c3a87e4f2e34bd
7
- data.tar.gz: 6d05ec4e5619e8eedc9d95dadb904b2b4d6aaef75c857572f5aa21cb9e2573ab37e88e09d31336ef7b6d46d14d7b29b36f5ed7e2be3dc0f826031503bc5bdd89
6
+ metadata.gz: '042448d3a9c743edddb837bf2677f9ee9ec44c682851d160b2f6fa2f5ce788ab8df9b0159227324baee69a5d96a7d009460fefad460a1962c8de96040ce624ff'
7
+ data.tar.gz: bc027fc5ffbcb6b73da22da2bd2c3cbcdf7722f51aa0ee942c8d7e947e0c5c38d94db37d4b957b3d7991e7916ad203bb34ede40dadeaf4698b60514aa5a7f4a4
@@ -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
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .rvmrc
6
- .yardoc
7
- Gemfile.lock
8
- InstalledFiles
9
- _yardoc
10
- coverage
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/
@@ -0,0 +1 @@
1
+ erlang-etf
@@ -0,0 +1 @@
1
+ 2.4.1
@@ -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
- - 1.9.3
4
- - 2.0.0
5
- - 2.1.1
6
- env: CI="travis"
11
+ - 2.4.1
12
+
13
+ notifications:
14
+ email: false
15
+
16
+ before_install:
17
+ - "gem install bundler -v 1.15.1"
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ ## 2.0.0 (2017-06-03)
4
+
5
+ * Major rewrite.
6
+ * Fixed maps for OTP 17+.
7
+ * Support for BERT dropped.
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 "pry"
6
- gem "pry-doc"
7
- gem "redcarpet"
8
- gem "yard"
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 "simplecov", require: false
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 erlang-etf.gemspec
23
+ # Specify your gem's dependencies in jose.gemspec
20
24
  gemspec
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 Andrew Bennett
1
+ Copyright (c) 2013-2017 Andrew Bennett
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,26 +1,26 @@
1
- # Erlang::ETF [![Build Status](https://travis-ci.org/potatosalad/erlang-etf.png)](https://travis-ci.org/potatosalad/erlang-etf) [![Coverage Status](https://coveralls.io/repos/potatosalad/erlang-etf/badge.png)](https://coveralls.io/r/potatosalad/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', require: 'erlang/etf'
14
+ gem 'erlang-etf', '~> 2.0'
11
15
  ```
12
16
 
13
17
  And then execute:
14
18
 
15
- ```bash
16
- $ bundle
17
- ```
19
+ $ bundle
18
20
 
19
21
  Or install it yourself as:
20
22
 
21
- ```bash
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
- 1. Fork it
51
- 2. Create your feature branch (`git checkout -b my-new-feature`)
52
- 3. Commit your changes (`git commit -am 'Add some feature'`)
53
- 4. Push to the branch (`git push origin my-new-feature`)
54
- 5. Create new Pull Request
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 "rspec/core/rake_task"
3
- require "yard"
2
+ require "rake/testtask"
4
3
 
5
- YARD::Rake::YardocTask.new(:doc)
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
- RSpec::Core::RakeTask.new(:spec)
8
-
9
- task :default => [:spec]
11
+ task :default => :test
@@ -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@delorum.com"]
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.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
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 "binary-protocol"
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.3"
25
- spec.add_development_dependency "rake"
26
- spec.add_development_dependency "rspec"
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
@@ -0,0 +1 @@
1
+ require 'erlang/etf'
@@ -1,51 +1,384 @@
1
- require "binary/protocol"
2
- require "erlang/terms"
1
+ require 'erlang/etf/version'
3
2
 
4
- require "erlang/etf/version"
5
- require "erlang/etf/extensions"
6
- require "erlang/etf/terms"
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
- extend self
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
- ERLANG_MAGIC_BYTE = 131.chr.freeze
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
- def encode(term, buffer = "", options = {})
16
- buffer << ERLANG_MAGIC_BYTE
17
- if options[:compressed]
18
- Compressed.new(term.__erlang_evolve__, options[:compressed]).serialize(buffer)
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
- term.__erlang_dump__(buffer)
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
- def decode(buffer)
25
- magic = buffer.read(1)
26
- if magic == ERLANG_MAGIC_BYTE
27
- Terms.evolve(buffer)
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
- raise NotImplementedError, "unknown Erlang magic byte #{magic.inspect} (should be #{ERLANG_MAGIC_BYTE.inspect})"
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.binary_to_term(binary)
36
- buffer = binary.respond_to?(:read) ? binary : StringIO.new(binary)
37
- ETF.decode(buffer)
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.term_to_binary(term, buffer_or_options = "", options = nil)
41
- if buffer_or_options.kind_of?(::Hash)
42
- buffer = options || ""
43
- options = buffer_or_options
44
- else
45
- buffer = buffer_or_options
46
- end
47
- options ||= {}
48
- ETF.encode(term, buffer, options)
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