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.
@@ -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
@@ -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
@@ -0,0 +1,11 @@
1
+ module Gloss
2
+ module Errors
3
+ class BaseGlossError < StandardError; end
4
+
5
+ class TypeValidationError < BaseGlossError; end
6
+
7
+ class TypeError < BaseGlossError; end
8
+
9
+ class ParserError < BaseGlossError; end
10
+ end
11
+ end
@@ -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
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gloss
4
+ class Scope < Hash
5
+ def [](k)
6
+ fetch(k) { raise "Undefined expression for current scope: #{k}" }
7
+ end
8
+ end
9
+ end
@@ -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,3 @@
1
+ module Gloss
2
+ VERSION = "0.0.1"
3
+ 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
@@ -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
@@ -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: []