lyp 0.1.7 → 0.1.8
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 +4 -4
- data/lib/lyp/base.rb +1 -1
- data/lib/lyp/cli.rb +12 -4
- data/lib/lyp/lilypond.rb +1 -1
- data/lib/lyp/package.rb +75 -16
- data/lib/lyp/resolver.rb +27 -9
- data/lib/lyp/templates/deps_wrapper.rb +4 -1
- data/lib/lyp/version.rb +1 -1
- data/lib/lyp/wrapper.rb +5 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f05a307478b3335dc0caa9e0d687b73ec0a1f4f3
|
4
|
+
data.tar.gz: e6811cd8a83c6b05a068ac1b494c41cd0f023917
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76e91e59d3b126e5e002d7ff0e2df0983a0c59ed72bffd444615fe35a811a8bae2a9e5768aebb5a82372cc245a93bc1bc85250354b79ea87a87f862952f5b0e4
|
7
|
+
data.tar.gz: 471fa1026b5a75d2f4de797117c0f5cfb37872e97ef72b67b7e5855ebc9960ba5c06741f2723f74c97761e9bc77b931173e2b0f963a121da6ddefe8cbdd036b2
|
data/lib/lyp/base.rb
CHANGED
@@ -6,7 +6,7 @@ module Lyp
|
|
6
6
|
# before the version number.
|
7
7
|
#
|
8
8
|
# Accepted operators: >=, ~>
|
9
|
-
PACKAGE_RE = /^([^@\>~]+)(
|
9
|
+
PACKAGE_RE = /^([^@\>~]+)(?:@)?((?:\>=|~\>)?.+)?/
|
10
10
|
LILYPOND_RE = /^lilypond(?:@?((?:\>=|~\>)?.+))?/
|
11
11
|
|
12
12
|
LYP_DIRECTORY = File.expand_path('~/.lyp')
|
data/lib/lyp/cli.rb
CHANGED
@@ -113,9 +113,10 @@ class Lyp::CLI < Thor
|
|
113
113
|
Lyp::Lilypond.compile(args)
|
114
114
|
end
|
115
115
|
|
116
|
-
desc "test [<option>...]", "Runs package tests on local directory"
|
116
|
+
desc "test [<option>...] [.|PATTERN]", "Runs package tests on installed packages or local directory"
|
117
117
|
method_option :install, aliases: '-i', type: :boolean, desc: 'Install the requested version of lilypond if not present'
|
118
118
|
method_option :env, aliases: '-e', type: :boolean, desc: 'Use version set by LILYPOND_VERSION environment variable'
|
119
|
+
method_option :all, aliases: '-a', type: :boolean, desc: ''
|
119
120
|
def test(*args)
|
120
121
|
$stderr.puts "Lyp #{Lyp::VERSION}"
|
121
122
|
|
@@ -129,11 +130,17 @@ class Lyp::CLI < Thor
|
|
129
130
|
Lyp::Lilypond.check_lilypond!
|
130
131
|
end
|
131
132
|
|
132
|
-
|
133
|
+
case args
|
134
|
+
when ['.']
|
135
|
+
Lyp::Package.run_local_tests('.')
|
136
|
+
else
|
137
|
+
Lyp::Package.run_package_tests(args)
|
138
|
+
end
|
133
139
|
end
|
134
140
|
|
135
141
|
desc "install <PACKAGE|lilypond|self>...", "Install a package or a version of lilypond. When 'install self' is invoked, lyp installs itself in ~/.lyp."
|
136
142
|
method_option :default, aliases: '-d', type: :boolean, desc: 'Set default lilypond version'
|
143
|
+
method_option :test, aliases: '-t', type: :boolean, desc: 'Run package tests after installation'
|
137
144
|
def install(*args)
|
138
145
|
raise "No package specified" if args.empty?
|
139
146
|
|
@@ -146,12 +153,13 @@ class Lyp::CLI < Thor
|
|
146
153
|
Lyp::Lilypond.install($1, options)
|
147
154
|
else
|
148
155
|
Lyp::System.test_installed_status!
|
149
|
-
Lyp::Package.install(package)
|
156
|
+
Lyp::Package.install(package, options)
|
150
157
|
end
|
151
158
|
end
|
152
159
|
end
|
153
160
|
|
154
161
|
desc "uninstall <PACKAGE|lilypond|self>...", "Uninstall a package or a version of lilypond. When 'uninstall self' is invoked, lyp uninstalls itself from ~/.lyp."
|
162
|
+
method_option :all, aliases: '-a', type: :boolean, desc: 'Uninstall all versions'
|
155
163
|
def uninstall(*args)
|
156
164
|
Lyp::System.test_installed_status!
|
157
165
|
|
@@ -165,7 +173,7 @@ class Lyp::CLI < Thor
|
|
165
173
|
Lyp::Lilypond.uninstall($1)
|
166
174
|
else
|
167
175
|
Lyp::System.test_installed_status!
|
168
|
-
Lyp::Package.uninstall(package)
|
176
|
+
Lyp::Package.uninstall(package, options)
|
169
177
|
end
|
170
178
|
end
|
171
179
|
end
|
data/lib/lyp/lilypond.rb
CHANGED
data/lib/lyp/package.rb
CHANGED
@@ -74,6 +74,12 @@ module Lyp::Package
|
|
74
74
|
|
75
75
|
puts "\nInstalled #{package}@#{info[:version]}\n\n" unless opts[:silent]
|
76
76
|
|
77
|
+
if opts[:test]
|
78
|
+
FileUtils.cd(info[:path]) do
|
79
|
+
run_tests(info[:path])
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
77
83
|
# important: return the installed version
|
78
84
|
info[:version]
|
79
85
|
end
|
@@ -147,20 +153,38 @@ module Lyp::Package
|
|
147
153
|
package !~ /\// ? package : package_git_url(package), nil
|
148
154
|
)
|
149
155
|
|
150
|
-
if opts[:
|
156
|
+
if opts[:all]
|
151
157
|
Dir["#{package_path}@*"].each do |path|
|
152
158
|
name = path.gsub("#{Lyp.packages_dir}/", '')
|
153
159
|
puts "Uninstalling #{name}" unless opts[:silent]
|
154
160
|
FileUtils.rm_rf(path)
|
155
161
|
end
|
156
162
|
else
|
157
|
-
|
163
|
+
if version
|
164
|
+
package_path += "@#{version}"
|
165
|
+
else
|
166
|
+
packages = Dir["#{package_path}@*"] + Dir["#{package_path}"]
|
167
|
+
case packages.size
|
168
|
+
when 0
|
169
|
+
raise "Could not find package #{package}"
|
170
|
+
when 1
|
171
|
+
package_path = packages[0]
|
172
|
+
else
|
173
|
+
packages.each do |path|
|
174
|
+
name = path.gsub("#{Lyp.packages_dir}/", '')
|
175
|
+
puts "Uninstalling #{name}" unless opts[:silent]
|
176
|
+
FileUtils.rm_rf(path)
|
177
|
+
end
|
178
|
+
return
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
158
182
|
if File.directory?(package_path)
|
159
183
|
name = package_path.gsub("#{Lyp.packages_dir}/", '')
|
160
184
|
puts "Uninstalling #{name}" unless opts[:silent]
|
161
185
|
FileUtils.rm_rf(package_path)
|
162
186
|
else
|
163
|
-
raise "Could not find #{package}"
|
187
|
+
raise "Could not find package #{package}"
|
164
188
|
end
|
165
189
|
end
|
166
190
|
end
|
@@ -363,27 +387,62 @@ module Lyp::Package
|
|
363
387
|
(tag =~ TAG_VERSION_RE) ? $1 : nil
|
364
388
|
end
|
365
389
|
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
unless Lyp::Lilypond.compile([fn], mode: :system)
|
375
|
-
fail_count += 1
|
390
|
+
# Runs all tests found in local directory
|
391
|
+
def run_local_tests(dir, opts = {})
|
392
|
+
package_dir = File.expand_path(dir)
|
393
|
+
test_files = Dir["#{package_dir}/**/*_test.ly"]
|
394
|
+
run_tests(opts) do |stats|
|
395
|
+
test_files.each do |f|
|
396
|
+
perform_test(f, stats)
|
376
397
|
end
|
377
398
|
end
|
399
|
+
end
|
400
|
+
|
401
|
+
# This method runs tests by yielding the test statistics.
|
402
|
+
# The caller should then call #perform_test to run each test file.
|
403
|
+
def run_tests(opts = {})
|
404
|
+
stats = {
|
405
|
+
start: Time.now,
|
406
|
+
test_count: 0,
|
407
|
+
fail_count: 0
|
408
|
+
}
|
378
409
|
|
379
|
-
|
410
|
+
yield stats
|
411
|
+
|
412
|
+
if stats[:test_count] == 0
|
380
413
|
STDERR.puts "No test files found"
|
381
414
|
else
|
382
415
|
puts "\nFinished in %.2g seconds\n%d files, %d failures" % [
|
383
|
-
Time.now -
|
416
|
+
Time.now - stats[:start], stats[:test_count], stats[:fail_count]
|
384
417
|
]
|
385
|
-
exit(fail_count > 0 ? 1 : 0)
|
418
|
+
exit(stats[:fail_count] > 0 ? 1 : 0)
|
419
|
+
end
|
420
|
+
end
|
421
|
+
|
422
|
+
def perform_test(fn, stats)
|
423
|
+
stats[:test_count] += 1
|
424
|
+
unless Lyp::Lilypond.compile([fn], mode: :system, force_wrap: true)
|
425
|
+
stats[:fail_count] += 1
|
386
426
|
end
|
387
427
|
end
|
428
|
+
|
429
|
+
|
430
|
+
def run_package_tests(patterns)
|
431
|
+
patterns = [''] if patterns.empty?
|
432
|
+
packages = patterns.inject([]) do |m, pat|
|
433
|
+
m += Dir["#{Lyp.packages_dir}/#{pat}*"]
|
434
|
+
end.uniq
|
435
|
+
|
436
|
+
run_tests do |stats|
|
437
|
+
packages.each do |path|
|
438
|
+
files = Dir["#{path}/**/*_test.ly"]
|
439
|
+
next if files.empty?
|
440
|
+
|
441
|
+
FileUtils.cd(path) do
|
442
|
+
files.each {|fn| perform_test(fn, stats)}
|
443
|
+
end
|
444
|
+
end
|
445
|
+
end
|
446
|
+
end
|
388
447
|
end
|
389
448
|
end
|
data/lib/lyp/resolver.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
class Lyp::Resolver
|
2
|
-
def initialize(user_file)
|
2
|
+
def initialize(user_file, opts = {})
|
3
3
|
@user_file = user_file
|
4
|
+
@opts = opts
|
4
5
|
end
|
5
6
|
|
6
7
|
# Resolving package dependencies involves two stages:
|
@@ -108,7 +109,7 @@ class Lyp::Resolver
|
|
108
109
|
return {} unless ref =~ Lyp::PACKAGE_RE
|
109
110
|
ref_package = $1
|
110
111
|
version_clause = $2
|
111
|
-
|
112
|
+
|
112
113
|
matches = find_matching_packages(ref, tree)
|
113
114
|
|
114
115
|
# Raise if no match found and we're at top of the tree
|
@@ -137,12 +138,17 @@ class Lyp::Resolver
|
|
137
138
|
|
138
139
|
req_package = $1
|
139
140
|
req_version = $2
|
140
|
-
req = Gem::Requirement.new(req_version || '>=0')
|
141
141
|
|
142
|
+
req = nil
|
143
|
+
if @opts[:forced_package_paths] && @opts[:forced_package_paths][req_package]
|
144
|
+
req_version = 'forced'
|
145
|
+
end
|
146
|
+
|
147
|
+
req = Gem::Requirement.new(req_version || '>=0') rescue nil
|
142
148
|
available_packages(tree).select do |package, sub_tree|
|
143
149
|
if (package =~ Lyp::PACKAGE_RE) && (req_package == $1)
|
144
150
|
version = Gem::Version.new($2 || '0') rescue nil
|
145
|
-
if version.nil?
|
151
|
+
if version.nil? || req.nil?
|
146
152
|
req_version.nil? || (req_version == $2)
|
147
153
|
else
|
148
154
|
req =~ version
|
@@ -163,14 +169,26 @@ class Lyp::Resolver
|
|
163
169
|
# Return a hash of all packages found in the packages directory, creating a
|
164
170
|
# leaf for each package
|
165
171
|
def get_available_packages(dir)
|
166
|
-
|
167
|
-
|
172
|
+
forced_paths = @opts[:forced_package_paths] || {}
|
173
|
+
|
174
|
+
packages = Dir["#{Lyp.packages_dir}/*"].inject({}) do |m, p|
|
175
|
+
name = File.basename(p)
|
176
|
+
|
177
|
+
m[name] = {
|
168
178
|
path: File.join(p, MAIN_PACKAGE_FILE),
|
169
|
-
dependencies: {}
|
170
|
-
|
179
|
+
dependencies: {}
|
171
180
|
}
|
172
181
|
m
|
173
182
|
end
|
183
|
+
|
184
|
+
forced_paths.each do |package, path|
|
185
|
+
packages["#{package}@forced"] = {
|
186
|
+
path: File.join(path, MAIN_PACKAGE_FILE),
|
187
|
+
dependencies: {}
|
188
|
+
}
|
189
|
+
end
|
190
|
+
|
191
|
+
packages
|
174
192
|
end
|
175
193
|
|
176
194
|
# Recursively remove any dependency for which no version is locally
|
@@ -391,7 +409,7 @@ class Lyp::Resolver
|
|
391
409
|
|
392
410
|
map = lambda do |m, p|
|
393
411
|
if p =~ Lyp::PACKAGE_RE
|
394
|
-
m[$1] = versions[p] ||= Gem::Version.new($2 || '0.0')
|
412
|
+
m[$1] = versions[p] ||= (Gem::Version.new($2 || '0.0') rescue nil)
|
395
413
|
end
|
396
414
|
m
|
397
415
|
end
|
@@ -12,6 +12,8 @@ require 'fileutils'
|
|
12
12
|
user_filename = File.expand_path(_[:user_file])
|
13
13
|
user_dirname = File.dirname(user_filename)
|
14
14
|
|
15
|
+
current_package_dir = _[:current_package_dir] || FileUtils.pwd
|
16
|
+
|
15
17
|
# The wrapper defines a few global variables:
|
16
18
|
#
|
17
19
|
# lyp-input-filename - the absolute path to the input file name
|
@@ -28,7 +30,7 @@ user_dirname = File.dirname(user_filename)
|
|
28
30
|
(define lyp-input-filename "{{user_filename}}")
|
29
31
|
(define lyp-input-dirname "{{user_dirname}}")
|
30
32
|
(define lyp-cwd "{{FileUtils.pwd}}")
|
31
|
-
(define lyp-current-package-dir "")
|
33
|
+
(define lyp-current-package-dir "{{current_package_dir}}")
|
32
34
|
(define lyp-package-refs (make-hash-table))`
|
33
35
|
|
34
36
|
_[:package_paths].each do |spec, path|
|
@@ -107,6 +109,7 @@ pinclude = #(define-void-function (parser location path)(string?)
|
|
107
109
|
|
108
110
|
# load the user's file
|
109
111
|
`
|
112
|
+
#(ly:set-option 'relative-includes #t)
|
110
113
|
#(ly:debug "package loader is ready")
|
111
114
|
\include "{{user_filename}}"
|
112
115
|
`
|
data/lib/lyp/version.rb
CHANGED
data/lib/lyp/wrapper.rb
CHANGED
@@ -5,13 +5,15 @@ module Lyp
|
|
5
5
|
File.expand_path('templates/deps_wrapper.rb', File.dirname(__FILE__))
|
6
6
|
))
|
7
7
|
|
8
|
-
def self.wrap(fn)
|
8
|
+
def self.wrap(fn, opts = {})
|
9
9
|
r = Lyp::Resolver.new(fn).resolve_package_dependencies
|
10
10
|
|
11
|
-
|
11
|
+
# copy current_package_dir option
|
12
|
+
r[:current_package_dir] = opts[:current_package_dir]
|
13
|
+
|
14
|
+
if !r[:package_paths].empty? || opts[:force_wrap]
|
12
15
|
FileUtils.mkdir_p('/tmp/lyp/wrappers')
|
13
16
|
fn = "/tmp/lyp/wrappers/#{File.basename(fn)}"
|
14
|
-
#Tempfile.new('lyp-deps-wrapper.ly').path
|
15
17
|
|
16
18
|
File.open(fn, 'w+') {|f| f << WRAPPER_TEMPLATE.render(r)}
|
17
19
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lyp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharon Rosner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|