yamlscript 0.0.16 → 0.1.34
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +1 -0
- data/Makefile +25 -0
- data/Rakefile +10 -1
- data/ReadMe.md +140 -0
- data/lib/yamlscript/version.rb +2 -2
- data/lib/yamlscript.rb +105 -4
- data/yamlscript.gemspec +9 -10
- metadata +21 -6
- data/README.md +0 -35
- data/bin/console +0 -15
- data/bin/setup +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2591c91f2c28552fedf3d3eed747049e3776b835b0761d81078b99bfb3539be1
|
4
|
+
data.tar.gz: f2484037d32174a29ecc9e01be62cbf2f3f2fa1c0485e8d87b5c64dbab9ec15c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c4d3a6d4da4674749869cc821eb5eeb0c9feca1b31dcd1a419d9ea41538b28232a852254e85b1ae3662c75b2fd748070fa2f74171aeaf4eb0ce13fbfbb3a982
|
7
|
+
data.tar.gz: c99ae20a38f1e3090371dee340331b00bfbd011896b42c08b03be8d26960fd17962e6a9d4e251a842e269a3454349af95faf0c7cf57fcf52817c6c86e4e06a05
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Makefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
include ../common/base.mk
|
2
|
+
include $(COMMON)/binding.mk
|
3
|
+
|
4
|
+
RUBY := $(shell command -v bundle)
|
5
|
+
|
6
|
+
RAKE_CMDS := \
|
7
|
+
build \
|
8
|
+
clean \
|
9
|
+
release \
|
10
|
+
test \
|
11
|
+
|
12
|
+
#------------------------------------------------------------------------------
|
13
|
+
|
14
|
+
ifdef RUBY
|
15
|
+
update:
|
16
|
+
bundle install
|
17
|
+
|
18
|
+
$(RAKE_CMDS)::
|
19
|
+
bundle exec rake $@
|
20
|
+
|
21
|
+
endif
|
22
|
+
|
23
|
+
clean::
|
24
|
+
$(RM) Gemfile.lock .rake_tasks*
|
25
|
+
$(RM) -r pkg
|
data/Rakefile
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "bundler/gem_tasks"
|
4
|
-
|
4
|
+
require "minitest/test_task"
|
5
|
+
|
6
|
+
Minitest::TestTask.create(:test) do |t|
|
7
|
+
t.libs << "test"
|
8
|
+
t.libs << "lib"
|
9
|
+
t.warning = false
|
10
|
+
t.test_globs = ["test/**/*_test.rb"]
|
11
|
+
end
|
12
|
+
|
13
|
+
task :default => :test
|
data/ReadMe.md
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
YAMLScript
|
2
|
+
==========
|
3
|
+
|
4
|
+
Program in YAML
|
5
|
+
|
6
|
+
|
7
|
+
## Synopsis
|
8
|
+
|
9
|
+
```yaml
|
10
|
+
#!/usr/bin/env ys-0
|
11
|
+
|
12
|
+
defn main(name):
|
13
|
+
say: "Hello, $name!"
|
14
|
+
```
|
15
|
+
|
16
|
+
|
17
|
+
## Description
|
18
|
+
|
19
|
+
YAMLScript is a functional programming language with a stylized YAML syntax.
|
20
|
+
|
21
|
+
YAMLScript can be used for:
|
22
|
+
|
23
|
+
* Writing new programs and applications
|
24
|
+
* Run with `ys file.ys`
|
25
|
+
* Or compile to binary executable with `ys -C file.ys`
|
26
|
+
* Enhancing ordinary YAML files with new functional magics
|
27
|
+
* Import parts of other YAML files to any node
|
28
|
+
* String interpolation including function calls
|
29
|
+
* Any other functionality you can dream up!
|
30
|
+
* Writing reusable shared libraries
|
31
|
+
* High level code instead of C
|
32
|
+
* Bindable to almost any programming language
|
33
|
+
|
34
|
+
YAMLScript should be a drop-in replacement for your YAML loader!
|
35
|
+
|
36
|
+
Most existing YAML files are already valid YAMLScript files.
|
37
|
+
This means that YAMLScript works as a normal YAML loader, but can also evaluate
|
38
|
+
functional expressions if asked to.
|
39
|
+
|
40
|
+
Under the hood, YAMLScript code compiles to the Clojure programming language.
|
41
|
+
This makes YAMLScript a complete functional programming language right out of
|
42
|
+
the box.
|
43
|
+
|
44
|
+
Even though YAMLScript compiles to Clojure, and Clojure compiles to Java, there
|
45
|
+
is no dependency on Java or the JVM.
|
46
|
+
YAMLScript is compiled to a native shared library (`libyamlscript.so`) that can
|
47
|
+
be used by any programming language that can load shared libraries.
|
48
|
+
|
49
|
+
To see the Clojure code that YAMLScript compiles to, you can use the YAMLScript
|
50
|
+
command line utility, `ys`, to run:
|
51
|
+
|
52
|
+
```text
|
53
|
+
$ ys --compile file.ys
|
54
|
+
```
|
55
|
+
|
56
|
+
|
57
|
+
## Ruby Usage
|
58
|
+
|
59
|
+
File `prog.rb`:
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
require 'yamlscript'
|
63
|
+
input = IO.read('file.ys')
|
64
|
+
ys = YAMLScript.new
|
65
|
+
data = ys.load(input)
|
66
|
+
puts data
|
67
|
+
```
|
68
|
+
|
69
|
+
File `file.ys`:
|
70
|
+
|
71
|
+
```yaml
|
72
|
+
!yamlscript/v0
|
73
|
+
|
74
|
+
name =: "World"
|
75
|
+
|
76
|
+
=>::
|
77
|
+
foo: [1, 2, ! inc(41)]
|
78
|
+
bar:: load("other.yaml")
|
79
|
+
baz:: "Hello, $name!"
|
80
|
+
```
|
81
|
+
|
82
|
+
File `other.yaml`:
|
83
|
+
|
84
|
+
```yaml
|
85
|
+
oh: Hello
|
86
|
+
```
|
87
|
+
|
88
|
+
Run:
|
89
|
+
|
90
|
+
```text
|
91
|
+
$ ruby prog.rb
|
92
|
+
{"foo"=>[1, 2, 42], "bar"=>{"oh"=>"Hello"}, "baz"=>"Hello, World!"}
|
93
|
+
```
|
94
|
+
|
95
|
+
|
96
|
+
## Installation
|
97
|
+
|
98
|
+
You can install this module like any other Ruby module:
|
99
|
+
|
100
|
+
```bash
|
101
|
+
$ gem install yamlscript
|
102
|
+
```
|
103
|
+
|
104
|
+
but you will need to have a system install of `libyamlscript.so`.
|
105
|
+
|
106
|
+
One simple way to do that is with:
|
107
|
+
|
108
|
+
```bash
|
109
|
+
$ curl https://yamlscript.org/install | sudo PREFIX=/usr/local bash
|
110
|
+
```
|
111
|
+
|
112
|
+
> Note: The above command will install the latest version of the YAMLScript
|
113
|
+
command line utility, `ys`, and the shared library, `libyamlscript.so`, into
|
114
|
+
`/usr/local/bin` and `/usr/local/lib` respectively.
|
115
|
+
|
116
|
+
See https://github.com/yaml/yamlscript?#installing-yamlscript for more info.
|
117
|
+
|
118
|
+
|
119
|
+
## See Also
|
120
|
+
|
121
|
+
* [The YAMLScript Web Site](https://yamlscript.org)
|
122
|
+
* [The YAMLScript Blog](https://yamlscript.org/blog)
|
123
|
+
* [The YAMLScript Source Code](https://github.com/yaml/yamlscript)
|
124
|
+
* [YAML](https://yaml.org)
|
125
|
+
* [Clojure](https://clojure.org)
|
126
|
+
|
127
|
+
|
128
|
+
## Authors
|
129
|
+
|
130
|
+
* [Ingy döt Net](https://github.com/ingydotnet)
|
131
|
+
* [Delon R.Newman](https://github.com/delonnewman)
|
132
|
+
|
133
|
+
|
134
|
+
## License & Copyright
|
135
|
+
|
136
|
+
Copyright 2022-2024 Ingy döt Net <ingy@ingy.net>
|
137
|
+
|
138
|
+
This project is licensed under the terms of the `MIT` license.
|
139
|
+
See [LICENSE](https://github.com/yaml/yamlscript/blob/main/License) for
|
140
|
+
more details.
|
data/lib/yamlscript/version.rb
CHANGED
data/lib/yamlscript.rb
CHANGED
@@ -1,8 +1,109 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
# Copyright 2023-2024 Ingy dot Net
|
4
|
+
# This code is licensed under MIT license (See License for details)
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
6
|
+
require 'fiddle'
|
7
|
+
require 'fiddle/import'
|
8
|
+
require 'json'
|
9
|
+
|
10
|
+
require_relative 'yamlscript/version'
|
11
|
+
|
12
|
+
# Ruby binding for the libyamlscript shared library.
|
13
|
+
class YAMLScript
|
14
|
+
Error = Class.new(StandardError)
|
15
|
+
|
16
|
+
# TODO: This value is automatically updated by 'make bump'.
|
17
|
+
# The version number is used to find the correct shared library file.
|
18
|
+
# We currently only support binding to an exact version of libyamlscript.
|
19
|
+
YAMLSCRIPT_VERSION = '0.1.34'
|
20
|
+
|
21
|
+
# A low-level interface to the native library
|
22
|
+
module LibYAMLScript
|
23
|
+
extend Fiddle::Importer
|
24
|
+
|
25
|
+
def self.extension
|
26
|
+
case RUBY_PLATFORM
|
27
|
+
when /darwin/
|
28
|
+
'dylib'
|
29
|
+
when /linux/
|
30
|
+
'so'
|
31
|
+
else
|
32
|
+
raise Error, "Unsupported platform #{RUBY_PLATFORM} for yamlscript."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.filename
|
37
|
+
"libyamlscript.#{extension}.#{YAMLSCRIPT_VERSION}"
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns an array of library paths extracted from the LD_LIBRARY_PATH
|
41
|
+
# environment variable.
|
42
|
+
# If the environment variable is not set will return an array with
|
43
|
+
# `/usr/local/lib` only.
|
44
|
+
def self.ld_library_paths
|
45
|
+
env_value = ENV.fetch('LD_LIBRARY_PATH', '')
|
46
|
+
paths = env_value.split(':')
|
47
|
+
paths << '/usr/local/lib'
|
48
|
+
end
|
49
|
+
|
50
|
+
# Find the libyamlscript shared library file path
|
51
|
+
def self.path
|
52
|
+
name = filename
|
53
|
+
path = ld_library_paths.map {
|
54
|
+
|dir| File.join(dir, name) }.detect { |file| File.exist?(file)
|
55
|
+
}
|
56
|
+
|
57
|
+
raise Error, "Shared library file `#{name}` not found" unless path
|
58
|
+
|
59
|
+
path
|
60
|
+
end
|
61
|
+
|
62
|
+
dlload path
|
63
|
+
|
64
|
+
extern \
|
65
|
+
'int graal_create_isolate(void* params, void** isolate, void** thread)'
|
66
|
+
extern 'int graal_tear_down_isolate(void* thread)'
|
67
|
+
extern 'char* load_ys_to_json(void* thread, char* yamlscript)'
|
68
|
+
end
|
69
|
+
|
70
|
+
# Interface with the libyamlscript shared library.
|
71
|
+
#
|
72
|
+
# @example
|
73
|
+
# require 'yamlscript'
|
74
|
+
#
|
75
|
+
# YAMLScript.load(IO.read('file.ys'))
|
76
|
+
def self.load(ys_code, **options)
|
77
|
+
new(**options).load(ys_code)
|
78
|
+
end
|
79
|
+
|
80
|
+
attr_reader :options, :error
|
81
|
+
|
82
|
+
def initialize(**options)
|
83
|
+
# config not used yet
|
84
|
+
@options = options
|
85
|
+
|
86
|
+
# Create a new GraalVM isolate for life of the YAMLScript instance
|
87
|
+
@isolate = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
|
88
|
+
@error = nil
|
89
|
+
end
|
90
|
+
|
91
|
+
# Compile and eval a YAMLScript string and return the result
|
92
|
+
def load(ys_code)
|
93
|
+
# Create a new GraalVM isolate thread for each call to load()
|
94
|
+
thread = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
|
95
|
+
LibYAMLScript.graal_create_isolate(nil, @isolate.ref, thread.ref)
|
96
|
+
|
97
|
+
# Call 'load_ys_to_json' function in libyamlscript shared library
|
98
|
+
json_data = LibYAMLScript.load_ys_to_json(thread, ys_code)
|
99
|
+
resp = JSON.parse(json_data.to_s)
|
100
|
+
raise Error, 'Failed to tear down isolate' \
|
101
|
+
unless LibYAMLScript.graal_tear_down_isolate(thread).zero?
|
102
|
+
raise Error, @error['cause'] if (@error = resp['error'])
|
103
|
+
data = resp.fetch('data') do
|
104
|
+
raise Error, 'Unexpected response from libyamlscript'
|
105
|
+
end
|
106
|
+
|
107
|
+
data
|
108
|
+
end
|
8
109
|
end
|
data/yamlscript.gemspec
CHANGED
@@ -4,9 +4,9 @@ require_relative "lib/yamlscript/version"
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "yamlscript"
|
7
|
-
spec.version =
|
8
|
-
spec.authors = ["Ingy döt Net"]
|
9
|
-
spec.email = ["ingy@ingy.net"]
|
7
|
+
spec.version = YAMLScript::VERSION
|
8
|
+
spec.authors = ["Ingy döt Net", "Delon Newman"]
|
9
|
+
spec.email = ["ingy@ingy.net", "contact@delonnewman.name"]
|
10
10
|
|
11
11
|
spec.summary = "Program in YAML"
|
12
12
|
spec.description = "Program in YAML"
|
@@ -15,18 +15,17 @@ Gem::Specification.new do |spec|
|
|
15
15
|
|
16
16
|
spec.metadata["homepage_uri"] = spec.homepage
|
17
17
|
spec.metadata["source_code_uri"] = spec.homepage
|
18
|
-
spec.metadata["changelog_uri"] =
|
18
|
+
spec.metadata["changelog_uri"] = \
|
19
|
+
"https://github.com/yaml/yamlscript/tree/main/ruby/ChangeLog.md"
|
19
20
|
|
20
21
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
21
|
-
`git ls-files -z`.split("\x0").reject {
|
22
|
+
`git ls-files -z`.split("\x0").reject {
|
23
|
+
|f| f.match(%r{\A(?:test|spec|features)/})
|
24
|
+
}
|
22
25
|
end
|
23
26
|
spec.bindir = "exe"
|
24
27
|
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
25
28
|
spec.require_paths = ["lib"]
|
26
29
|
|
27
|
-
|
28
|
-
# spec.add_dependency "example-gem", "~> 1.0"
|
29
|
-
|
30
|
-
# For more information and examples about making a new gem, checkout our
|
31
|
-
# guide at: https://bundler.io/guides/creating_gem.html
|
30
|
+
spec.add_dependency "minitest", "~> 5.20.0"
|
32
31
|
end
|
metadata
CHANGED
@@ -1,18 +1,34 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yamlscript
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.34
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ingy döt Net
|
8
|
+
- Delon Newman
|
8
9
|
autorequire:
|
9
10
|
bindir: exe
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
12
|
+
date: 2024-01-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: minitest
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 5.20.0
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 5.20.0
|
13
28
|
description: Program in YAML
|
14
29
|
email:
|
15
30
|
- ingy@ingy.net
|
31
|
+
- contact@delonnewman.name
|
16
32
|
executables: []
|
17
33
|
extensions: []
|
18
34
|
extra_rdoc_files: []
|
@@ -20,10 +36,9 @@ files:
|
|
20
36
|
- ".gitignore"
|
21
37
|
- ChangeLog.md
|
22
38
|
- Gemfile
|
23
|
-
-
|
39
|
+
- Makefile
|
24
40
|
- Rakefile
|
25
|
-
-
|
26
|
-
- bin/setup
|
41
|
+
- ReadMe.md
|
27
42
|
- lib/yamlscript.rb
|
28
43
|
- lib/yamlscript/version.rb
|
29
44
|
- yamlscript.gemspec
|
data/README.md
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# Yamlscript
|
2
|
-
|
3
|
-
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/yamlscript`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
6
|
-
|
7
|
-
## Installation
|
8
|
-
|
9
|
-
Add this line to your application's Gemfile:
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
gem 'yamlscript'
|
13
|
-
```
|
14
|
-
|
15
|
-
And then execute:
|
16
|
-
|
17
|
-
$ bundle install
|
18
|
-
|
19
|
-
Or install it yourself as:
|
20
|
-
|
21
|
-
$ gem install yamlscript
|
22
|
-
|
23
|
-
## Usage
|
24
|
-
|
25
|
-
TODO: Write usage instructions here
|
26
|
-
|
27
|
-
## Development
|
28
|
-
|
29
|
-
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
-
|
31
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
-
|
33
|
-
## Contributing
|
34
|
-
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/yamlscript.
|
data/bin/console
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
require "bundler/setup"
|
5
|
-
require "yamlscript"
|
6
|
-
|
7
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
-
# with your gem easier. You can also use a different console, if you like.
|
9
|
-
|
10
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
-
# require "pry"
|
12
|
-
# Pry.start
|
13
|
-
|
14
|
-
require "irb"
|
15
|
-
IRB.start(__FILE__)
|