gloss 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/.gitignore +5 -0
- data/.gloss.yml +3 -0
- data/.rubocop.yml +147 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +112 -0
- data/README.md +205 -0
- data/Rakefile +20 -0
- data/bin/console +14 -0
- data/exe/gloss +6 -0
- data/ext/gloss/Makefile +15 -0
- data/ext/gloss/extconf.rb +32 -0
- data/ext/gloss/shard.yml +18 -0
- data/ext/gloss/src/cr_ast.cr +382 -0
- data/ext/gloss/src/gloss.cr +31 -0
- data/ext/gloss/src/lexer.cr +1186 -0
- data/ext/gloss/src/lib/cr_ruby.cr +35 -0
- data/ext/gloss/src/parser.cr +340 -0
- data/ext/gloss/src/rb_ast.cr +491 -0
- data/gloss.gemspec +26 -0
- data/lib/gloss.bundle.dwarf +0 -0
- data/lib/gloss.rb +22 -0
- data/lib/gloss/builder.rb +442 -0
- data/lib/gloss/cli.rb +35 -0
- data/lib/gloss/config.rb +15 -0
- data/lib/gloss/errors.rb +11 -0
- data/lib/gloss/initializer.rb +20 -0
- data/lib/gloss/scope.rb +9 -0
- data/lib/gloss/source.rb +32 -0
- data/lib/gloss/version.rb +3 -0
- data/lib/gloss/watcher.rb +32 -0
- data/lib/gloss/writer.rb +26 -0
- data/sig/listen.rbs +48 -0
- data/src/lib/hrb/initializer.gl +22 -0
- data/src/lib/hrb/watcher.gl +32 -0
- metadata +177 -0
data/lib/gloss/cli.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "optparse"
|
4
|
+
|
5
|
+
module Gloss
|
6
|
+
class CLI
|
7
|
+
def initialize(argv)
|
8
|
+
@argv = argv
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
command, *files = @argv
|
13
|
+
case command
|
14
|
+
when "watch"
|
15
|
+
Watcher.new.watch
|
16
|
+
when "build"
|
17
|
+
(files.empty? ? Dir.glob("#{Config.src_dir}/**/*.rb") : files).each do |fp|
|
18
|
+
puts "=====> Building #{fp}"
|
19
|
+
content = File.read(fp)
|
20
|
+
|
21
|
+
puts "=====> Writing #{fp}"
|
22
|
+
Writer.new(Builder.new(content).run, fp).run
|
23
|
+
end
|
24
|
+
when "init"
|
25
|
+
force = false
|
26
|
+
OptionParser.new do |opt|
|
27
|
+
opt.on("--force", "-f") { force = true }
|
28
|
+
end.parse(@argv)
|
29
|
+
Initializer.new(force).run
|
30
|
+
else
|
31
|
+
abort "Gloss doesn't know how to #{command}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/gloss/config.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "ostruct"
|
4
|
+
require "yaml"
|
5
|
+
|
6
|
+
module Gloss
|
7
|
+
user_config = YAML.safe_load(File.read(".gloss.yml"))
|
8
|
+
Config = OpenStruct.new(
|
9
|
+
default_config: {
|
10
|
+
frozen_string_literals: true,
|
11
|
+
src_dir: "src",
|
12
|
+
}.freeze
|
13
|
+
)
|
14
|
+
Config.default_config.each { |k, v| Config.send(:"#{k}=", user_config[k.to_s] || v) }
|
15
|
+
end
|
data/lib/gloss/errors.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "yaml"
|
3
|
+
module Gloss
|
4
|
+
class Initializer
|
5
|
+
def initialize(force)
|
6
|
+
@force = force
|
7
|
+
end
|
8
|
+
def run()
|
9
|
+
(if File.exist?(".gloss.yml") && !@force
|
10
|
+
abort(".gloss.yml file already exists - aborting. Use --force to override.")
|
11
|
+
end)
|
12
|
+
File.open(".gloss.yml", "wb") { |file|
|
13
|
+
file.puts(Config.default_config
|
14
|
+
.transform_keys(&:to_s)
|
15
|
+
.to_yaml)
|
16
|
+
}
|
17
|
+
puts("Created .gloss.yml with default preferences")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/gloss/scope.rb
ADDED
data/lib/gloss/source.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gloss
|
4
|
+
class Source < String
|
5
|
+
def initialize(indent_level)
|
6
|
+
super()
|
7
|
+
@indent_level = indent_level
|
8
|
+
end
|
9
|
+
|
10
|
+
def write(*args)
|
11
|
+
args.each do |a|
|
12
|
+
self << a
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def write_indnt(*args)
|
17
|
+
write(*args.map { |a| "#{(" " * @indent_level)}#{a}" })
|
18
|
+
end
|
19
|
+
|
20
|
+
def write_ln(*args)
|
21
|
+
write_indnt(*args.map { |a| a.strip << "\n" })
|
22
|
+
end
|
23
|
+
|
24
|
+
def increment_indent
|
25
|
+
@indent_level += 1
|
26
|
+
end
|
27
|
+
|
28
|
+
def decrement_indent
|
29
|
+
@indent_level -= 1
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "listen"
|
4
|
+
|
5
|
+
module Gloss
|
6
|
+
class Watcher
|
7
|
+
def initialize
|
8
|
+
@paths = %w[src/]
|
9
|
+
end
|
10
|
+
|
11
|
+
def watch
|
12
|
+
puts "=====> Now listening for changes in #{@paths.join(', ')}"
|
13
|
+
listener = Listen.to(*@paths, latency: 2) do |modified, added, removed|
|
14
|
+
(modified + added).each do |f|
|
15
|
+
content = File.read(f)
|
16
|
+
Writer.new(Builder.new(content).run, f).run
|
17
|
+
end
|
18
|
+
removed.each do |f|
|
19
|
+
out_path = Utils.src_path_to_output_path(f)
|
20
|
+
File.delete out_path if File.exist? out_path
|
21
|
+
end
|
22
|
+
end
|
23
|
+
listener.start
|
24
|
+
begin
|
25
|
+
loop { sleep 10 }
|
26
|
+
rescue Interrupt
|
27
|
+
puts "=====> Interrupt signal received, shutting down"
|
28
|
+
exit 0
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/gloss/writer.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Gloss
|
4
|
+
module Utils
|
5
|
+
module_function
|
6
|
+
|
7
|
+
def src_path_to_output_path(src_path)
|
8
|
+
src_path.sub(%r{\A(?:\./)?#{Config.src_dir}/?}, "")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Writer
|
13
|
+
include Utils
|
14
|
+
|
15
|
+
def initialize(content, src_path, output_path = nil)
|
16
|
+
@content, @src_path = content, src_path
|
17
|
+
@output_path = output_path || src_path_to_output_path(src_path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
File.open(@output_path, "wb") do |file|
|
22
|
+
file << @content
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/sig/listen.rbs
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
module Listen
|
2
|
+
# Listens to file system modifications on a either single directory or
|
3
|
+
# multiple directories.
|
4
|
+
#
|
5
|
+
# @param (see Listen::Listener#new)
|
6
|
+
#
|
7
|
+
# @yield [modified, added, removed] the changed files
|
8
|
+
# @yieldparam [Array<String>] modified the list of modified files
|
9
|
+
# @yieldparam [Array<String>] added the list of added files
|
10
|
+
# @yieldparam [Array<String>] removed the list of removed files
|
11
|
+
#
|
12
|
+
# @return [Listen::Listener] the listener
|
13
|
+
#
|
14
|
+
def self.to: (*String dirs,
|
15
|
+
?debug: bool,
|
16
|
+
?wait_for_delay: Integer?,
|
17
|
+
?relative: bool,
|
18
|
+
?force_polling: bool,
|
19
|
+
?ignore: Regexp | Array[Regexp],
|
20
|
+
?ignore!: Regexp,
|
21
|
+
?only: Regexp?,
|
22
|
+
?polling_fallback_message: String?) {
|
23
|
+
(Array[String] modified, Array[String] added, Array[String] removed) -> void
|
24
|
+
} -> Listener
|
25
|
+
|
26
|
+
class Listener
|
27
|
+
# Starts processing events and starts adapters
|
28
|
+
# or resumes invoking callbacks if paused
|
29
|
+
def start: () -> void
|
30
|
+
|
31
|
+
# Stops both listening for events and processing them
|
32
|
+
def stop: () -> void
|
33
|
+
|
34
|
+
# Stops invoking callbacks (messages pile up)
|
35
|
+
def pause: () -> void
|
36
|
+
|
37
|
+
# processing means callbacks are called
|
38
|
+
def processing?: () -> bool
|
39
|
+
|
40
|
+
def paused?: () -> bool
|
41
|
+
|
42
|
+
def ignore: (Regexp regexps) -> void
|
43
|
+
|
44
|
+
def ignore!: (Regexp regexps) -> void
|
45
|
+
|
46
|
+
def only: (Regexp regexps) -> void
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
|
5
|
+
module Gloss
|
6
|
+
class Initializer
|
7
|
+
def initialize(@force)
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
if File.exist?(".gloss.yml") && !@force
|
12
|
+
abort ".gloss.yml file already exists - aborting. Use --force to override."
|
13
|
+
end
|
14
|
+
|
15
|
+
File.open(".gloss.yml", "wb") do |file|
|
16
|
+
file.puts Config.default_config.transform_keys(&:to_s).to_yaml
|
17
|
+
end
|
18
|
+
|
19
|
+
puts "Created .gloss.yml with default preferences"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "listen"
|
4
|
+
|
5
|
+
module Gloss
|
6
|
+
class Watcher
|
7
|
+
def initialize
|
8
|
+
@paths = %w[src/]
|
9
|
+
end
|
10
|
+
|
11
|
+
def watch
|
12
|
+
puts "=====> Now listening for changes in #{@paths.join(', ')}"
|
13
|
+
listener = Listen.to(*@paths, latency: 2) do |modified, added, removed|
|
14
|
+
(modified + added).each do |f|
|
15
|
+
content = File.read(f)
|
16
|
+
Writer.new(Builder.new(content).run, f).run
|
17
|
+
end
|
18
|
+
removed.each do |f|
|
19
|
+
out_path = Utils.src_path_to_output_path(f)
|
20
|
+
File.delete out_path if File.exist? out_path
|
21
|
+
end
|
22
|
+
end
|
23
|
+
listener.start
|
24
|
+
begin
|
25
|
+
loop { sleep 10 }
|
26
|
+
rescue Interrupt
|
27
|
+
puts "=====> Interrupt signal received, shutting down"
|
28
|
+
exit 0
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
metadata
ADDED
@@ -0,0 +1,177 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gloss
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- johansenja
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-12-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: fast_blank
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: listen
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: steep
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake-compiler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry-byebug
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: A rich language which compiles to ruby. Including type annotations, type
|
112
|
+
checking, macros, annotations, enums and more
|
113
|
+
email:
|
114
|
+
executables:
|
115
|
+
- gloss
|
116
|
+
extensions:
|
117
|
+
- ext/gloss/extconf.rb
|
118
|
+
extra_rdoc_files: []
|
119
|
+
files:
|
120
|
+
- ".gitignore"
|
121
|
+
- ".gloss.yml"
|
122
|
+
- ".rubocop.yml"
|
123
|
+
- Gemfile
|
124
|
+
- Gemfile.lock
|
125
|
+
- README.md
|
126
|
+
- Rakefile
|
127
|
+
- bin/console
|
128
|
+
- exe/gloss
|
129
|
+
- ext/gloss/Makefile
|
130
|
+
- ext/gloss/extconf.rb
|
131
|
+
- ext/gloss/shard.yml
|
132
|
+
- ext/gloss/src/cr_ast.cr
|
133
|
+
- ext/gloss/src/gloss.cr
|
134
|
+
- ext/gloss/src/lexer.cr
|
135
|
+
- ext/gloss/src/lib/cr_ruby.cr
|
136
|
+
- ext/gloss/src/parser.cr
|
137
|
+
- ext/gloss/src/rb_ast.cr
|
138
|
+
- gloss.gemspec
|
139
|
+
- lib/gloss.bundle.dwarf
|
140
|
+
- lib/gloss.rb
|
141
|
+
- lib/gloss/builder.rb
|
142
|
+
- lib/gloss/cli.rb
|
143
|
+
- lib/gloss/config.rb
|
144
|
+
- lib/gloss/errors.rb
|
145
|
+
- lib/gloss/initializer.rb
|
146
|
+
- lib/gloss/scope.rb
|
147
|
+
- lib/gloss/source.rb
|
148
|
+
- lib/gloss/version.rb
|
149
|
+
- lib/gloss/watcher.rb
|
150
|
+
- lib/gloss/writer.rb
|
151
|
+
- sig/listen.rbs
|
152
|
+
- src/lib/hrb/initializer.gl
|
153
|
+
- src/lib/hrb/watcher.gl
|
154
|
+
homepage:
|
155
|
+
licenses:
|
156
|
+
- MIT
|
157
|
+
metadata: {}
|
158
|
+
post_install_message:
|
159
|
+
rdoc_options: []
|
160
|
+
require_paths:
|
161
|
+
- lib
|
162
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0'
|
172
|
+
requirements: []
|
173
|
+
rubygems_version: 3.1.2
|
174
|
+
signing_key:
|
175
|
+
specification_version: 4
|
176
|
+
summary: A superset of ruby
|
177
|
+
test_files: []
|