lyp-win 0.3.7 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
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