squared 0.5.23 → 0.6.0

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.
@@ -6,10 +6,28 @@ require 'rake'
6
6
  module Squared
7
7
  module Common
8
8
  module System
9
+ class << self
10
+ private
11
+
12
+ def parse_link(val)
13
+ case val
14
+ when ::TrueClass, 's'
15
+ 1
16
+ when 'r'
17
+ 2
18
+ when 'h'
19
+ 3
20
+ else
21
+ raise ArgumentError, "unrecognized 'link' flag: #{val}" if val
22
+
23
+ 0
24
+ end
25
+ end
26
+ end
27
+
9
28
  module_function
10
29
 
11
30
  def shell(*args, name: :system, **kwargs)
12
- kwargs.delete(:exception) unless name == :system
13
31
  if RUBY_ENGINE == 'jruby' && Rake::Win32.windows?
14
32
  e = kwargs[:exception]
15
33
  if (dir = kwargs[:chdir]) && ((pwd = Dir.pwd) != dir)
@@ -25,16 +43,16 @@ module Squared
25
43
  else
26
44
  return Kernel.send(name, *args, **kwargs)
27
45
  end
28
- return ret unless e && !ret
46
+ return ret unless e && !ret && name == :system
29
47
 
30
48
  raise $?.to_s
31
49
  end
32
50
 
33
- def copy_dir(src, dest, glob = ['**/*'], create: false, link: nil, force: false, pass: nil, hidden: false,
34
- verbose: true)
51
+ def copy_dir(src, dest, glob = ['**/*'], create: false, link: nil, preserve: nil, force: false, verbose: true,
52
+ pass: nil, hidden: false)
35
53
  base = Pathname.new(src)
36
54
  target = Pathname.new(dest)
37
- raise "#{target.cleanpath} (not found)" if !create && !target.parent.exist?
55
+ raise Errno::ENOENT, dest.cleanpath.to_s unless create || target.parent.exist?
38
56
 
39
57
  subdir = {}
40
58
  target.mkpath if create
@@ -58,53 +76,67 @@ module Squared
58
76
  end
59
77
  count = 0
60
78
  soft = 0
79
+ type = System.send :parse_link, link
61
80
  subdir.each do |dir, files|
62
- if link
63
- files.dup.tap do |items|
64
- files.clear
65
- items.each do |file|
66
- if file.exist?
67
- if !file.symlink?
68
- files << file
69
- elsif !force
70
- next
71
- end
72
- end
73
- if link == 'hard'
74
- FileUtils.ln(file, dir, force: force, verbose: false)
75
- else
76
- FileUtils.ln_s(file, dir, force: force, verbose: false)
81
+ unless type == 0
82
+ items = files.dup
83
+ files.clear
84
+ items.each do |file|
85
+ if file.exist?
86
+ if !file.symlink?
87
+ files << file
88
+ elsif !force
89
+ next
77
90
  end
78
- soft += 1
79
91
  end
92
+ case type
93
+ when 1
94
+ FileUtils.ln_s(file, dir, force: force, verbose: false)
95
+ when 2
96
+ FileUtils.ln_s(file.relative_path_from(dir), dir, force: force, verbose: false)
97
+ else
98
+ FileUtils.ln(file, dir, force: force, verbose: false)
99
+ end
100
+ soft += 1
80
101
  end
81
102
  end
82
103
  next if files.empty?
83
104
 
84
- out = FileUtils.cp(files, dir, verbose: false)
105
+ out = FileUtils.cp(files, dir, preserve: preserve, verbose: false)
85
106
  count += out.size
86
107
  end
87
108
  puts [target.realpath, subdir.size, soft > 0 ? "#{count}+#{soft}" : count].join(' => ') if verbose
88
109
  end
89
110
 
90
- def copy_guard(src, dest, link: nil, force: false, verbose: true)
91
- unless force
92
- target = Pathname.new(dest)
93
- if target.directory?
94
- src = Array(src).reject { |val| target.join(File.basename(val)).exist? }
95
- return if src.empty?
96
- elsif target.exist?
97
- return
111
+ def copy_guard(*src, dest, base: '.', create: false, link: nil, preserve: nil, force: false, verbose: true)
112
+ src = src.compact.flatten
113
+ dest = Pathname.new(dest).realdirpath
114
+ base = Pathname.new(base).realpath
115
+ dir = if dest.directory?
116
+ true
117
+ elsif src.size > 1
118
+ raise Errno::ENOENT, dest.cleanpath.to_s unless create && !dest.exist?
119
+
120
+ dest.mkpath
121
+ true
122
+ end
123
+ targets = src.map! { |file| [base + file, dir ? dest + File.basename(file) : dest] }
124
+ return if !force && (targets = targets.reject { |to| to[1].exist? }).empty?
125
+
126
+ type = System.send :parse_link, link
127
+ targets.each do |file, to|
128
+ case type
129
+ when 0
130
+ FileUtils.cp(file, to, preserve: preserve, verbose: verbose)
131
+ when 1
132
+ FileUtils.ln_s(file, to, force: force, verbose: verbose)
133
+ when 2
134
+ FileUtils.ln_s(file.relative_path_from(dir ? to.dirname : to), to, force: force, verbose: verbose)
135
+ else
136
+ FileUtils.ln(file, to, force: force, verbose: verbose)
98
137
  end
99
138
  end
100
- case link
101
- when 'hard', 1
102
- FileUtils.ln(src, dest, force: force, verbose: verbose)
103
- when ::TrueClass, 'soft', 0
104
- FileUtils.ln_s(src, dest, force: force, verbose: verbose)
105
- else
106
- FileUtils.cp(src, dest, verbose: verbose)
107
- end
139
+ nil
108
140
  end
109
141
  end
110
142
  end
@@ -9,21 +9,44 @@ module Squared
9
9
  module Utils
10
10
  module_function
11
11
 
12
- def split_escape(val, char: ',')
13
- val.split(/\s*(?<!\\)#{char}\s*/)
12
+ def as_a(obj, *meth, flat: nil, compact: false, &blk)
13
+ return [] if obj.nil?
14
+
15
+ unless obj.is_a?(::Array)
16
+ obj = if obj.respond_to?(:to_ary)
17
+ obj.to_ary
18
+ elsif obj.respond_to?(:to_a) && !obj.is_a?(::Hash) && (val = obj.to_a).is_a?(::Array)
19
+ val
20
+ else
21
+ [obj]
22
+ end
23
+ end
24
+ obj = flat.is_a?(::Numeric) ? obj.flatten(flat) : obj.flatten if flat
25
+ obj = obj.compact if compact
26
+ obj = obj.map(&meth.shift) until meth.empty?
27
+ return obj unless block_given?
28
+
29
+ obj.select(&blk)
30
+ end
31
+
32
+ def split_escape(val, char: ',', &blk)
33
+ ret = val.split(/\s*(?<!\\)#{char}\s*/)
34
+ return ret unless block_given?
35
+
36
+ ret.each(&blk)
14
37
  end
15
38
 
16
39
  def split_option(val)
17
40
  val = val.strip
18
41
  return [val, '', ''] unless (i = val.index('='))
19
42
 
20
- last = val[(i + 1)..-1].strip
43
+ last = val[i.succ..-1].strip
21
44
  quote = ''
22
45
  if last =~ /\A(["'])(.+)\1\z/
23
46
  last = $2
24
47
  quote = $1
25
48
  end
26
- [val[0..(i - 1)], last, quote]
49
+ [val[0..i.pred], last, quote]
27
50
  end
28
51
 
29
52
  def task_invoke(*cmd, args: [], exception: true, warning: true)
@@ -105,9 +128,9 @@ module Squared
105
128
  end
106
129
  end
107
130
 
108
- def env(key, default = nil, suffix: nil, strict: false, equals: nil, ignore: nil)
131
+ def env(key, default = nil, suffix: nil, strict: false, equals: nil, ignore: nil, **)
109
132
  ret = env_value(key, suffix: suffix, strict: strict)
110
- return ret == equals.to_s unless equals.nil?
133
+ return Array(equals).any? { |val| val.to_s == ret } unless equals.nil?
111
134
 
112
135
  ret.empty? || (ignore && Array(ignore).any? { |val| val.to_s == ret }) ? default : ret
113
136
  end
@@ -12,18 +12,19 @@ module Squared
12
12
  include Rake::DSL
13
13
 
14
14
  class << self
15
- def parse(gem, namespace, ext = [gem])
15
+ def parse(gem, namespace, ext = [pkg])
16
16
  require gem
17
- [eval(namespace), Array(ext)].tap do |data|
18
- data.last.each { |key| @@mime_obj[key] = data }
19
- end
17
+ obj = eval namespace
18
+ Array(ext).each { |val| @@mime_obj[val] = [obj, ext] }
20
19
  rescue LoadError, NameError => e
21
20
  warn e
22
21
  nil
22
+ else
23
+ @@mime_obj[ext.first]
23
24
  end
24
25
 
25
- def link(project, main = project.dependfile&.basename, name = nil, **kwargs, &blk)
26
- return unless project.enabled? && main
26
+ def link(project, main = project.dependfile.basename, name = nil, **kwargs, &blk)
27
+ return unless project.enabled?
27
28
 
28
29
  ret = new(main, name, project: project, **kwargs)
29
30
  ret.instance_eval(&blk) if block_given?
@@ -85,7 +86,7 @@ module Squared
85
86
  ['path not found', realpath]
86
87
  else
87
88
  @required = true
88
- project ? [project, 'not found'] : %w[name missing]
89
+ project ? [project, 'missing'] : %w[name missing]
89
90
  end
90
91
  warn log_message(Logger::WARN, msg, subject: self.class, hint: hint)
91
92
  end
@@ -105,7 +106,7 @@ module Squared
105
106
  next unless (data = Viewer.parse(type, type.upcase, ext))
106
107
  end
107
108
  obj, ext = data
108
- target = file || target? ? file || realpath : nil
109
+ target = file || (realpath if target?)
109
110
 
110
111
  task_desc(command, *ext, target: target)
111
112
  task type, [:keys] do |_, args|
@@ -159,7 +160,7 @@ module Squared
159
160
  end
160
161
 
161
162
  def also(path, type = nil, name: nil, **kwargs)
162
- return self unless (file = basepath(path)).exist? && !@mime.frozen?
163
+ return self if @mime.frozen? || !(file = basepath(path)).exist?
163
164
 
164
165
  ext = mimetype file
165
166
  type ||= ext
@@ -204,7 +205,7 @@ module Squared
204
205
 
205
206
  def read_keys(reader, type, file, keys, ext: [type], opts: {})
206
207
  if file && (mime = mimetype(file)) && basepath(file).exist?
207
- raise_error(file, mime, hint: 'invalid') unless ext.include?(mime)
208
+ raise_error file, mime, hint: 'invalid' unless ext.include?(mime)
208
209
  else
209
210
  if ext.include?(mime)
210
211
  alt = file
@@ -219,7 +220,7 @@ module Squared
219
220
  args = { hint: 'no keys' }
220
221
  end
221
222
  unless file
222
- args ||= { hint: 'not found', kind: LoadError }
223
+ args ||= { kind: Errno::ENOENT }
223
224
  raise_error(reader.name, "#{File.basename(alt, '.*')}.#{ext.first}", **args)
224
225
  end
225
226
  end
@@ -236,22 +237,18 @@ module Squared
236
237
  title = Pathname.new(file)
237
238
  .realpath
238
239
  .to_s
239
- .sub(/\A#{Regexp.escape(File.join(Dir.pwd, ''))}/, '')
240
+ .sub(/^#{Regexp.escape(File.join(Dir.pwd, ''))}/, '')
240
241
  emphasize(lines, title: title, sub: unless stdin?
241
242
  [
242
- { pat: /\A((?:[^:]|(?<! ):(?! ))+)\z/, styles: theme[:banner] },
243
- { pat: /\A(.*?)(<[^>]+>)(.+)\z/m, styles: theme[:undefined], index: 2 },
244
- { pat: /\A((?~ : ))( : (?!undefined).+)\z/m, styles: theme[:key] },
245
- { pat: /\A((?~: ): )(-?[\d.]+)(\s*)\z/m, styles: theme[:number],
246
- index: 2 },
247
- { pat: /\A((?~: ): ")(.+)("\s*)\z/m, styles: theme[:string], index: 2 },
248
- { pat: /\A((?~: ): \{)(.+)(}\s*)\z/m, styles: theme[:hash], index: 2 },
249
- { pat: /\A((?~: ): \[)(.+)(\]\s*)\z/m, styles: theme[:array],
250
- index: 2 },
251
- { pat: /\A((?~: ): )(true|false)(\s*)\z/m, styles: theme[:boolean],
252
- index: 2 },
253
- { pat: /\A((?~: ): (?!undefined))([^"\[{].*)\z/m, styles: theme[:value],
254
- index: 2 }
243
+ opt_style(theme[:banner], /\A((?:[^:]|(?<! ):(?! ))+)\z/),
244
+ opt_style(theme[:undefined], /\A(.*?)(<[^>]+>)(.+)\z/m, 2),
245
+ opt_style(theme[:key], /\A((?~ : ))( : (?!undefined).+)\z/m),
246
+ opt_style(theme[:number], /\A((?~: ): )(-?[\d.]+)(\s*)\z/m, 2),
247
+ opt_style(theme[:string], /\A((?~: ): ")(.+)("\s*)\z/m, 2),
248
+ opt_style(theme[:hash], /\A((?~: ): \{)(.+)(\}\s*)\z/m, 2),
249
+ opt_style(theme[:array], /\A((?~: ): \[)(.+)(\]\s*)\z/m, 2),
250
+ opt_style(theme[:boolean], /\A((?~: ): )(true|false)(\s*)\z/m, 2),
251
+ opt_style(theme[:value], /\A((?~: ): (?!undefined))([^"\[{].*)\z/m, 2)
255
252
  ]
256
253
  end, border: theme[:border])
257
254
  end
@@ -262,7 +259,7 @@ module Squared
262
259
  symbolize = opts[:symbolize_names]
263
260
  keys.each do |key|
264
261
  begin
265
- items = key.split('.').flat_map { |name| name =~ /^(.+)\[(\d+)\]$/ ? [$1, $2.to_i] : name }
262
+ items = key.split('.')
266
263
  items = items.map(&:to_sym) if symbolize
267
264
  val = data.dig(*items)
268
265
  if val.nil?
@@ -293,7 +290,7 @@ module Squared
293
290
  if stdin?
294
291
  puts out.map!(&:last).join("\n")
295
292
  else
296
- out.map! { |a, b| '%-*s : %s' % [pad, a, b] }
293
+ out.map! { |item| '%-*s : %s' % [pad, item[0], item[1]] }
297
294
  end
298
295
  end
299
296
 
@@ -308,7 +305,7 @@ module Squared
308
305
  def task_desc(command, *ext, target: nil)
309
306
  return unless Rake::TaskManager.record_task_metadata
310
307
 
311
- val = "#{ext.first}[#{target ? '' : "file?=#{File.basename(main)}.#{ext.last},"}keys+]"
308
+ val = "#{ext.first}[#{"file?=#{File.basename(main)}.#{ext.last}," if target}keys+]"
312
309
  args = *name.split(':').push(command, val)
313
310
  if project
314
311
  project.workspace.task_desc(*args)
@@ -322,9 +319,7 @@ module Squared
322
319
  end
323
320
 
324
321
  def warning?
325
- return true unless project
326
-
327
- project.workspace.warning
322
+ project ? project.workspace.warning : true
328
323
  end
329
324
 
330
325
  def stdin?
@@ -349,9 +344,7 @@ module Squared
349
344
  end
350
345
 
351
346
  def basepath(*args)
352
- return Pathname.pwd.join(*args) unless project
353
-
354
- project.basepath(*args)
347
+ project ? project.basepath(*args) : Pathname.pwd.join(*args)
355
348
  end
356
349
  end
357
350
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Squared
4
- VERSION = '0.5.23'
4
+ VERSION = '0.6.0'
5
5
  end