lyp 0.3.7 → 0.3.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.
data/lib/lyp/package.rb CHANGED
@@ -4,12 +4,12 @@ require 'yaml'
4
4
 
5
5
  module Lyp::Package
6
6
  class << self
7
-
7
+
8
8
  def list(pattern = nil)
9
9
  packages = Dir["#{Lyp.packages_dir}/**/package.ly"].map do |path|
10
10
  File.dirname(path).gsub("#{Lyp.packages_dir}/", '')
11
11
  end
12
-
12
+
13
13
  if pattern
14
14
  if (pattern =~ /[@\>\<\=\~]/) && (pattern =~ Lyp::PACKAGE_RE)
15
15
  package, version = $1, $2
@@ -17,9 +17,9 @@ module Lyp::Package
17
17
  packages.select! do |p|
18
18
  p =~ Lyp::PACKAGE_RE
19
19
  p_pack, p_ver = $1, $2
20
-
20
+
21
21
  next false unless p_pack == package
22
-
22
+
23
23
  if req && (p_gemver = Gem::Version.new(p_ver) rescue nil)
24
24
  req =~ p_gemver
25
25
  else
@@ -33,7 +33,7 @@ module Lyp::Package
33
33
  end
34
34
  end
35
35
  end
36
-
36
+
37
37
  packages.sort do |x, y|
38
38
  x =~ Lyp::PACKAGE_RE; x_package, x_version = $1, $2
39
39
  y =~ Lyp::PACKAGE_RE; y_package, y_version = $1, $2
@@ -48,29 +48,29 @@ module Lyp::Package
48
48
  end
49
49
  end
50
50
  end
51
-
51
+
52
52
  def which(pattern = nil)
53
53
  list(pattern).map {|p| "#{Lyp.packages_dir}/#{p}" }
54
54
  end
55
-
55
+
56
56
  def install(package_specifier, opts = {})
57
57
  unless package_specifier =~ Lyp::PACKAGE_RE
58
58
  raise "Invalid package specifier #{package_specifier}"
59
59
  end
60
60
  package, version = $1, $2
61
-
61
+
62
62
  if version =~ /\:/
63
63
  info = install_from_local_files(package, version, opts)
64
64
  else
65
65
  info = install_from_repository(package, version, opts)
66
66
  end
67
-
67
+
68
68
  install_package_dependencies(info[:path], opts)
69
-
69
+
70
70
  if File.directory?(File.join(info[:path], 'fonts'))
71
71
  install_package_fonts(info[:path], opts)
72
72
  end
73
-
73
+
74
74
  unless opts[:silent]
75
75
  if info[:local_path]
76
76
  puts "\nInstalled #{package}@#{info[:version]} => #{info[:local_path]}\n\n"
@@ -78,24 +78,24 @@ module Lyp::Package
78
78
  puts "\nInstalled #{package}@#{info[:version]}\n\n"
79
79
  end
80
80
  end
81
-
81
+
82
82
  if opts[:test]
83
83
  FileUtils.cd(info[:path]) do
84
84
  run_tests(info[:path])
85
85
  end
86
86
  end
87
-
87
+
88
88
  # important: return the installed version
89
89
  info[:version]
90
90
  end
91
-
92
- LOCAL_PACKAGE_WRAPPER =
91
+
92
+ LOCAL_PACKAGE_WRAPPER =
93
93
  "#(set! lyp:current-package-dir \"%s\")\n\\pinclude \"%s\"\n"
94
-
94
+
95
95
  def install_from_local_files(package, version, opts)
96
96
  version =~ /^([^\:]+)\:(.+)$/
97
97
  version, local_path = $1, $2
98
-
98
+
99
99
  entry_point_path = nil
100
100
  local_path = File.expand_path(local_path)
101
101
  if File.directory?(local_path)
@@ -110,11 +110,11 @@ module Lyp::Package
110
110
  else
111
111
  raise "Could not find #{local_path}"
112
112
  end
113
-
113
+
114
114
  entry_point_dirname = File.dirname(entry_point_path)
115
115
  package_path = "#{Lyp.packages_dir}/#{package}@#{version}"
116
116
  package_ly_path = "#{package_path}/package.ly"
117
-
117
+
118
118
  FileUtils.rm_rf(package_path)
119
119
  FileUtils.mkdir_p(package_path)
120
120
  File.open(package_ly_path, 'w+') do |f|
@@ -122,12 +122,12 @@ module Lyp::Package
122
122
  end
123
123
 
124
124
  prepare_local_package_fonts(local_path, package_path)
125
-
125
+
126
126
  load_package_ext_file("#{package}@#{version}", local_path)
127
-
127
+
128
128
  {version: version, path: package_path, local_path: local_path}
129
129
  end
130
-
130
+
131
131
  def prepare_local_package_fonts(local_path, package_path)
132
132
  # create fonts directory symlink if needed
133
133
  fonts_path = File.join(local_path, 'fonts')
@@ -135,28 +135,28 @@ module Lyp::Package
135
135
  FileUtils.ln_sf(fonts_path, File.join(package_path, 'fonts'))
136
136
  end
137
137
  end
138
-
138
+
139
139
  def install_from_repository(package, version, opts)
140
140
  url = package_git_url(package)
141
141
  tmp_path = git_url_to_temp_path(url)
142
-
142
+
143
143
  repo = package_repository(url, tmp_path, opts)
144
144
  version = checkout_package_version(repo, version, opts)
145
-
145
+
146
146
  # Copy files
147
147
  package_path = git_url_to_package_path(
148
148
  package !~ /\// ? package : url, version
149
149
  )
150
-
150
+
151
151
  FileUtils.mkdir_p(File.dirname(package_path))
152
152
  FileUtils.rm_rf(package_path)
153
153
  FileUtils.cp_r(tmp_path, package_path)
154
-
154
+
155
155
  load_package_ext_file("#{package}@#{version}", package_path)
156
-
156
+
157
157
  {version: version, path: package_path}
158
158
  end
159
-
159
+
160
160
  def load_package_ext_file(package, path)
161
161
  ext_path = File.join(path, 'ext.rb')
162
162
  if File.file?(ext_path)
@@ -165,7 +165,7 @@ module Lyp::Package
165
165
  load_extension(ext_path)
166
166
  end
167
167
  end
168
-
168
+
169
169
  def uninstall(package, opts = {})
170
170
  unless package =~ Lyp::PACKAGE_RE
171
171
  raise "Invalid package specifier #{package}"
@@ -174,14 +174,14 @@ module Lyp::Package
174
174
  package_path = git_url_to_package_path(
175
175
  package !~ /\// ? package : package_git_url(package), nil
176
176
  )
177
-
177
+
178
178
  if opts[:all]
179
179
  Dir["#{package_path}@*"].each do |path|
180
180
  name = path.gsub("#{Lyp.packages_dir}/", '')
181
181
  puts "Uninstalling #{name}" unless opts[:silent]
182
182
  FileUtils.rm_rf(path)
183
183
  end
184
-
184
+
185
185
  Dir["#{Lyp.ext_dir}/#{File.basename(package_path)}*.rb"].each do |path|
186
186
  FileUtils.rm_f(path)
187
187
  end
@@ -204,12 +204,12 @@ module Lyp::Package
204
204
  return
205
205
  end
206
206
  end
207
-
207
+
208
208
  if File.directory?(package_path)
209
209
  name = package_path.gsub("#{Lyp.packages_dir}/", '')
210
210
  puts "Uninstalling #{name}" unless opts[:silent]
211
211
  FileUtils.rm_rf(package_path)
212
-
212
+
213
213
  Dir["#{Lyp.ext_dir}/#{File.basename(package_path)}.rb"].each do |path|
214
214
  FileUtils.rm_f(path)
215
215
  end
@@ -218,10 +218,10 @@ module Lyp::Package
218
218
  end
219
219
  end
220
220
  end
221
-
221
+
222
222
  def package_repository(url, tmp_path, opts = {})
223
223
  Lyp::System.test_rugged_gem!
224
-
224
+
225
225
  # Create repository
226
226
  if File.directory?(tmp_path)
227
227
  begin
@@ -232,7 +232,7 @@ module Lyp::Package
232
232
  # ignore and try to clone
233
233
  end
234
234
  end
235
-
235
+
236
236
  FileUtils.rm_rf(File.dirname(tmp_path))
237
237
  FileUtils.mkdir_p(File.dirname(tmp_path))
238
238
  puts "Cloning #{url}..." unless opts[:silent]
@@ -240,46 +240,46 @@ module Lyp::Package
240
240
  rescue => e
241
241
  raise "Could not clone repository (please check that the package URL is correct.)"
242
242
  end
243
-
243
+
244
244
  def checkout_package_version(repo, version, opts = {})
245
245
  # Select commit to checkout
246
246
  checkout_ref = select_checkout_ref(repo, version)
247
247
  unless checkout_ref
248
248
  raise "Could not find tag matching #{version}"
249
249
  end
250
-
250
+
251
251
  begin
252
252
  repo.checkout(checkout_ref, strategy: :force)
253
253
  rescue
254
254
  raise "Invalid version specified (#{version})"
255
255
  end
256
-
256
+
257
257
  tag_version(checkout_ref) || version
258
258
  end
259
-
259
+
260
260
  def install_package_dependencies(package_path, opts = {})
261
261
  # Install any missing sub-dependencies
262
262
  sub_deps = []
263
-
264
- resolver = Lyp::Resolver.new("#{package_path}/package.ly")
265
- deps_tree = resolver.get_dependency_tree(ignore_missing: true)
266
- deps_tree[:dependencies].each do |package_name, leaf|
267
- sub_deps << leaf[:clause] if leaf[:versions].empty?
263
+
264
+ resolver = Lyp::DependencyResolver.new("#{package_path}/package.ly")
265
+ deps_tree = resolver.compile_dependency_tree(ignore_missing: true)
266
+ deps_tree.dependencies.each do |package_name, spec|
267
+ sub_deps << spec.clause if spec.versions.empty?
268
268
  end
269
269
  sub_deps.each {|d| install(d, opts)}
270
270
  end
271
271
 
272
272
  SYSTEM_LILYPOND_PROMPT = <<-EOF.gsub(/^\s{6}/, '').chomp
273
- Do you wish to install the package fonts on the system-installed lilypond
274
- version %s (this might require sudo password)? (y/n):
273
+ Do you wish to install the package fonts on the system-installed lilypond
274
+ version %s (this might require sudo password)? (y/n):
275
275
  EOF
276
-
276
+
277
277
  def install_package_fonts(package_path, opts = {})
278
278
  puts "Installing package fonts..." unless opts[:silent]
279
279
  available_on_versions = []
280
-
280
+
281
281
  req = Lyp::FONT_COPY_REQ
282
-
282
+
283
283
  Lyp::Lilypond.list.each do |lilypond|
284
284
  next unless req =~ Gem::Version.new(lilypond[:version])
285
285
 
@@ -289,7 +289,7 @@ module Lyp::Package
289
289
 
290
290
  ly_fonts_dir = File.join(lilypond[:data_path], 'fonts')
291
291
  package_fonts_dir = File.join(package_path, 'fonts')
292
-
292
+
293
293
  if lilypond[:system]
294
294
  if Lyp::Lilypond.patch_system_lilypond_font_scm(lilypond, opts)
295
295
  available_on_versions << lilypond[:version]
@@ -297,15 +297,18 @@ module Lyp::Package
297
297
  else
298
298
  available_on_versions << lilypond[:version]
299
299
  end
300
-
301
- Dir["#{package_fonts_dir}/*"].each do |fn|
300
+
301
+ Dir["#{package_fonts_dir}/*/**"].each do |fn|
302
+ next unless File.file?(fn)
302
303
  target_fn = case File.extname(fn)
303
304
  when '.otf'
304
305
  File.join(ly_fonts_dir, 'otf', File.basename(fn))
305
306
  when '.svg', '.woff'
306
307
  File.join(ly_fonts_dir, 'svg', File.basename(fn))
308
+ else
309
+ next
307
310
  end
308
-
311
+
309
312
  if File.writable?(File.dirname(target_fn))
310
313
  FileUtils.cp(fn, target_fn)
311
314
  else
@@ -319,7 +322,7 @@ module Lyp::Package
319
322
  end
320
323
 
321
324
  end
322
-
325
+
323
326
  def package_git_url(package, search_index = true)
324
327
  case package
325
328
  when /^(?:(?:[^\:]+)|http|https)\:/
@@ -338,30 +341,30 @@ module Lyp::Package
338
341
  end
339
342
  end
340
343
  end
341
-
344
+
342
345
  LYP_INDEX_URL = "https://raw.githubusercontent.com/lyp-packages/index/master/index.yaml"
343
-
346
+
344
347
  def search_lyp_index(package)
345
348
  entry = lyp_index['packages'][package]
346
349
  entry && entry['url']
347
350
  end
348
-
351
+
349
352
  def list_lyp_index(pattern = nil)
350
353
  list = lyp_index['packages'].inject([]) do |m, kv|
351
354
  m << kv[1].merge('name' => kv[0])
352
355
  end
353
-
356
+
354
357
  if pattern
355
358
  list.select! {|p| p['name'] =~ /#{pattern}/}
356
359
  end
357
-
360
+
358
361
  list.sort_by {|p| p['name']}
359
362
  end
360
-
363
+
361
364
  def lyp_index
362
365
  @lyp_index ||= YAML.load(open(LYP_INDEX_URL))
363
366
  end
364
-
367
+
365
368
  TEMP_REPO_ROOT_PATH = "#{Lyp::TMP_ROOT}/repos"
366
369
 
367
370
  def git_url_to_temp_path(url)
@@ -376,10 +379,10 @@ module Lyp::Package
376
379
  raise "Invalid URL #{url}"
377
380
  end
378
381
  end
379
-
382
+
380
383
  def git_url_to_package_path(url, version)
381
384
  # version = 'head' if version.nil? || (version == '')
382
-
385
+
383
386
  package_path = case url
384
387
  when /^(?:http|https)\:(?:\/\/)?(.+)$/
385
388
  path = $1.gsub(/\.git$/, '')
@@ -394,13 +397,13 @@ module Lyp::Package
394
397
  raise "Invalid URL #{url}"
395
398
  end
396
399
  end
397
-
400
+
398
401
  package_path += "@#{version}" if version
399
402
  package_path
400
403
  end
401
-
404
+
402
405
  TAG_VERSION_RE = /^v?(\d.*)$/
403
-
406
+
404
407
  def select_checkout_ref(repo, version_specifier)
405
408
  case version_specifier
406
409
  when nil, '', 'latest'
@@ -419,17 +422,17 @@ module Lyp::Package
419
422
  version_specifier
420
423
  end
421
424
  end
422
-
425
+
423
426
  def highest_versioned_tag(repo)
424
427
  tag = repo_tags(repo).select {|t| Gem::Version.new(tag_version(t.name)) rescue nil}.last
425
428
  tag && tag.name
426
429
  end
427
-
430
+
428
431
  # Returns a list of tags sorted by version
429
432
  def repo_tags(repo)
430
433
  tags = []
431
434
  repo.tags.each {|t| tags << t}
432
-
435
+
433
436
  tags.sort do |x, y|
434
437
  x_version, y_version = tag_version(x.name), tag_version(y.name)
435
438
  if x_version && y_version
@@ -439,11 +442,11 @@ module Lyp::Package
439
442
  end
440
443
  end
441
444
  end
442
-
445
+
443
446
  def tag_version(tag)
444
447
  (tag =~ TAG_VERSION_RE) ? $1 : nil
445
448
  end
446
-
449
+
447
450
  # Runs all tests found in local directory
448
451
  def run_local_tests(dir, opts = {})
449
452
  package_dir = File.expand_path(dir)
@@ -453,11 +456,11 @@ module Lyp::Package
453
456
  end
454
457
  end
455
458
  end
456
-
459
+
457
460
  def find_test_files(dir)
458
461
  Dir["#{dir}/**/*_test.ly", "#{dir}/**/*-test.ly"]
459
462
  end
460
-
463
+
461
464
  # This method runs tests by yielding the test statistics.
462
465
  # The caller should then call #perform_test to run each test file.
463
466
  def run_tests(opts = {})
@@ -466,9 +469,9 @@ module Lyp::Package
466
469
  test_count: 0,
467
470
  fail_count: 0
468
471
  }
469
-
472
+
470
473
  yield stats
471
-
474
+
472
475
  if stats[:test_count] == 0
473
476
  STDERR.puts "No test files found" unless opts[:silent]
474
477
  else
@@ -477,23 +480,23 @@ module Lyp::Package
477
480
  ] unless opts[:silent]
478
481
  exit(stats[:fail_count] > 0 ? 1 : 0) unless opts[:dont_exit]
479
482
  end
480
-
483
+
481
484
  stats
482
485
  end
483
-
486
+
484
487
  def perform_test(fn, stats)
485
488
  stats[:test_count] += 1
486
489
  unless Lyp::Lilypond.compile([fn], mode: :system)
487
490
  stats[:fail_count] += 1
488
491
  end
489
492
  end
490
-
493
+
491
494
  def run_package_tests(patterns, opts = {})
492
495
  patterns = [''] if patterns.empty?
493
496
  packages = patterns.inject([]) do |m, pat|
494
497
  m += Dir["#{Lyp.packages_dir}/#{pat}*"]
495
498
  end.uniq
496
-
499
+
497
500
  run_tests(opts) do |stats|
498
501
  packages.each do |path|
499
502
  files = find_test_files(path)
@@ -503,13 +506,13 @@ module Lyp::Package
503
506
  files.each {|fn| perform_test(fn, stats)}
504
507
  end
505
508
  end
506
- end
509
+ end
507
510
  end
508
-
511
+
509
512
  def load_all_extensions
510
513
  Dir["#{Lyp.ext_dir}/*.rb"].each {|f| load_extension(f)}
511
514
  end
512
-
515
+
513
516
  def load_extension(path)
514
517
  load(path)
515
518
  rescue => e
@@ -526,4 +529,4 @@ module Lyp
526
529
 
527
530
  FileUtils.cp(path, "#{Lyp.ext_dir}/#{$installed_package}.rb")
528
531
  end
529
- end
532
+ end