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 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
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
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,3 @@
1
+ module Malachite
2
+ class ConfigError < StandardError; end
3
+ 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
@@ -0,0 +1,3 @@
1
+ module Malachite
2
+ VERSION = '0.0.1'
3
+ 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: []