lyp 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 95a3a0c7bde875ba4dc99f647f476f3c38c38edc
4
- data.tar.gz: a2b2624b43aa5ce75c697c5f3fb29dd3b8141ca9
3
+ metadata.gz: be34fcbc627f99a4a4e3859e3c3629f69604a621
4
+ data.tar.gz: 7141ac8c3ec2d892218022810877584f05b2afb2
5
5
  SHA512:
6
- metadata.gz: 787384a486ddbb0f561404513cbda77fc783d5430428669d31021bf3c84878692fb4d13a2ee4bb0fe3a900ba46aa6711cf1815232b573272ca7b067d36cb12d9
7
- data.tar.gz: 0dd250c4b5ce752610d59a17f14de1da74d7d91268cea0fb37cb90767a4395b74cefe88ce4d8a8865651d29c3fe2a45cb0d848d0668858567adad06be5b5872b
6
+ metadata.gz: 1bfb4b6e26d1b552613791a58bfdeb9a65c338cf62efaa0cce537361d06a6fbc0b65f2c8bc422242f8707061a7f3541898fcb6cdc7701f3c873d96b1affc9f8e
7
+ data.tar.gz: 66b0af75bb43ee1fca671ccd967ec046971320a28dc30d4c5ed71dc19b99ae59f5ee5f7974a43c505e6a6d88962374149f7f2a2483eb5882da4b136d20bd4f6b
data/lib/lyp/base.rb CHANGED
@@ -21,9 +21,13 @@ module Lyp
21
21
 
22
22
  # Font patch filename (required for 2.18.2 <= lilypond < 2.19.12)
23
23
  FONT_PATCH_FILENAME = File.expand_path('etc/font.scm', File.dirname(__FILE__))
24
-
25
- SETTINGS_FILENAME = 'settings.yml'
26
24
 
25
+ # etc/lyp.ly contains lyp:* procedure definitions for loading packages and
26
+ # other support code.
27
+ LYP_LY_LIB_PATH = File.expand_path('etc/lyp.ly', File.dirname(__FILE__))
28
+
29
+ SETTINGS_FILENAME = 'settings.yml'
30
+
27
31
  def self.packages_dir
28
32
  ensure_dir(DEFAULT_PACKAGE_DIRECTORY)
29
33
  end
@@ -0,0 +1,97 @@
1
+ #(begin
2
+ ; hash table mapping package refs to package names
3
+ (define lyp:package-refs (make-hash-table))
4
+
5
+ ; hash table mapping package names to package directories
6
+ (define lyp:package-dirs (make-hash-table))
7
+
8
+ ; hash table mapping package names to loaded state
9
+ (define lyp:package-loaded? (make-hash-table))
10
+
11
+ ; hash table mapping file paths to included state
12
+ (define lyp:file-included? (make-hash-table))
13
+
14
+ ; convert package ref to package name
15
+ (define (lyp:ref->name ref) (let* (
16
+ (clean-ref (car (string-split ref #\:)))
17
+ (name (hash-ref lyp:package-refs clean-ref))
18
+ )
19
+ (or name (throw 'lyp:failure "lyp:ref->name"
20
+ (format "Invalid package ref ~a" ref) #f))
21
+ ))
22
+
23
+ ; convert package reef to directory
24
+ (define (lyp:name->dir name) (let (
25
+ (dir (hash-ref lyp:package-dirs name))
26
+ )
27
+ (or dir (throw 'lyp-failure "lyp:name->dir"
28
+ (format "Invalid package name ~a" ref) #f))
29
+ ))
30
+
31
+ ; converts a package-relative path to absolute path. If the package is null,
32
+ ; uses lyp:current-package-dir (which value is valid only on package loading)
33
+ (define (lyp:package-file-path package path) (let* (
34
+ (base-path (if (null? package)
35
+ lyp:current-package-dir (lyp:name->dir package)))
36
+ )
37
+ (string-append base-path "/" path)
38
+ ))
39
+
40
+ ; converts a package file reference to absolute path
41
+ (define (lyp:fileref->path ref) (let* (
42
+ (split (string-split ref #\:))
43
+ (qualified? (eq? (length split) 2))
44
+ (package (if qualified? (list-ref split 0) %nil))
45
+ (path (if qualified? (list-ref split 1) (list-ref split 0)))
46
+ )
47
+ (lyp:package-file-path package path)
48
+ ))
49
+
50
+ (define (lyp:load ref) (load (lyp:fileref->path ref)))
51
+
52
+ (define (lyp:include-ly-file path once-only?) (let* (
53
+ (included? (and once-only? (hash-ref lyp:file-included? path)))
54
+ )
55
+ (if (not (file-exists? path))
56
+ (throw 'lyp:failure "lyp:include-ly-file"
57
+ (format "File not found ~a" path) #f)
58
+ )
59
+ (if (not included?) (begin
60
+ (hash-set! lyp:file-included? path #t)
61
+ #{ \include #path #}
62
+ ))
63
+ ))
64
+
65
+ (define (lyp:include ref)
66
+ (lyp:include-ly-file (lyp:fileref->path ref) #f))
67
+ (define (lyp:include-once ref)
68
+ (lyp:include-ly-file (lyp:fileref->path ref) #t))
69
+
70
+ (define (lyp:require ref) (let* (
71
+ (name (lyp:ref->name ref))
72
+ (package-dir (lyp:name->dir name))
73
+ (entry-point-path (string-append package-dir "/package.ly"))
74
+ (loaded? (hash-ref lyp:package-loaded? name))
75
+ (prev-package-dir lyp:current-package-dir)
76
+ )
77
+ (if (not loaded?) (begin
78
+ (ly:debug "Loading package ~a at ~a" name package-dir)
79
+ (set! lyp:current-package-dir package-dir)
80
+ (hash-set! lyp:package-loaded? name #t)
81
+ #{ \include #entry-point-path #}
82
+ (set! lyp:current-package-dir prev-package-dir)
83
+ ))
84
+ ))
85
+ )
86
+
87
+ % command form
88
+ require = #(define-void-function (parser location ref)(string?)
89
+ (lyp:require ref))
90
+
91
+
92
+ pinclude = #(define-void-function (parser location ref)(string?)
93
+ (lyp:include ref))
94
+
95
+ pincludeOnce = #(define-void-function (parser location ref)(string?)
96
+ (lyp:include-once ref))
97
+
data/lib/lyp/lilypond.rb CHANGED
@@ -485,15 +485,18 @@ module Lyp::Lilypond
485
485
  FileUtils.rm_rf(lilypond_dir)
486
486
  end
487
487
 
488
- def exec(cmd)
488
+ def exec(cmd, raise_on_failure = true)
489
+ success = nil
489
490
  Open3.popen3(cmd) do |_in, _out, _err, wait_thr|
490
491
  exit_value = wait_thr.value
491
492
  $_out = _out.read
492
493
  $_err = _err.read
493
- if exit_value != 0
494
- raise "Error executing cmd #{cmd}: #{$_err.read}"
495
- end
494
+ success = exit_value == 0
495
+ end
496
+ if !success && raise_on_failure
497
+ raise "Error executing cmd #{cmd}: #{$_err}"
496
498
  end
499
+ success
497
500
  end
498
501
  end
499
502
  end
data/lib/lyp/package.rb CHANGED
@@ -410,13 +410,15 @@ module Lyp::Package
410
410
  yield stats
411
411
 
412
412
  if stats[:test_count] == 0
413
- STDERR.puts "No test files found"
413
+ STDERR.puts "No test files found" unless opts[:silent]
414
414
  else
415
415
  puts "\nFinished in %.2g seconds\n%d files, %d failures" % [
416
416
  Time.now - stats[:start], stats[:test_count], stats[:fail_count]
417
- ]
418
- exit(stats[:fail_count] > 0 ? 1 : 0)
417
+ ] unless opts[:silent]
418
+ exit(stats[:fail_count] > 0 ? 1 : 0) unless opts[:dont_exit]
419
419
  end
420
+
421
+ stats
420
422
  end
421
423
 
422
424
  def perform_test(fn, stats)
@@ -426,14 +428,13 @@ module Lyp::Package
426
428
  end
427
429
  end
428
430
 
429
-
430
- def run_package_tests(patterns)
431
+ def run_package_tests(patterns, opts = {})
431
432
  patterns = [''] if patterns.empty?
432
433
  packages = patterns.inject([]) do |m, pat|
433
434
  m += Dir["#{Lyp.packages_dir}/#{pat}*"]
434
435
  end.uniq
435
436
 
436
- run_tests do |stats|
437
+ run_tests(opts) do |stats|
437
438
  packages.each do |path|
438
439
  files = Dir["#{path}/**/*_test.ly"]
439
440
  next if files.empty?
data/lib/lyp/resolver.rb CHANGED
@@ -12,22 +12,27 @@ class Lyp::Resolver
12
12
 
13
13
  definite_versions = resolve_tree(tree)
14
14
  specifier_map = map_specifiers_to_versions(tree)
15
+
16
+ refs, dirs = {}, {}
17
+ definite_versions.each do |v|
18
+ package = v =~ Lyp::PACKAGE_RE && $1
15
19
 
20
+ specifier_map[package].each_key {|s| refs[s] = package}
21
+ dirs[package] = File.dirname(tree[:available_packages][v][:path])
22
+ end
23
+
16
24
  {
17
25
  user_file: @user_file,
18
26
  definite_versions: definite_versions,
19
- package_paths: definite_versions.inject({}) do |h, v|
20
- package = v =~ Lyp::PACKAGE_RE && $1
21
- path = tree[:available_packages][v][:path]
22
- specifier_map[package].each_key {|s| h[s] = path}
23
- h
24
- end
27
+ package_refs: refs,
28
+ package_dirs: dirs
25
29
  }
26
30
  end
27
31
 
28
- DEP_RE = /\\(require|include|pinclude) "([^"]+)"/.freeze
32
+ DEP_RE = /\\(require|include|pinclude|pincludeOnce) "([^"]+)"/.freeze
29
33
  INCLUDE = "include".freeze
30
34
  PINCLUDE = "pinclude".freeze
35
+ PINCLUDE_ONCE = "pincludeOnce".freeze
31
36
  REQUIRE = "require".freeze
32
37
 
33
38
  # Each "leaf" on the dependency tree is a hash of the following structure:
@@ -80,13 +85,39 @@ class Lyp::Resolver
80
85
  dir = File.dirname(path)
81
86
 
82
87
  # Parse lilypond file for \include and \require
83
- ly_content.scan(DEP_RE) do |type, path|
88
+ ly_content.scan(DEP_RE) do |type, ref|
84
89
  case type
85
- when INCLUDE, PINCLUDE
86
- qualified_path = File.expand_path(path, dir)
90
+ when INCLUDE, PINCLUDE, PINCLUDE_ONCE
91
+ # a package would normally use a plain \pinclude or \pincludeOnce
92
+ # command to include package files, e.g. \pinclude "inc/init.ly".
93
+ #
94
+ # But a package can also qualify the file reference with the package
95
+ # name, in order to be able to load files after the package has already
96
+ # been loaded, e.g. \pinclude "mypack:inc/init.ly"
97
+ if ref =~ /^([^\:]+)\:(.+)$/
98
+ # ignore null package (used for testing purposes only)
99
+ next if $1 == 'null'
100
+ ref = $2
101
+ end
102
+ qualified_path = File.expand_path(ref, dir)
87
103
  queue_file_for_processing(qualified_path, tree, leaf)
88
104
  when REQUIRE
89
- find_package_versions(path, tree, leaf, opts)
105
+ forced_path = nil
106
+ if ref =~ /^([^\:]+)\:(.+)$/
107
+ ref = $1
108
+ forced_path = File.expand_path($2, dir)
109
+ end
110
+
111
+ ref =~ Lyp::PACKAGE_RE
112
+ package, version = $1, $2
113
+ next if package == 'null'
114
+
115
+ # set forced path if applicable
116
+ if forced_path
117
+ set_forced_package_path(tree, package, forced_path)
118
+ end
119
+
120
+ find_package_versions(ref, tree, leaf, opts)
90
121
  end
91
122
  end
92
123
 
@@ -166,11 +197,19 @@ class Lyp::Resolver
166
197
  tree[:available_packages] ||= get_available_packages(Lyp.packages_dir)
167
198
  end
168
199
 
200
+ def set_forced_package_path(tree, package, path)
201
+ @opts[:forced_package_paths] ||= {}
202
+ @opts[:forced_package_paths][package] = path
203
+
204
+ available_packages(tree)["#{package}@forced"] = {
205
+ path: File.join(path, MAIN_PACKAGE_FILE),
206
+ dependencies: {}
207
+ }
208
+ end
209
+
169
210
  # Return a hash of all packages found in the packages directory, creating a
170
211
  # leaf for each package
171
212
  def get_available_packages(dir)
172
- forced_paths = @opts[:forced_package_paths] || {}
173
-
174
213
  packages = Dir["#{Lyp.packages_dir}/*"].inject({}) do |m, p|
175
214
  name = File.basename(p)
176
215
 
@@ -181,11 +220,15 @@ class Lyp::Resolver
181
220
  m
182
221
  end
183
222
 
184
- forced_paths.each do |package, path|
185
- packages["#{package}@forced"] = {
186
- path: File.join(path, MAIN_PACKAGE_FILE),
187
- dependencies: {}
188
- }
223
+ forced_paths = @opts[:forced_package_paths] || {}
224
+
225
+ if @opts[:forced_package_paths]
226
+ @opts[:forced_package_paths].each do |package, path|
227
+ packages["#{package}@forced"] = {
228
+ path: File.join(path, MAIN_PACKAGE_FILE),
229
+ dependencies: {}
230
+ }
231
+ end
189
232
  end
190
233
 
191
234
  packages
@@ -25,104 +25,29 @@ current_package_dir = _[:current_package_dir] || FileUtils.pwd
25
25
  # lyp:file-included - a hash table for keeping track of include files
26
26
 
27
27
  `
28
+ #(ly:set-option 'relative-includes #t)
29
+ \include "{{Lyp::LYP_LY_LIB_PATH}}"
30
+
28
31
  #(begin
29
32
  (define lyp:input-filename "{{user_filename}}")
30
33
  (define lyp:input-dirname "{{user_dirname}}")
31
34
  (define lyp:current-package-dir "{{current_package_dir}}")
32
- (define lyp:package-refs (make-hash-table))`
35
+ `
33
36
 
34
- _[:package_paths].each do |spec, path|
37
+ _[:package_refs].each do |spec, path|
35
38
  `
36
39
  (hash-set! lyp:package-refs "{{spec}}" "{{path}}")`
37
40
  end
38
41
 
39
- # package-loaded is hash table used for tracking loaded packages, so each
40
- # package is loaded only once.
41
-
42
- # package-loaded is hash table used for tracking loaded packages, so each
43
- # package is loaded only once.
44
-
45
- `
46
- (define lyp:package-loaded (make-hash-table))
47
- (define lyp:file-included (make-hash-table))
48
- )
49
- `
50
-
51
- # define the \require command for loading packages
52
- `
53
- require = #(define-void-function (parser location package)(string?)
54
- (let*
55
- (
56
- (path (hash-ref lyp:package-refs package))
57
- (loaded? (hash-ref lyp:package-loaded path))
58
- (package-dir (dirname path))
59
- (prev-package-dir lyp:current-package-dir)
60
- )
61
- (if (and path (not loaded?)) (begin
62
- (if (not (file-exists? path)) (
63
- (ly:error "Failed to load package ~a (file not found ~a)" package path)
64
- ))
65
- (ly:debug "Loading package ~a at ~a" package package-dir)
66
- (set! lyp:current-package-dir package-dir)
67
- (hash-set! lyp:package-loaded path #t)
68
- #{ \include #path #}
69
- (set! lyp:current-package-dir prev-package-dir)
70
- ))
71
- )
72
- )
42
+ _[:package_dirs].each do |package, path|
73
43
  `
44
+ (hash-set! lyp:package-dirs "{{package}}" "{{path}}")`
45
+ end
74
46
 
75
- # define the \pinclude command for including files inside the current package
76
-
77
- `
78
- pinclude = #(define-void-function (parser location path)(string?)
79
- (let*
80
- (
81
- (full-path (format "~a/~a" lyp:current-package-dir path))
82
- )
83
- (begin
84
- (if (not (file-exists? full-path)) (
85
- (ly:error "File not found ~a" full-path)
86
- ))
87
- (hash-set! lyp:file-included full-path #t)
88
- #{ \include #full-path #}
89
- )
90
- )
91
- )
92
-
93
- pincludeOnce = #(define-void-function (parser location path)(string?)
94
- (let*
95
- (
96
- (full-path (format "~a/~a" lyp:current-package-dir path))
97
- (loaded? (hash-ref lyp:file-included full-path))
98
- )
99
- (if (and full-path (not loaded?)) (begin
100
- (if (not (file-exists? full-path)) (
101
- (ly:error "File not found ~a" full-path)
102
- ))
103
- (hash-set! lyp:file-included full-path #t)
104
- #{ \include #full-path #}
105
- ))
106
- )
107
- )
108
- `
109
47
 
110
- # define the \pload scheme function, for loading scheme files inside the current
111
- # package
112
48
  `
113
- #(define (pload path)
114
- (let*
115
- (
116
- (full-path (format "~a/~a" lyp:current-package-dir path))
117
- )
118
- (load full-path)
119
- )
120
49
  )
121
- `
122
50
 
123
- # load the user's file
124
- `
125
- #(ly:set-option 'relative-includes #t)
126
51
  #(ly:debug "package loader is ready")
127
52
  \include "{{user_filename}}"
128
53
  `
data/lib/lyp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Lyp
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
data/lib/lyp/wrapper.rb CHANGED
@@ -11,7 +11,7 @@ module Lyp
11
11
  # copy current_package_dir option
12
12
  r[:current_package_dir] = opts[:current_package_dir]
13
13
 
14
- if !r[:package_paths].empty? || opts[:force_wrap]
14
+ if !r[:package_dirs].empty? || opts[:force_wrap]
15
15
  FileUtils.mkdir_p('/tmp/lyp/wrappers')
16
16
  fn = "/tmp/lyp/wrappers/#{File.basename(fn)}"
17
17
 
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.2.0
4
+ version: 0.2.1
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-27 00:00:00.000000000 Z
11
+ date: 2016-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -137,6 +137,7 @@ files:
137
137
  - lib/lyp/base.rb
138
138
  - lib/lyp/cli.rb
139
139
  - lib/lyp/etc/font.scm
140
+ - lib/lyp/etc/lyp.ly
140
141
  - lib/lyp/git_based_rugged.rb
141
142
  - lib/lyp/lilypond.rb
142
143
  - lib/lyp/package.rb