golden 0.5.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/exe/golden +76 -0
- data/lib/crucible.rb +133 -0
- data/lib/golden.rb +31 -0
- metadata +118 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: cb7d6213bb1ec1308135221959c65ebe9e60d3451867ad900b7b59772ce30108
|
4
|
+
data.tar.gz: 826478ec45eff91699476be02d45b1319683c227faa60aa39c8a0ca68ecfc1f2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b158e3292725f4bd05f8e55691aebff8110966e4b7806954d012caeae8a0366fd5a12c2ea8b9faefbf892c1047e59d5195bee7f41dc244606743976074157153
|
7
|
+
data.tar.gz: 5568c2e5e7c084e2e996bf3a2c70780fff6e4cd72278174dd5106217f89631f98db185d5a7d55fdf64d50583a444a2b6af32bc3bcf2aa5b540c2312c60fcb0c7
|
data/exe/golden
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "thor"
|
3
|
+
require 'open3'
|
4
|
+
require 'json'
|
5
|
+
require_relative("../lib/crucible.rb")
|
6
|
+
module Golden
|
7
|
+
class Cli < Thor
|
8
|
+
desc "build [fileName]", "build library named [fileName]"
|
9
|
+
method_option :verbose, :aliases => "-v", :desc => "Build with verbose logging"
|
10
|
+
def build(fileName)
|
11
|
+
self.load(options)
|
12
|
+
@crucible.build(fileName,Dir.pwd)
|
13
|
+
self.save
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "clear ", "forget all known libraries"
|
17
|
+
method_option :force, :aliases => "-f", :desc => "Clear without confirmation."
|
18
|
+
def clear
|
19
|
+
self.load(options)
|
20
|
+
if(!options[:force])
|
21
|
+
puts "Golden will forget all known libraries (#{@crucible.packages.keys.length}). Do you want to proceed? (Yes/No)"
|
22
|
+
response = STDIN.gets.chomp
|
23
|
+
if(response == "Yes")
|
24
|
+
@crucible.clear
|
25
|
+
puts "Golden library cache cleared."
|
26
|
+
else
|
27
|
+
puts "clear cancelled. To clear Golden libraries, run 'golden clear' again and respond with 'Yes' (case sensitive)."
|
28
|
+
end
|
29
|
+
else
|
30
|
+
@crucible.clear
|
31
|
+
puts "Golden library cache cleared."
|
32
|
+
end
|
33
|
+
self.save
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "list ", "list all libraries built with golden"
|
37
|
+
method_option :verbose, :aliases => "-v", :desc => "List with package detail"
|
38
|
+
def list
|
39
|
+
self.load(options)
|
40
|
+
if(!@crucible.packages || @crucible.packages.keys.length == 0)
|
41
|
+
puts "No libraries have yet been built. Navigate to a go project and build one using 'golden build (LibraryName).'"
|
42
|
+
else
|
43
|
+
puts "Golden has access to the following libraries:"
|
44
|
+
if(@crucible.verbose?)
|
45
|
+
@crucible.packages.each do |name, location|
|
46
|
+
puts "#{name}\t#{location}"
|
47
|
+
end
|
48
|
+
else
|
49
|
+
puts @crucible.packages.keys
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
desc "install [fileName]", "install a library built with golden to the current ruby project"
|
55
|
+
method_option :verbose, :aliases => "-v", :desc => "Install with verbose logging"
|
56
|
+
def install(packageName)
|
57
|
+
self.load(options)
|
58
|
+
if(!!@crucible.packages[packageName])
|
59
|
+
puts "installing #{packageName}."
|
60
|
+
@crucible.install(packageName)
|
61
|
+
else
|
62
|
+
puts "No libraries named #{packageName} are yet known to golden. You can list all known libraries with 'golden list'"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
protected
|
67
|
+
def load(options=nil)
|
68
|
+
@crucible = Golden::Crucible.new(options)
|
69
|
+
end
|
70
|
+
def save
|
71
|
+
@crucible.save
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
Golden::Cli.start(ARGV)
|
data/lib/crucible.rb
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
|
2
|
+
module Golden
|
3
|
+
class Crucible
|
4
|
+
attr_accessor :packages, :pkgLogFile
|
5
|
+
def initialize(options=nil)
|
6
|
+
@pkgLogFile = File.expand_path("~")+"/.golden_packages.json" # Persistent package log
|
7
|
+
# @pkgLogFile = File.expand_path(File.dirname(__FILE__)+"/../packages.json") # Gemset specific package log
|
8
|
+
# puts "opened package list at #{@pkgLogFile}"
|
9
|
+
@options = options
|
10
|
+
if(!File.exist?(@pkgLogFile))
|
11
|
+
@packages = {}
|
12
|
+
self.save()
|
13
|
+
else
|
14
|
+
@packages = JSON.parse(File.open(@pkgLogFile).read)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def build(fileName,dir)
|
19
|
+
libName,extension = fileName.split('.')
|
20
|
+
if(!extension)
|
21
|
+
fileName = "#{libName}.go"
|
22
|
+
end
|
23
|
+
golden_json = "#{dir}/golden.json"
|
24
|
+
if(File.exist?(golden_json))
|
25
|
+
golden_data = JSON.parse(File.open(golden_json).read)
|
26
|
+
else
|
27
|
+
golden_data = {}
|
28
|
+
end
|
29
|
+
path = dir+"/"+fileName
|
30
|
+
outfile = "#{libName}.so"
|
31
|
+
outpath = dir+"/"+libName
|
32
|
+
goVersion = `go version`
|
33
|
+
if(!!goVersion)
|
34
|
+
if(verbose?)
|
35
|
+
puts "detected #{goVersion}"
|
36
|
+
end
|
37
|
+
# if(File.exist?("#{path}/go.mod")) # Module build procedure
|
38
|
+
# puts "building module at #{path}"
|
39
|
+
# puts "building standard lib"
|
40
|
+
# system("go install -buildmode=shared -linkshared std")
|
41
|
+
# puts "installing dependencies"
|
42
|
+
# deps = system("go mod vendor")
|
43
|
+
# if(!!deps)
|
44
|
+
# puts "linking shared lib for module"
|
45
|
+
# lnk = `go install -buildmode=shared -linkshared #{infile}`
|
46
|
+
# puts lnk
|
47
|
+
# puts "building shared lib for module"
|
48
|
+
# bld = `go build -linkshared -o #{outfile}`
|
49
|
+
# puts bld
|
50
|
+
# system("go build -buildmode=c-shared -o #{outfile} #{fileName}")
|
51
|
+
# end
|
52
|
+
# else
|
53
|
+
puts "building #{fileName} to shared library #{outfile}"
|
54
|
+
system("go build -buildmode=c-shared -o #{outfile} #{fileName}")
|
55
|
+
# end
|
56
|
+
else
|
57
|
+
puts "go not found."
|
58
|
+
end
|
59
|
+
file = File.open(path)
|
60
|
+
source_code = file.read
|
61
|
+
exports = source_code.scan(/\/\/\s?export(?<function>.+)/).flatten
|
62
|
+
if(verbose?)
|
63
|
+
puts "#{fileName} exports the following methods:"
|
64
|
+
puts exports
|
65
|
+
end
|
66
|
+
|
67
|
+
golden_data[libName] = {}
|
68
|
+
exports.each do |e|
|
69
|
+
function_name = e.chomp.lstrip
|
70
|
+
declaration_regex = Regexp.new("func #{function_name}\s?\((?<args>.*)\) (?<returns>.*) {")
|
71
|
+
export_data = {}
|
72
|
+
export_data[:args] = {}
|
73
|
+
args = source_code.scan(declaration_regex).flatten[0]
|
74
|
+
args = args[1,args.length-2]
|
75
|
+
args = args.split(',')
|
76
|
+
args.each do |arg|
|
77
|
+
name, type = arg.split(" ")
|
78
|
+
export_data[:args][name] = type
|
79
|
+
end
|
80
|
+
export_data[:returns] = source_code.scan(declaration_regex).flatten[1]
|
81
|
+
# require "pry"
|
82
|
+
# binding.pry
|
83
|
+
golden_data[libName][function_name] = export_data
|
84
|
+
end
|
85
|
+
# require "pry"
|
86
|
+
# binding.pry
|
87
|
+
if(verbose?)
|
88
|
+
puts "writing library export info to #{golden_json}"
|
89
|
+
end
|
90
|
+
File.open(golden_json,"w") do |f|
|
91
|
+
f.write(JSON.pretty_generate(golden_data))
|
92
|
+
end
|
93
|
+
@packages[libName] = dir
|
94
|
+
end
|
95
|
+
|
96
|
+
def install(packageName)
|
97
|
+
cwd = Dir.pwd
|
98
|
+
extDestination = File.expand_path(cwd+"/bin")
|
99
|
+
if(!!@packages[packageName])
|
100
|
+
if(!File.exist? extDestination)
|
101
|
+
Dir.mkdir extDestination
|
102
|
+
end
|
103
|
+
|
104
|
+
if(File.exist?(cwd+"/golden.json"))
|
105
|
+
golden_json = JSON.parse(File.open(cwd+"/golden.json").read)
|
106
|
+
new_package = JSON.parse(File.open(@packages[packageName]+"/golden.json").read)
|
107
|
+
golden_json = golden_json.merge(new_package)
|
108
|
+
File.open(cwd+"/golden.json","w") do |f|
|
109
|
+
f.write(JSON.pretty_generate(golden_json))
|
110
|
+
end
|
111
|
+
else
|
112
|
+
FileUtils.cp(@packages[packageName]+"/golden.json", cwd+"/golden.json")
|
113
|
+
end
|
114
|
+
FileUtils.cp(@packages[packageName]+"/#{packageName}.so", extDestination+"/#{packageName}.so")
|
115
|
+
else
|
116
|
+
throw "No such package (#{packageName})."
|
117
|
+
end
|
118
|
+
end
|
119
|
+
def clear
|
120
|
+
@packages = {}
|
121
|
+
save
|
122
|
+
end
|
123
|
+
def verbose?
|
124
|
+
return (!!@options && !!@options[:verbose])
|
125
|
+
end
|
126
|
+
def save
|
127
|
+
# @pkgLogFile = File.expand_path(File.dirname(__FILE__)+"/../packages.json") # Installation specific package log
|
128
|
+
File.open(@pkgLogFile,"w") do |f|
|
129
|
+
f.write(JSON.pretty_generate(@packages))
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
data/lib/golden.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
require 'json'
|
3
|
+
require "crucible"
|
4
|
+
module Golden
|
5
|
+
def self.require(library)
|
6
|
+
golden_data = self.load
|
7
|
+
return self::Library.new(File.expand_path("./bin/#{library}.so"),golden_data[library])
|
8
|
+
end
|
9
|
+
def self.load
|
10
|
+
golden_json = File.expand_path(Dir.pwd()+"/golden.json")
|
11
|
+
if(!!File.exist?(golden_json))
|
12
|
+
golden_data = JSON.parse(File.open(golden_json).read)
|
13
|
+
else
|
14
|
+
throw "golden.json not found."
|
15
|
+
end
|
16
|
+
return golden_data
|
17
|
+
end
|
18
|
+
module Library
|
19
|
+
extend FFI::Library
|
20
|
+
def self.new(library_file, exports)
|
21
|
+
@exports = exports
|
22
|
+
@library_file = library_file
|
23
|
+
ffi_lib @library_file
|
24
|
+
@exports.each do |func, data|
|
25
|
+
# puts "attach_function #{func}, #{data["args"]}, #{data["returns"]}"
|
26
|
+
attach_function func, data["args"].values.map(&:to_sym), data["returns"].to_sym
|
27
|
+
end
|
28
|
+
return self
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: golden
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Greg Mikeska
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-02-23 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ffi
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.14'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.14'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pry
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.14.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.14.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.13'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.13'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 12.3.3
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 12.3.3
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
description: Golden is a development tool that makes it easier to wrap Go libraries
|
84
|
+
for use in Ruby.
|
85
|
+
email:
|
86
|
+
- gmikeska07@gmail.com
|
87
|
+
executables:
|
88
|
+
- golden
|
89
|
+
extensions: []
|
90
|
+
extra_rdoc_files: []
|
91
|
+
files:
|
92
|
+
- exe/golden
|
93
|
+
- lib/crucible.rb
|
94
|
+
- lib/golden.rb
|
95
|
+
homepage: https://github.com/gmikeska/golden
|
96
|
+
licenses: []
|
97
|
+
metadata: {}
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options: []
|
100
|
+
require_paths:
|
101
|
+
- lib
|
102
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubygems_version: 3.0.3
|
114
|
+
signing_key:
|
115
|
+
specification_version: 4
|
116
|
+
summary: Golden is a development tool that makes it easier to wrap Go libraries for
|
117
|
+
use in Ruby.
|
118
|
+
test_files: []
|