malachite 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +2 -0
- data/Rakefile +1 -0
- data/lib/malachite/client.rb +31 -0
- data/lib/malachite/compiler.rb +49 -0
- data/lib/malachite/errors.rb +3 -0
- data/lib/malachite/rails.rb +30 -0
- data/lib/malachite/ruby.rb +16 -0
- data/lib/malachite/version.rb +3 -0
- data/lib/malachite.rb +25 -0
- metadata +95 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9c81db104c04d28b06832166c2402793f552a433
|
4
|
+
data.tar.gz: 662092aba1aed2ef10960947908bd56ed5a26e79
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a84ee6b7cf5811fa101781f9358cf6d6606569ab6b7af7fe296fac6ca37d859d1c746cfa94e2dc8263182b44bd097893f7fdb5a2696ed60c027f03246e616d01
|
7
|
+
data.tar.gz: 3bc5bc648382e248c9d3ebb159338157089ec5823f6262fe9b6e124ac8442f5f60aa1a323371780b6d24f04fee36c836bb92dcd48f5cf791a1cc6860dd57f30d
|
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'fiddle'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
module Malachite
|
5
|
+
class Client
|
6
|
+
def initialize(file_path)
|
7
|
+
@file_path = file_path
|
8
|
+
@name = library_name
|
9
|
+
@func = Fiddle::Function.new(open_dlib['call'], [Fiddle::TYPE_VOIDP], Fiddle::TYPE_VOIDP)
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(args)
|
13
|
+
ptr = @func.call(Malachite.dump_json(args))
|
14
|
+
Malachite.load_json(ptr.to_s)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def open_dlib
|
20
|
+
Fiddle.dlopen(shared_object_path)
|
21
|
+
end
|
22
|
+
|
23
|
+
def library_name
|
24
|
+
File.basename(@file_path, '.go')
|
25
|
+
end
|
26
|
+
|
27
|
+
def shared_object_path
|
28
|
+
Malachite::Compiler.new(@file_path, @name).compile
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Malachite
|
2
|
+
class Compiler
|
3
|
+
def initialize(file_path, name)
|
4
|
+
@file_path = file_path
|
5
|
+
@go_file = path_to_go_file
|
6
|
+
@name = name
|
7
|
+
end
|
8
|
+
|
9
|
+
def compile
|
10
|
+
return path_to_tmp_file if File.exist?(path_to_tmp_file)
|
11
|
+
compile!
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def compile!
|
17
|
+
copy_boilerplate_to_tmp
|
18
|
+
unless system('go', 'build', '-buildmode=c-shared', '-o', path_to_tmp_file.to_s, @go_file.to_s)
|
19
|
+
fail Malachite::ConfigError, "Unable to Build Shared Library for #{@file_path}"
|
20
|
+
end
|
21
|
+
path_to_tmp_file
|
22
|
+
end
|
23
|
+
|
24
|
+
def copy_boilerplate_to_tmp
|
25
|
+
File.open(@go_file, 'w') do |file|
|
26
|
+
file.puts "package main\n"
|
27
|
+
file.puts "import \"encoding/json\"\n"
|
28
|
+
file.puts "import \"C\"\n"
|
29
|
+
file.puts munged_source
|
30
|
+
file.puts munged_boilerplate
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def munged_boilerplate
|
35
|
+
boiler = File.read(File.expand_path('../boilerplate.go.tmpl', __FILE__))
|
36
|
+
boiler.gsub(/XXXXXX/, "#{handler_type(munged_source)}{}")
|
37
|
+
end
|
38
|
+
|
39
|
+
def munged_source
|
40
|
+
source_go = File.read(@file_path)
|
41
|
+
source_go.gsub(/package main/, '')
|
42
|
+
end
|
43
|
+
|
44
|
+
def handler_type(handler_code)
|
45
|
+
match = /^func handler\(\w+ (.*?)\)/.match(handler_code)
|
46
|
+
match[1]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Malachite
|
2
|
+
class Compiler
|
3
|
+
def path_to_tmp_file
|
4
|
+
Rails.root.join('tmp', "#{@name}.so").to_s
|
5
|
+
end
|
6
|
+
|
7
|
+
def path_to_go_file
|
8
|
+
Rails.root.join('tmp', "#{@name}.go").to_s
|
9
|
+
end
|
10
|
+
end
|
11
|
+
class Client
|
12
|
+
def self.method_missing(name, args)
|
13
|
+
path_to_source = Rails.root.join('app', 'go', "#{name}.go")
|
14
|
+
new(path_to_source).call(args)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
class MalachiteRailtie < Rails::Railtie
|
18
|
+
initializer 'malachite.configure_rails_initialization' do
|
19
|
+
Dir.glob(Rails.root.join('tmp', '*.so')).each do |file|
|
20
|
+
File.delete(file)
|
21
|
+
end
|
22
|
+
Dir.glob(Rails.root.join('tmp', '*.go')).each do |file|
|
23
|
+
File.delete(file)
|
24
|
+
end
|
25
|
+
Dir.glob(Rails.root.join('tmp', '*.h')).each do |file|
|
26
|
+
File.delete(file)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Malachite
|
2
|
+
class Compiler
|
3
|
+
def path_to_tmp_file
|
4
|
+
Tempfile.new([@name, 'so']).path
|
5
|
+
end
|
6
|
+
|
7
|
+
def path_to_go_file
|
8
|
+
Tempfile.new([@name, 'go']).path
|
9
|
+
end
|
10
|
+
end
|
11
|
+
class Client
|
12
|
+
def self.method_missing(name, args)
|
13
|
+
new("#{name}.go").call(args)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/malachite.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'malachite/version'
|
2
|
+
fail "Malachite #{Malachite::VERSION} does not support Ruby 1.9" if RUBY_VERSION < '2.0.0'
|
3
|
+
|
4
|
+
require 'json'
|
5
|
+
require 'fiddle'
|
6
|
+
|
7
|
+
require 'malachite/errors'
|
8
|
+
require 'malachite/client'
|
9
|
+
require 'malachite/compiler'
|
10
|
+
|
11
|
+
module Malachite
|
12
|
+
def self.load_json(string)
|
13
|
+
JSON.load(string)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.dump_json(object)
|
17
|
+
JSON.dump(object)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
if defined?(::Rails::Engine)
|
22
|
+
require 'malachite/rails'
|
23
|
+
else
|
24
|
+
require 'malachite/ruby'
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: malachite
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Zack Hubert
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.9'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.9'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10.0'
|
55
|
+
description: A RubyGem which enables calling Go code from Ruby.
|
56
|
+
email:
|
57
|
+
- zhubert@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- Gemfile
|
63
|
+
- Rakefile
|
64
|
+
- lib/malachite.rb
|
65
|
+
- lib/malachite/client.rb
|
66
|
+
- lib/malachite/compiler.rb
|
67
|
+
- lib/malachite/errors.rb
|
68
|
+
- lib/malachite/rails.rb
|
69
|
+
- lib/malachite/ruby.rb
|
70
|
+
- lib/malachite/version.rb
|
71
|
+
homepage: http://www.zhubert.com
|
72
|
+
licenses:
|
73
|
+
- MIT
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 2.4.5.1
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: A RubyGem which enables calling Go code from Ruby.
|
95
|
+
test_files: []
|