erlectricity-funbox 1.1.2

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 (55) hide show
  1. data/.gitignore +24 -0
  2. data/History.txt +35 -0
  3. data/LICENSE +20 -0
  4. data/README.md +130 -0
  5. data/Rakefile +74 -0
  6. data/VERSION.yml +4 -0
  7. data/benchmarks/bench.rb +21 -0
  8. data/erlectricity.gemspec +105 -0
  9. data/examples/echo/README.md +12 -0
  10. data/examples/echo/echo.erl +13 -0
  11. data/examples/echo/echo.rb +11 -0
  12. data/examples/gruff/gruff.erl +61 -0
  13. data/examples/gruff/gruff_provider.rb +31 -0
  14. data/examples/gruff/gruff_run.sh +19 -0
  15. data/examples/gruff/stat_run.sh +20 -0
  16. data/examples/gruff/stat_writer.erl +40 -0
  17. data/examples/simple/README.md +5 -0
  18. data/examples/simple/rerl.rb +111 -0
  19. data/examples/simple/rerl.sh +37 -0
  20. data/examples/tinderl/README.md +14 -0
  21. data/examples/tinderl/tinderl.erl +43 -0
  22. data/examples/tinderl/tinderl.rb +28 -0
  23. data/ext/decoder.c +398 -0
  24. data/ext/extconf.rb +11 -0
  25. data/lib/erlectricity.rb +33 -0
  26. data/lib/erlectricity/condition.rb +66 -0
  27. data/lib/erlectricity/conditions/boolean.rb +11 -0
  28. data/lib/erlectricity/conditions/hash.rb +13 -0
  29. data/lib/erlectricity/conditions/static.rb +34 -0
  30. data/lib/erlectricity/conditions/type.rb +17 -0
  31. data/lib/erlectricity/constants.rb +36 -0
  32. data/lib/erlectricity/decoder.rb +212 -0
  33. data/lib/erlectricity/encoder.rb +164 -0
  34. data/lib/erlectricity/errors/decode_error.rb +3 -0
  35. data/lib/erlectricity/errors/encode_error.rb +3 -0
  36. data/lib/erlectricity/errors/erlectricity_error.rb +3 -0
  37. data/lib/erlectricity/matcher.rb +21 -0
  38. data/lib/erlectricity/port.rb +46 -0
  39. data/lib/erlectricity/receiver.rb +69 -0
  40. data/lib/erlectricity/types/function.rb +3 -0
  41. data/lib/erlectricity/types/list.rb +3 -0
  42. data/lib/erlectricity/types/new_function.rb +3 -0
  43. data/lib/erlectricity/types/new_reference.rb +3 -0
  44. data/lib/erlectricity/types/pid.rb +3 -0
  45. data/lib/erlectricity/types/reference.rb +3 -0
  46. data/lib/erlectricity/version.rb +9 -0
  47. data/test/condition_spec.rb +72 -0
  48. data/test/decode_spec.rb +145 -0
  49. data/test/encode_spec.rb +146 -0
  50. data/test/matcher_spec.rb +81 -0
  51. data/test/port_spec.rb +34 -0
  52. data/test/receiver_spec.rb +103 -0
  53. data/test/spec_suite.rb +2 -0
  54. data/test/test_helper.rb +46 -0
  55. metadata +116 -0
data/.gitignore ADDED
@@ -0,0 +1,24 @@
1
+ pkg
2
+ ext/Makefile
3
+ ext/decoder.bundle
4
+ ext/decoder.o
5
+ *.beam
6
+ *.dump
7
+ .DS_Store
8
+ *.gem
9
+ *.rbc
10
+ .bundle
11
+ .config
12
+ .yardoc
13
+ Gemfile.lock
14
+ InstalledFiles
15
+ _yardoc
16
+ coverage
17
+ doc/
18
+ lib/bundler/man
19
+ pkg
20
+ rdoc
21
+ spec/reports
22
+ test/tmp
23
+ test/version_tmp
24
+ tmp
data/History.txt ADDED
@@ -0,0 +1,35 @@
1
+ == 1.1.1 / 2009-10-28
2
+ * Bug Fixes
3
+ * Fix bignum encoding
4
+ * Prevent stack overflow for massive binaries in c decoder
5
+ * Optimize strings in c decoder
6
+
7
+ == 1.1.0 / 2009-10-08
8
+ * Minor Improvements
9
+ * Implement Bignum encoding
10
+ * Fix tests on Erlang R13B
11
+
12
+ == 1.0.2 / 2009-06-03
13
+ * Bug Fixes
14
+ * Fix decoding of atoms [github.com/bwbuchanan]
15
+ * Work around Ruby's reluctance to convert the empty string to
16
+ a symbol [github.com/bwbuchanan]
17
+
18
+ == 1.0.1 / 2009-05-03
19
+ * Bug Fixes
20
+ * Fix premature null byte termination on binary decode
21
+
22
+ == 1.0.0 / 2009-04-29
23
+ * Backward Incompatible Changes
24
+ * Implicit array call for f.when(:echo, String) must now be called as
25
+ f.when([:echo, String]) to eliminate ambiguity
26
+ * Implicit array call for f.send!(:ok, "foo") must now be called as
27
+ f.send!([:ok, "foo"]) to eliminate ambiguity
28
+ * The receive loop now defaults to using file descriptors 3 and 3
29
+ instead of STDIN and STDOUT. This prevents inadvertent output
30
+ statements from silently corrupting the transfer protocol.
31
+ * Erlang atoms 'true' and 'false' are now converted into Ruby booleans
32
+ * Erlectricity::Decoder.read_any_from -> Erlectricity::Decoder.decode
33
+ * Major Enhancements
34
+ * Calling `rake` now runs tests (with and without compiled C extensions)
35
+ * Package management is now done by Jeweler
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Scott Fleckenstein and Tom Preston-Werner
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,130 @@
1
+ Erlectricity
2
+ ============
3
+
4
+ http://github.com/mojombo/erlectricity
5
+
6
+ By Scott Fleckenstein, Tom Preston-Werner
7
+
8
+ Development Status: Production/Stable
9
+
10
+
11
+ Description
12
+ -----------
13
+
14
+ Erlectricity allows a Ruby program to receive and respond to Erlang messages
15
+ sent over the Erlang binary protocol.
16
+
17
+
18
+ Install
19
+ -------
20
+
21
+ $ gem install erlectricity
22
+
23
+ -or-
24
+
25
+ $ gem install mojombo-erlectricity -s http://gems.github.com
26
+
27
+
28
+ The Simplest Example
29
+ --------------------
30
+
31
+ ### Ruby side (echo.rb)
32
+
33
+ require 'rubygems'
34
+ require 'erlectricity'
35
+
36
+ receive do |f|
37
+ f.when([:echo, String]) do |text|
38
+ f.send!([:result, "You said: #{text}"])
39
+ f.receive_loop
40
+ end
41
+ end
42
+
43
+ ### Erlang side (echo.erl)
44
+
45
+ -module(echo).
46
+ -export([test/0]).
47
+
48
+ test() ->
49
+ Cmd = "ruby echo.rb",
50
+ Port = open_port({spawn, Cmd}, [{packet, 4}, nouse_stdio, exit_status, binary]),
51
+ Payload = term_to_binary({echo, <<"hello world!">>}),
52
+ port_command(Port, Payload),
53
+ receive
54
+ {Port, {data, Data}} ->
55
+ {result, Text} = binary_to_term(Data),
56
+ io:format("~p~n", [Text])
57
+ end.
58
+
59
+
60
+ Data Type Conversions and Matching
61
+ ----------------------------------
62
+
63
+ % Port is the port opened via open_port({spawn, Cmd}, [{packet, 4}, ...])
64
+ % Message is the Erlang term to encode and send to the port
65
+ send(Port, Message) ->
66
+ port_command(Port, term_to_binary(Message)).
67
+
68
+ # Each triplet below represents:
69
+ # (line 1) the Erlang call
70
+ # (line 2) the Ruby matcher
71
+ # (line 3) the Ruby output
72
+
73
+ send(Port, test).
74
+ f.when(:test) { p :ok }
75
+ # :ok
76
+
77
+ send(Port, {atom, symbol}).
78
+ f.when([:atom, Symbol]) { |sym| p sym }
79
+ # :symbol
80
+
81
+ send(Port, {number, 1}).
82
+ f.when([:number, Fixnum]) { |num| p num }
83
+ # 1
84
+
85
+ send(Port, {string, <<"foo">>}).
86
+ f.when([:string, String]) { |str| p str }
87
+ # "foo"
88
+
89
+ send(Port, {array, [1,2,3]}).
90
+ f.when([:array, Array]) { |arr| p arr }
91
+ # [1, 2, 3]
92
+
93
+ send(Port, {array, [<<"abc">>, <<"def">>]}).
94
+ f.when([:array, Array]) { |arr| p arr }
95
+ # ["abc", "def"]
96
+
97
+ send(Port, {hash, [{key,val}]}).
98
+ f.when([:hash, Erl.hash]) { |hash| p hash }
99
+ # {:key=>:val}
100
+
101
+ send(Port, {object, {1,{2},3,<<"four">>}}).
102
+ f.when([:object, Any]) { |any| p any }
103
+ # [1, [2], 3, "four"]
104
+
105
+
106
+ Contribute
107
+ ----------
108
+
109
+ If you'd like to hack on Erlectricity, start by forking my repo on GitHub:
110
+
111
+ http://github.com/mojombo/erlectricity
112
+
113
+ To get all of the dependencies, install the gem first. The best way to get
114
+ your changes merged back into core is as follows:
115
+
116
+ 1. Clone down your fork
117
+ 1. Create a topic branch to contain your change
118
+ 1. Hack away
119
+ 1. Add tests and make sure everything still passes by running `rake`
120
+ 1. If you are adding new functionality, document it in the README.md
121
+ 1. Do not change the version number, I will do that on my end
122
+ 1. If necessary, rebase your commits into logical chunks, without errors
123
+ 1. Push the branch up to GitHub
124
+ 1. Send me (mojombo) a pull request for your branch
125
+
126
+
127
+ Copyright
128
+ ---------
129
+
130
+ Copyright (c) 2009 Scott Fleckenstein and Tom Preston-Werner. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,74 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "erlectricity"
8
+ gem.rubyforge_project = "erlectricity"
9
+ gem.summary = "A library to interface erlang and ruby through the erlang port system"
10
+ gem.email = "tom@mojombo.com"
11
+ gem.homepage = "http://github.com/mojombo/erlectricity"
12
+ gem.authors = ["Scott Fleckenstein", "Tom Preston-Werner"]
13
+ gem.require_paths = ["lib", "ext"]
14
+ gem.files.include("ext")
15
+ gem.extensions << 'ext/extconf.rb'
16
+
17
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
18
+ end
19
+ rescue LoadError
20
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
21
+ end
22
+
23
+ task :test do
24
+ require 'open3'
25
+ require 'fileutils'
26
+
27
+ puts "\nCleaning extension build files and running all specs in native ruby mode..."
28
+ `rm -f ext/*.bundle` && puts("rm -f ext/*.bundle")
29
+ `rm -f ext/*.o` && puts("rm -f ext/*.o")
30
+ Open3.popen3("ruby test/spec_suite.rb") do |stdin, stdout, stderr|
31
+ while !stdout.eof?
32
+ print stdout.read(1)
33
+ end
34
+ end
35
+
36
+ puts "\nRunning `make` to build extensions and rerunning decoder specs..."
37
+ Dir.chdir('ext') { `make` }
38
+ Open3.popen3("ruby test/decode_spec.rb") do |stdin, stdout, stderr|
39
+ while !stdout.eof?
40
+ print stdout.read(1)
41
+ end
42
+ end
43
+ end
44
+
45
+ begin
46
+ require 'rcov/rcovtask'
47
+ Rcov::RcovTask.new do |test|
48
+ test.libs << 'test'
49
+ test.pattern = 'test/**/*_test.rb'
50
+ test.verbose = true
51
+ end
52
+ rescue LoadError
53
+ task :rcov do
54
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
55
+ end
56
+ end
57
+
58
+
59
+ task :default => :test
60
+
61
+ require 'rake/rdoctask'
62
+ Rake::RDocTask.new do |rdoc|
63
+ if File.exist?('VERSION.yml')
64
+ config = YAML.load(File.read('VERSION.yml'))
65
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
66
+ else
67
+ version = ""
68
+ end
69
+
70
+ rdoc.rdoc_dir = 'rdoc'
71
+ rdoc.title = "erlectricity #{version}"
72
+ rdoc.rdoc_files.include('README*')
73
+ rdoc.rdoc_files.include('lib/**/*.rb')
74
+ end
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 2
3
+ :patch: 1
4
+ :major: 1
@@ -0,0 +1,21 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+
3
+ require 'erlectricity'
4
+ require 'benchmark'
5
+
6
+ data = [:ok, [:foo, :bar, [99, "bottles", "of", "beer", 3.14], [true, false]]]
7
+ bert = Erlectricity::Encoder.encode(data)
8
+
9
+ p bert
10
+
11
+ Benchmark.bm do|b|
12
+ b.report("Decoder") do
13
+ 100_000.times { Erl::Decoder.decode(bert) }
14
+ end
15
+ end
16
+
17
+ # user system total real
18
+ # C Decoder 0.400000 0.000000 0.400000 ( 0.425373)
19
+ # Ruby Decoder 30.250000 0.220000 30.470000 ( 32.140890)
20
+ #
21
+ # C decoder is 75.56x faster than Ruby decoder on this data
@@ -0,0 +1,105 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{erlectricity-funbox}
8
+ s.version = "1.1.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Scott Fleckenstein", "Tom Preston-Werner"]
12
+ s.date = %q{2009-10-28}
13
+ s.email = %q{tom@mojombo.com}
14
+ s.extensions = ["ext/extconf.rb"]
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "History.txt",
22
+ "LICENSE",
23
+ "README.md",
24
+ "Rakefile",
25
+ "VERSION.yml",
26
+ "benchmarks/bench.rb",
27
+ "erlectricity.gemspec",
28
+ "examples/echo/README.md",
29
+ "examples/echo/echo.erl",
30
+ "examples/echo/echo.rb",
31
+ "examples/gruff/gruff.erl",
32
+ "examples/gruff/gruff_provider.rb",
33
+ "examples/gruff/gruff_run.sh",
34
+ "examples/gruff/stat_run.sh",
35
+ "examples/gruff/stat_writer.erl",
36
+ "examples/simple/README.md",
37
+ "examples/simple/rerl.rb",
38
+ "examples/simple/rerl.sh",
39
+ "examples/tinderl/README.md",
40
+ "examples/tinderl/tinderl.erl",
41
+ "examples/tinderl/tinderl.rb",
42
+ "ext/decoder.c",
43
+ "ext/extconf.rb",
44
+ "lib/erlectricity.rb",
45
+ "lib/erlectricity/condition.rb",
46
+ "lib/erlectricity/conditions/boolean.rb",
47
+ "lib/erlectricity/conditions/hash.rb",
48
+ "lib/erlectricity/conditions/static.rb",
49
+ "lib/erlectricity/conditions/type.rb",
50
+ "lib/erlectricity/constants.rb",
51
+ "lib/erlectricity/decoder.rb",
52
+ "lib/erlectricity/encoder.rb",
53
+ "lib/erlectricity/errors/decode_error.rb",
54
+ "lib/erlectricity/errors/encode_error.rb",
55
+ "lib/erlectricity/errors/erlectricity_error.rb",
56
+ "lib/erlectricity/matcher.rb",
57
+ "lib/erlectricity/port.rb",
58
+ "lib/erlectricity/receiver.rb",
59
+ "lib/erlectricity/types/function.rb",
60
+ "lib/erlectricity/types/list.rb",
61
+ "lib/erlectricity/types/new_function.rb",
62
+ "lib/erlectricity/types/new_reference.rb",
63
+ "lib/erlectricity/types/pid.rb",
64
+ "lib/erlectricity/types/reference.rb",
65
+ "lib/erlectricity/version.rb",
66
+ "test/condition_spec.rb",
67
+ "test/decode_spec.rb",
68
+ "test/encode_spec.rb",
69
+ "test/matcher_spec.rb",
70
+ "test/port_spec.rb",
71
+ "test/receiver_spec.rb",
72
+ "test/spec_suite.rb",
73
+ "test/test_helper.rb"
74
+ ]
75
+ s.homepage = %q{http://github.com/mojombo/erlectricity}
76
+ s.rdoc_options = ["--charset=UTF-8"]
77
+ s.require_paths = ["lib", "ext"]
78
+ s.rubyforge_project = %q{erlectricity}
79
+ s.rubygems_version = %q{1.3.5}
80
+ s.summary = %q{A library to interface erlang and ruby through the erlang port system}
81
+ s.test_files = [
82
+ "test/condition_spec.rb",
83
+ "test/decode_spec.rb",
84
+ "test/encode_spec.rb",
85
+ "test/matcher_spec.rb",
86
+ "test/port_spec.rb",
87
+ "test/receiver_spec.rb",
88
+ "test/spec_suite.rb",
89
+ "test/test_helper.rb",
90
+ "examples/echo/echo.rb",
91
+ "examples/gruff/gruff_provider.rb",
92
+ "examples/simple/rerl.rb",
93
+ "examples/tinderl/tinderl.rb"
94
+ ]
95
+
96
+ if s.respond_to? :specification_version then
97
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
98
+ s.specification_version = 3
99
+
100
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
101
+ else
102
+ end
103
+ else
104
+ end
105
+ end
@@ -0,0 +1,12 @@
1
+ This is a simple echo server example showing off basic Erlectricity usage.
2
+
3
+ $ cd examples/echo
4
+ $ erl
5
+ Erlang (BEAM) emulator version 5.6.4 [source] [smp:2] [async-threads:0] [kernel-poll:false]
6
+
7
+ Eshell V5.6.4 (abort with ^G)
8
+ 1> c(echo).
9
+ {ok,echo}
10
+ 2> echo:test().
11
+ <<"You said: hello world!">>
12
+ ok
@@ -0,0 +1,13 @@
1
+ -module(echo).
2
+ -export([test/0]).
3
+
4
+ test() ->
5
+ Cmd = "ruby echo.rb",
6
+ Port = open_port({spawn, Cmd}, [{packet, 4}, nouse_stdio, exit_status, binary]),
7
+ Payload = term_to_binary({echo, <<"hello world!">>}),
8
+ port_command(Port, Payload),
9
+ receive
10
+ {Port, {data, Data}} ->
11
+ {result, Text} = binary_to_term(Data),
12
+ io:format("~p~n", [Text])
13
+ end.