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.
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