alda-rb 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +45 -20
- data/Gemfile +2 -2
- data/Gemfile.lock +4 -2
- data/README.md +2 -0
- data/alda-rb.gemspec +30 -25
- data/exe/alda-irb +4 -1
- data/lib/alda-rb/commandline.rb +48 -11
- data/lib/alda-rb/error.rb +14 -3
- data/lib/alda-rb/event.rb +1 -1
- data/lib/alda-rb/event_list.rb +3 -3
- data/lib/alda-rb/repl.rb +37 -20
- data/lib/alda-rb/version.rb +1 -1
- metadata +60 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41c00c8e704980367ff2ca3cef0028e08cd5483106a0df2d89bc70644fea33a1
|
4
|
+
data.tar.gz: da32c375756258266cd4eee3818d8697f2ced17605f2bfe19db69e9eebffa5ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc03761923a96fd3c596cd034ef86f51f26b0b8055e33287e8fff772f1f1c062de55f0a009f07930c7bea8b2f9c491246b70ae44dc37aeec388cbc5f0669971f
|
7
|
+
data.tar.gz: f578e781ba699b774c9a22f30b65f8dd1c734d09fa4cd32d49416874cbab96203efd9b357ef9740854864ff445b408b4a55c85aaabdf236337b889f488819850
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,31 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## v0.3.1 (2023-06-03)
|
4
|
+
|
5
|
+
New features and new API:
|
6
|
+
|
7
|
+
- Added Alda::NREPLServerError#status.
|
8
|
+
- Added Alda::env.
|
9
|
+
- Alda::down? and Alda::up? is now useful in \Alda 2.
|
10
|
+
- Added Alda::REPL#reline.
|
11
|
+
|
12
|
+
BREAKING changes of API:
|
13
|
+
|
14
|
+
- Now `status` should be specified as a parameter of Alda::NREPLServerError::new.
|
15
|
+
|
16
|
+
Fixed bugs:
|
17
|
+
|
18
|
+
- Fixed: `alda-irb` does not run correctly in Ruby 3.
|
19
|
+
- Fixed: cannot handle unknown-op error of nREPL server.
|
20
|
+
- Fixed: an excess message printed when exiting \REPL on Windows.
|
21
|
+
|
22
|
+
Other changes:
|
23
|
+
|
24
|
+
- Fixed dependencies.
|
25
|
+
- Fixed some changelog of 0.3.0.
|
26
|
+
- Added a gem badge in README.
|
27
|
+
- Updated bundler version.
|
28
|
+
|
3
29
|
## v0.3.0 (2023-05-29)
|
4
30
|
|
5
31
|
### Changes for \Alda 2
|
@@ -8,12 +34,12 @@ Added API for support \Alda 2 while still being able to support \Alda 1:
|
|
8
34
|
|
9
35
|
- Added Alda::COMMANDS_FOR_VERSIONS and Alda::GENERATIONS.
|
10
36
|
- Added Alda::generation, which can be `:v1` or `:v2`.
|
11
|
-
Specifically, one of the values in the array Alda::GENERATIONS.
|
37
|
+
Specifically, one of the values in the array Alda::GENERATIONS.
|
12
38
|
- Added Alda::v1?, Alda::v2?, Alda::v1!, Alda::v2! (See Alda::GENERATIONS).
|
13
39
|
- Added Alda::deduce_generation.
|
14
40
|
- Added Alda::GenerationError.
|
15
41
|
- In Alda::Chord#to_alda_code, considering an undocumented breaking change about chords,
|
16
|
-
the behavior is slightly different for \Alda 1 and \Alda 2.
|
42
|
+
the behavior is slightly different for \Alda 1 and \Alda 2.
|
17
43
|
- Added Thread#inside_alda_list.
|
18
44
|
- Added Alda::REPL#message and Alda::REPL#raw_message.
|
19
45
|
|
@@ -25,7 +51,7 @@ APIs that are modified to support \Alda 2:
|
|
25
51
|
- Because \Alda 2 does not have the notion of down and up, if we are in v2,
|
26
52
|
Alda::down? will always return false and Alda::up? will always return true.
|
27
53
|
- Array#to_alda_code and Hash#to_alda_code behaves differently for \Alda 1 and \Alda 2 regarding
|
28
|
-
[a breaking change](https://github.com/alda-lang/alda/blob/master/doc/alda-2-migration-guide.md#attribute-syntax-has-changed-in-some-cases).
|
54
|
+
[a breaking change](https://github.com/alda-lang/alda/blob/master/doc/alda-2-migration-guide.md#attribute-syntax-has-changed-in-some-cases).
|
29
55
|
|
30
56
|
Documents that modified for notice about \Alda 2:
|
31
57
|
|
@@ -47,11 +73,11 @@ Examples that are modified to work in \Alda 2:
|
|
47
73
|
New features:
|
48
74
|
|
49
75
|
- Added warnings about structures that probably trigger errors in \Alda.
|
50
|
-
See Alda::EventContainer#check_in_chord, Alda::EventList#method_missing.
|
76
|
+
See Alda::EventContainer#check_in_chord, Alda::EventList#method_missing.
|
51
77
|
- Now you can specify a parameter in Alda::Event#detach_from_parent to exclude some
|
52
|
-
classes of parents that will be detached from.
|
78
|
+
classes of parents that will be detached from.
|
53
79
|
- (Potentially BREAKING) Alda::Event#detach_from_parent now tries to detach the topmost container
|
54
|
-
instead of the event itself from the parent.
|
80
|
+
instead of the event itself from the parent.
|
55
81
|
- Added a commandline program called `alda-irb`. See Alda::REPL.
|
56
82
|
- Traceback of exception will also be printed now if an Interrupt is caught in \REPL.
|
57
83
|
- <kbd>Ctrl</kbd>+<kbd>C</kbd> can now be used to discard the current input in \REPL.
|
@@ -63,7 +89,7 @@ New APIs:
|
|
63
89
|
|
64
90
|
- Added Alda::Raw.
|
65
91
|
- Added Alda::Utils::warn, Alda::Utils::win_platform?,
|
66
|
-
Alda::Utils::snake_to_slug, Alda::Utils::slug_to_snake.
|
92
|
+
Alda::Utils::snake_to_slug, Alda::Utils::slug_to_snake.
|
67
93
|
- Added Alda::Event#is_event_of?. It is overridden in Alda::EventContainer#is_event_of?.
|
68
94
|
- Added Alda::Event#== and Alda::EventList#==. It is overridden in many subclasses.
|
69
95
|
- Added Alda::EventContainer#check_in_chord.
|
@@ -72,7 +98,7 @@ Alda::Utils::snake_to_slug, Alda::Utils::slug_to_snake.
|
|
72
98
|
- Added Alda::REPL#color, Alda::REPL#preview.
|
73
99
|
- Added Alda::REPL#setup_repl, Alda::REPL#readline.
|
74
100
|
- Added Alda::REPL::TempScore#new_score, Alda::REPL::TempScore#score_text,
|
75
|
-
Alda::REPL::TempScore#score_data, Alda::REPL::TempScore#score_events.
|
101
|
+
Alda::REPL::TempScore#score_data, Alda::REPL::TempScore#score_events.
|
76
102
|
- Added Alda::pipe.
|
77
103
|
- Added Alda::processes.
|
78
104
|
- Added Alda::NREPLServerError.
|
@@ -81,10 +107,9 @@ Alda::REPL::TempScore#score_data, Alda::REPL::TempScore#score_events.
|
|
81
107
|
Slightly improved docs:
|
82
108
|
|
83
109
|
- Alda::EventContainer#event.
|
84
|
-
- The overriding
|
110
|
+
- The overriding `to_alda_code`'s and `on_contained`'s.
|
85
111
|
- Alda::Sequence, Alda::Sequence::RefineFlatten#flatten.
|
86
112
|
- The patches to Ruby's core classes.
|
87
|
-
- Alda::repl.
|
88
113
|
- Kernel.
|
89
114
|
- Alda::EventList::new.
|
90
115
|
- Alda::OrderError::new.
|
@@ -109,7 +134,7 @@ Removed APIs:
|
|
109
134
|
|
110
135
|
- Removed Alda::SetVariable#original_events.
|
111
136
|
- Removed Alda::repl. Now calling `Alda.repl` will trigger commandline `alda repl`.
|
112
|
-
For the old REPL function, use `Alda::REPL.new.run` instead.
|
137
|
+
For the old REPL function, use `Alda::REPL.new.run` instead.
|
113
138
|
- Removed Alda::REPL::TempScore#history.
|
114
139
|
|
115
140
|
Modified APIs or features:
|
@@ -120,11 +145,11 @@ Modified APIs or features:
|
|
120
145
|
### Fixed bugs
|
121
146
|
|
122
147
|
- Fixed: sometimes Alda::Event#parent returns wrong result
|
123
|
-
because it is not updated in some cases.
|
148
|
+
because it is not updated in some cases.
|
124
149
|
- Fixed (potentially BREAKING): Hash#to_alda_code returns `[[k1 v1] [k2 v2]]`.
|
125
|
-
Now, it returns `{k1 v1 k2 v2}`.
|
150
|
+
Now, it returns `{k1 v1 k2 v2}`.
|
126
151
|
- Use reline instead of readline in Alda::REPL
|
127
|
-
because Ruby 3.3 is dropping the shipment of readline-ext.
|
152
|
+
because Ruby 3.3 is dropping the shipment of readline-ext.
|
128
153
|
|
129
154
|
### Others
|
130
155
|
|
@@ -135,9 +160,9 @@ because Ruby 3.3 is dropping the shipment of readline-ext.
|
|
135
160
|
## v0.2.1 (2020-08-13)
|
136
161
|
|
137
162
|
- Fixed the bug in `examples/bwv846_prelude.rb`.
|
138
|
-
The file isn't changed when the version change
|
139
|
-
from [v0.1.4](#v014-2020-04-23) to [v0.2.0](#v020-2020-05-08)
|
140
|
-
but the new features in 0.2.0 made some codes in that file stop working.
|
163
|
+
The file isn't changed when the version change
|
164
|
+
from [v0.1.4](#v014-2020-04-23) to [v0.2.0](#v020-2020-05-08)
|
165
|
+
but the new features in 0.2.0 made some codes in that file stop working.
|
141
166
|
|
142
167
|
## v0.2.0 (2020-05-08)
|
143
168
|
|
@@ -178,9 +203,9 @@ c c c c c
|
|
178
203
|
> exit
|
179
204
|
```
|
180
205
|
- More than 2 events written together will become an Alda::Sequence object
|
181
|
-
(contained by an Alda::EventContainer).
|
182
|
-
Events that can use such sugar includes:
|
183
|
-
part (supports dot accessor), note, rest, octave, voice, marker, at-marker.
|
206
|
+
(contained by an Alda::EventContainer).
|
207
|
+
Events that can use such sugar includes:
|
208
|
+
part (supports dot accessor), note, rest, octave, voice, marker, at-marker.
|
184
209
|
```ruby
|
185
210
|
Alda::Score.new { p((c d e).event.class) } # => Alda::Sequence
|
186
211
|
```
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
data/alda-rb.gemspec
CHANGED
@@ -3,29 +3,34 @@
|
|
3
3
|
require_relative 'lib/alda-rb/version'
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
6
|
+
spec.name = "alda-rb"
|
7
|
+
spec.version = Alda::VERSION
|
8
|
+
spec.authors = ["Ulysses Zhan"]
|
9
|
+
spec.email = ["UlyssesZhan@gmail.com"]
|
10
|
+
|
11
|
+
spec.summary = %q{A Ruby library for live-coding music with Alda.}
|
12
|
+
# spec.description = %q{TODO: Write a longer description or delete this line.}
|
13
|
+
spec.homepage = "https://ulysseszh.github.io/doc/alda-rb"
|
14
|
+
spec.license = "MIT"
|
15
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
|
16
|
+
|
17
|
+
# spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
|
18
|
+
|
19
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
20
|
+
spec.metadata["source_code_uri"] = "https://github.com/UlyssesZh/alda-rb"
|
21
|
+
spec.metadata["changelog_uri"] = "https://ulysseszh.github.io/doc/alda-rb/CHANGELOG_md.html"
|
22
|
+
|
23
|
+
# Specify which files should be added to the gem when it is released.
|
24
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
25
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
26
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
27
|
+
end
|
28
|
+
spec.bindir = "exe"
|
29
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
|
+
spec.require_paths = ["lib"]
|
31
|
+
|
32
|
+
spec.add_runtime_dependency 'bencode'
|
33
|
+
spec.add_runtime_dependency 'colorize'
|
34
|
+
spec.add_development_dependency 'minitest', '~> 5.0'
|
35
|
+
spec.add_development_dependency 'rake', '~> 12.0'
|
31
36
|
end
|
data/exe/alda-irb
CHANGED
@@ -8,11 +8,13 @@ HOST = 'The hostname of the Alda REPL server; only useful in Alda 2; see `alda r
|
|
8
8
|
PORT = 'The port of the Alda REPL server; only useful in Alda 2; see `alda repl --help`'.freeze
|
9
9
|
NO_COLOR = 'Whether the output should not be colored'.freeze
|
10
10
|
NO_PREVIEW = 'Whether a preview of what Alda code will not be played everytime you input ruby codes'.freeze
|
11
|
+
NO_RELINE = 'Whether to use Reline to read input'.freeze
|
11
12
|
|
12
13
|
host = 'localhost'
|
13
14
|
port = -1
|
14
15
|
color = true
|
15
16
|
preview = true
|
17
|
+
reline = true
|
16
18
|
|
17
19
|
OptionParser.new do |opts|
|
18
20
|
opts.banner = 'Usage: alda-irb [options]'
|
@@ -21,9 +23,10 @@ OptionParser.new do |opts|
|
|
21
23
|
opts.on('-p', '--port int', PORT) { port = _1 }
|
22
24
|
opts.on('-c', '--no-color', NO_COLOR) { color = false }
|
23
25
|
opts.on('-P', '--no-preview', NO_PREVIEW) { preview = false }
|
26
|
+
opts.on('-r', '--no-reline', NO_RELINE) { reline = false }
|
24
27
|
end.parse!
|
25
28
|
|
26
29
|
Alda.deduce_generation
|
27
|
-
opts = {color: color, preview: preview}
|
30
|
+
opts = { color: color, preview: preview, reline: reline }
|
28
31
|
opts.merge! host: host, port: port unless Alda.v1?
|
29
32
|
Alda::REPL.new(**opts).run
|
data/lib/alda-rb/commandline.rb
CHANGED
@@ -90,7 +90,9 @@ module Alda
|
|
90
90
|
COMMANDS.each do |command, generations|
|
91
91
|
define_method command do |*args, **opts|
|
92
92
|
Alda::GenerationError.assert_generation generations
|
93
|
-
Alda.pipe
|
93
|
+
result = Alda.pipe command, *args, **opts, &:read
|
94
|
+
raise CommandLineError.new $?, result if $?.exitstatus.nonzero?
|
95
|
+
result
|
94
96
|
end.tap { module_function _1 }
|
95
97
|
end
|
96
98
|
|
@@ -154,8 +156,43 @@ module Alda
|
|
154
156
|
|
155
157
|
@executable = 'alda'
|
156
158
|
@options = {}
|
159
|
+
@env = {
|
160
|
+
'ALDA_DISABLE_SPAWNING' => 'yes',
|
161
|
+
'ALDA_DISABLE_TELEMETRY' => 'yes'
|
162
|
+
}
|
157
163
|
v2!
|
158
164
|
|
165
|
+
##
|
166
|
+
# :call-seq:
|
167
|
+
# env() -> Hash
|
168
|
+
# env(hash) -> Hash
|
169
|
+
# env(hash) { ... } -> Object
|
170
|
+
#
|
171
|
+
# When called with no arguments,
|
172
|
+
# returns the commandline environment variables (a Hash)
|
173
|
+
# used when running +alda+ on command line.
|
174
|
+
# It is <tt>{"ALDA_DISABLE_SPAWNING"=>"yes","ALDA_DISABLE_TELEMETRY"=>"yes"}</tt> by default
|
175
|
+
# (for speeding up the command line responses:
|
176
|
+
# {alda-lang/alda#368}[https://github.com/alda-lang/alda/issues/368]).
|
177
|
+
#
|
178
|
+
# When called with an argument +hash+,
|
179
|
+
# merge the old environment variables with +hash+ and set
|
180
|
+
# the merged Hash as the new environment variables.
|
181
|
+
# Returns the new environment variables (a Hash).
|
182
|
+
#
|
183
|
+
# When called with an argument +hash+ and a block,
|
184
|
+
# execute the block with the environment being set to the merge of the old environment
|
185
|
+
# and +hash+, and then restore the old environment.
|
186
|
+
# Returns the returned value of the block.
|
187
|
+
def env hash = nil, &block
|
188
|
+
if hash
|
189
|
+
@env = (old_env = @env).merge hash.map { |k, v| [k.to_s, v.to_s] }.to_h
|
190
|
+
block ? block.().tap { @env = old_env } : @env
|
191
|
+
else
|
192
|
+
@env
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
159
196
|
##
|
160
197
|
# :call-seq:
|
161
198
|
# pipe(command, *args, **opts) -> IO
|
@@ -165,7 +202,7 @@ module Alda
|
|
165
202
|
# or pass the IO to the block.
|
166
203
|
# See COMMANDS_FOR_VERSIONS for an explanation of +args+ and +opts+.
|
167
204
|
def pipe command, *args, **opts, &block
|
168
|
-
add_option = ->key, val do
|
205
|
+
add_option = ->((key, val)) do
|
169
206
|
next unless val
|
170
207
|
args.push "--#{Alda::Utils.snake_to_slug key}"
|
171
208
|
args.push val.to_s unless val == true
|
@@ -180,8 +217,8 @@ module Alda
|
|
180
217
|
# subcommand options
|
181
218
|
opts.each &add_option
|
182
219
|
# subprocess
|
183
|
-
spawn_options = Alda::Utils.win_platform? ? {new_pgroup: true} : {pgroup: true}
|
184
|
-
IO.popen args, **spawn_options, &block
|
220
|
+
spawn_options = Alda::Utils.win_platform? ? { new_pgroup: true } : { pgroup: true }
|
221
|
+
IO.popen Alda.env, args, **spawn_options, &block
|
185
222
|
end
|
186
223
|
|
187
224
|
##
|
@@ -194,7 +231,7 @@ module Alda
|
|
194
231
|
# and each Hash has the following keys:
|
195
232
|
# - +:id+: the player-id of the process, a three-letter String.
|
196
233
|
# - +:port+: the port number of the process, an Integer.
|
197
|
-
# - +:state+: the state of the process, a Symbol (may be +nil+, +:ready+, +:active+
|
234
|
+
# - +:state+: the state of the process, a Symbol (may be +nil+, +:ready+, +:active+, or +:starting+).
|
198
235
|
# - +:expiry+: a human-readable description of expiry time of the process, a String (may be +nil+).
|
199
236
|
# - +:type+: the type of the process, a Symbol (may be +:player+ or +:repl_server+).
|
200
237
|
def processes
|
@@ -205,7 +242,7 @@ module Alda
|
|
205
242
|
state = state == ?- ? nil : state.to_sym
|
206
243
|
expiry = nil if expiry == ?-
|
207
244
|
type = Alda::Utils.slug_to_snake type
|
208
|
-
{id: id, port: port, state: state, expiry: expiry, type: type}
|
245
|
+
{ id: id, port: port, state: state, expiry: expiry, type: type }
|
209
246
|
end
|
210
247
|
end
|
211
248
|
|
@@ -214,9 +251,9 @@ module Alda
|
|
214
251
|
# up?() -> true or false
|
215
252
|
#
|
216
253
|
# Whether the alda server is up.
|
217
|
-
#
|
254
|
+
# Checks whether there are any play processes in ::processes in \Alda 2.
|
218
255
|
def up?
|
219
|
-
Alda.
|
256
|
+
Alda.v1? ? Alda.status.include?('up') : Alda.processes.any? { _1[:type] == :player }
|
220
257
|
end
|
221
258
|
|
222
259
|
##
|
@@ -224,9 +261,9 @@ module Alda
|
|
224
261
|
# down? -> true or false
|
225
262
|
#
|
226
263
|
# Whether the alda server is down.
|
227
|
-
#
|
264
|
+
# Checks whether there are no play processes in ::processes in \Alda 2.
|
228
265
|
def down?
|
229
|
-
|
266
|
+
Alda.v1? ? Alda.status.include?('down') : Alda.processes.none? { _1[:type] == :player }
|
230
267
|
end
|
231
268
|
|
232
269
|
##
|
@@ -240,6 +277,6 @@ module Alda
|
|
240
277
|
@generation = major == '1' ? :v1 : :v2
|
241
278
|
end
|
242
279
|
|
243
|
-
module_function :pipe, :processes, :up?, :down?, :deduce_generation
|
280
|
+
module_function :env, :pipe, :processes, :up?, :down?, :deduce_generation
|
244
281
|
|
245
282
|
end
|
data/lib/alda-rb/error.rb
CHANGED
@@ -58,15 +58,26 @@ class Alda::NREPLServerError < StandardError
|
|
58
58
|
# This is an Array of String.
|
59
59
|
attr_reader :problems
|
60
60
|
|
61
|
+
##
|
62
|
+
# The status returned by the nREPL server.
|
63
|
+
# It is an Array of Symbol.
|
64
|
+
# Symbols must appear are +:done+, +:error+, and there may be +:unknown_op+.
|
65
|
+
attr_reader :status
|
66
|
+
|
61
67
|
##
|
62
68
|
# :call-seq:
|
63
|
-
# new(host, port, problems) -> Alda::NREPLServerError
|
69
|
+
# new(host, port, problems, status) -> Alda::NREPLServerError
|
64
70
|
#
|
65
71
|
# Creates a Alda::NREPLServerError object.
|
66
72
|
# Raises Alda::GenerationError if the current generation is not \Alda 2.
|
67
|
-
def initialize host, port, problems
|
73
|
+
def initialize host, port, problems, status
|
68
74
|
Alda::GenerationError.assert_generation [:v2]
|
69
|
-
|
75
|
+
@status = status.map { Alda::Utils.slug_to_snake _1 }
|
76
|
+
if @status.include? :unknown_op
|
77
|
+
super 'unknown operation'
|
78
|
+
else
|
79
|
+
super problems.join ?\n
|
80
|
+
end
|
70
81
|
@host = host
|
71
82
|
@port = port
|
72
83
|
@problems = problems
|
data/lib/alda-rb/event.rb
CHANGED
@@ -365,7 +365,7 @@ end
|
|
365
365
|
# end
|
366
366
|
#
|
367
367
|
# You can operate a score by purely using inline lisp events.
|
368
|
-
# The following example only works in Alda 1 due to breaking changes in Alda 2
|
368
|
+
# The following example only works in \Alda 1 due to breaking changes in \Alda 2
|
369
369
|
# ({alda-lang/alda#483}[https://github.com/alda-lang/alda/issues/483],
|
370
370
|
# {alda-lang/alda#484}[https://github.com/alda-lang/alda/issues/484]).
|
371
371
|
#
|
data/lib/alda-rb/event_list.rb
CHANGED
@@ -152,8 +152,8 @@ module Alda::EventList
|
|
152
152
|
#
|
153
153
|
# Append the events of another Alda::EventList object here.
|
154
154
|
# This method covers the disadvantage of alda's being unable to
|
155
|
-
# import scores from other files
|
156
|
-
#
|
155
|
+
# import scores from other files
|
156
|
+
# ({alda-lang/alda-core#8}[https://github.com/alda-lang/alda-core/issues/8]).
|
157
157
|
def import event_list
|
158
158
|
@events.concat event_list.events
|
159
159
|
nil
|
@@ -239,7 +239,7 @@ class Alda::Score
|
|
239
239
|
# Alda::Score.new { piano_; c; d; e }.play from: 1
|
240
240
|
# # (plays only an E note)
|
241
241
|
def play **opts
|
242
|
-
Alda.play code: self, **opts
|
242
|
+
Alda.env(ALDA_DISABLE_SPAWNING: :no) { Alda.play code: self, **opts }
|
243
243
|
end
|
244
244
|
|
245
245
|
##
|
data/lib/alda-rb/repl.rb
CHANGED
@@ -222,6 +222,11 @@ class Alda::REPL
|
|
222
222
|
# Whether a preview of what \Alda code will be played everytime you input ruby codes.
|
223
223
|
attr_accessor :preview
|
224
224
|
|
225
|
+
##
|
226
|
+
# Whether to use Reline for input.
|
227
|
+
# When it is false, the \REPL session will be less buggy but less powerful.
|
228
|
+
attr_accessor :reline
|
229
|
+
|
225
230
|
##
|
226
231
|
# :call-seq:
|
227
232
|
# new(**opts) -> Alda::REPL
|
@@ -230,6 +235,7 @@ class Alda::REPL
|
|
230
235
|
# The parameter +color+ specifies whether the output should be colored (sets #color).
|
231
236
|
# The parameter +preview+ specifies whether a preview of what \Alda code will be played
|
232
237
|
# everytime you input ruby codes (sets #preview).
|
238
|
+
# The parameter +reline+ specifies whether to use Reline for input.
|
233
239
|
#
|
234
240
|
# The +opts+ are passed to the command line of <tt>alda repl</tt>.
|
235
241
|
# Available options are +host+, +port+, etc.
|
@@ -240,12 +246,14 @@ class Alda::REPL
|
|
240
246
|
# A new one will be started only if no existing server is found.
|
241
247
|
#
|
242
248
|
# The +opts+ are ignored in \Alda 1.
|
243
|
-
def initialize color: true, preview: true, **opts
|
249
|
+
def initialize color: true, preview: true, reline: true, **opts
|
244
250
|
@score = TempScore.new self
|
245
251
|
@binding = @score.get_binding
|
246
|
-
|
252
|
+
# IRB once changed the API of RubyLex#initialize. Take care of that.
|
253
|
+
@lex = RubyLex.new *(RubyLex.instance_method(:initialize).arity == 0 ? [] : [@binding])
|
247
254
|
@color = color
|
248
255
|
@preview = preview
|
256
|
+
@reline = reline
|
249
257
|
setup_repl opts
|
250
258
|
end
|
251
259
|
|
@@ -261,14 +269,12 @@ class Alda::REPL
|
|
261
269
|
if Alda.v1?
|
262
270
|
@history = StringIO.new
|
263
271
|
else
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
@nrepl_pipe
|
270
|
-
/nrepl:\/\/(?<host>[a-zA-Z0-9._\-]+):(?<port>\d+)/ =~ @nrepl_pipe.gets
|
271
|
-
@host = host
|
272
|
+
@port = (opts.fetch :port, -1).to_i
|
273
|
+
@host = opts.fetch :host, 'localhost'
|
274
|
+
unless @port.positive? && %w[localhost 127.0.0.1].include?(@host) &&
|
275
|
+
Alda.processes.any? { _1[:port] == @port && _1[:type] == :repl_server }
|
276
|
+
Alda.env(ALDA_DISABLE_SPAWNING: :no) { @nrepl_pipe = Alda.pipe :repl, **opts, server: true }
|
277
|
+
/nrepl:\/\/[a-zA-Z0-9._\-]+:(?<port>\d+)/ =~ @nrepl_pipe.gets
|
272
278
|
@port = port.to_i
|
273
279
|
Process.detach @nrepl_pipe.pid
|
274
280
|
end
|
@@ -314,8 +320,8 @@ class Alda::REPL
|
|
314
320
|
def message op, **params
|
315
321
|
result = raw_message op: Alda::Utils.snake_to_slug(op), **params
|
316
322
|
result.transform_keys! { Alda::Utils.slug_to_snake _1 }
|
317
|
-
if result.delete
|
318
|
-
raise Alda::NREPLServerError.new @host, @port, result.delete(:problems)
|
323
|
+
if (status = result.delete :status).include? 'error'
|
324
|
+
raise Alda::NREPLServerError.new @host, @port, result.delete(:problems), status
|
319
325
|
end
|
320
326
|
case result.size
|
321
327
|
when 0 then nil
|
@@ -358,7 +364,9 @@ class Alda::REPL
|
|
358
364
|
indent = 0
|
359
365
|
begin
|
360
366
|
result.concat readline(indent).tap { return unless _1 }, ?\n
|
361
|
-
|
367
|
+
# IRB once changed the API of RubyLex#check_state. Take care of that.
|
368
|
+
opts = @lex.method(:check_state).arity.positive? ? {} : { context: @binding }
|
369
|
+
ltype, indent, continue, block_open = @lex.check_state result, **opts
|
362
370
|
rescue Interrupt
|
363
371
|
$stdout.puts
|
364
372
|
return ''
|
@@ -372,18 +380,25 @@ class Alda::REPL
|
|
372
380
|
#
|
373
381
|
# Prompts the user to input a line.
|
374
382
|
# The parameter +indent+ is the indentation level.
|
375
|
-
# Twice the number of spaces is already in the input field before the user fills in
|
383
|
+
# Twice the number of spaces is already in the input field before the user fills in
|
384
|
+
# if #reline is true.
|
376
385
|
# The prompt hint is different for zero +indent+ and nonzero +indent+.
|
377
386
|
# Returns the user input.
|
378
387
|
def readline indent = 0
|
379
388
|
prompt = indent.nonzero? ? '. ' : '> '
|
380
389
|
prompt = prompt.green if @color
|
381
|
-
|
382
|
-
Reline.
|
383
|
-
|
384
|
-
|
390
|
+
if @reline
|
391
|
+
Reline.pre_input_hook = -> do
|
392
|
+
Reline.insert_text ' ' * indent
|
393
|
+
Reline.redisplay
|
394
|
+
Reline.pre_input_hook = nil
|
395
|
+
end
|
396
|
+
Reline.readline prompt, true
|
397
|
+
else
|
398
|
+
$stdout.print prompt
|
399
|
+
$stdout.flush
|
400
|
+
$stdin.gets chomp: true
|
385
401
|
end
|
386
|
-
Reline.readline prompt, true
|
387
402
|
end
|
388
403
|
|
389
404
|
##
|
@@ -456,7 +471,9 @@ class Alda::REPL
|
|
456
471
|
else
|
457
472
|
if @nrepl_pipe
|
458
473
|
if Alda::Utils.win_platform?
|
459
|
-
|
474
|
+
unless IO.popen(['taskkill', '/f', '/pid', @nrepl_pipe.pid.to_s], &:read).include? 'SUCCESS'
|
475
|
+
Alda::Warning.warn 'failed to kill nREPL server; may become zombie process'
|
476
|
+
end
|
460
477
|
else
|
461
478
|
Process.kill :INT, @nrepl_pipe.pid
|
462
479
|
end
|
data/lib/alda-rb/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alda-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ulysses Zhan
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
12
|
-
dependencies:
|
11
|
+
date: 2023-06-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bencode
|
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: colorize
|
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: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.0'
|
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.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '12.0'
|
13
69
|
description:
|
14
70
|
email:
|
15
71
|
- UlyssesZhan@gmail.com
|
@@ -83,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
139
|
- !ruby/object:Gem::Version
|
84
140
|
version: '0'
|
85
141
|
requirements: []
|
86
|
-
rubygems_version: 3.
|
142
|
+
rubygems_version: 3.4.13
|
87
143
|
signing_key:
|
88
144
|
specification_version: 4
|
89
145
|
summary: A Ruby library for live-coding music with Alda.
|