squared 0.0.12 → 0.1.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
  SHA256:
3
- metadata.gz: 2d9e8c772c9f4d0ce5c54dbeb1b9583d2e477f155036faf34cfc547659c34ec4
4
- data.tar.gz: 87de412a78c0071eabd4b26713cbf84978a92fca6ea1a6dfe18653ddf22c90ee
3
+ metadata.gz: e2fd23c5964fe7c987966b8d237b569883b2dae5b70d9c120a924e2cc0227873
4
+ data.tar.gz: 8ef09d80e13c53fda678aa6a7194e33abf04728fb9d1c17739a5dc6c814e3b03
5
5
  SHA512:
6
- metadata.gz: '08475f426b15c41dab20fbead5d7c1ead70f5d80384e0a0772cbe7b101512a4402a1bb1231b2550f7da16aac2796f8411f6a6e3e570ae728d59b03f88fea5960'
7
- data.tar.gz: 5c0334640b20dda82641925cd94b41d76be4cd4e603355fef593a5cd69731ac926febab67f3ffa494267291ec9d89efba2f8a9ac4dde978ab2814a0f8a481a67
6
+ metadata.gz: c41b98512dfc370a056716c3af2a599321b6113fa4883ab1f9c6b1418332f6b973560ce2cb1550c3813521eaa326150371ef3e60906cb694d6a6fd41ac1e0f05
7
+ data.tar.gz: cedbdcb188a6fb4a8407fc36836ffbeb4b93893217cec168d291845ce9a4f3f4dede9936022b8c950efa48ec21e2f93d013dc7e6fa929397ac80df7d6e3b099a
data/CHANGELOG.md ADDED
@@ -0,0 +1,55 @@
1
+ # Changelog
2
+
3
+ ## [0.1.1] - 2024-12-14
4
+
5
+ ### Added
6
+
7
+ - Node package manager update command was implemented.
8
+ - Git pull and fetch retrieve options were expanded.
9
+
10
+ ### Changed
11
+
12
+ - Git show does not require an object argument.
13
+ - Project base class is implemented through Application.
14
+
15
+ ### Fixed
16
+
17
+ - Listing tasks did not check for rake -C option availability.
18
+ - Listing gems did not check for gem -C option availability.
19
+ - Disabled extension tasks by individual project were being created.
20
+ - Git commit did not locate origin from nested branches.
21
+ - Project clean command used incompatible folder delete option.
22
+ - Rake did not set original dir when calling itself.
23
+ - Rake did not set original rakefile when calling itself.
24
+ - Extended tasks were not associated to their supporting class method.
25
+
26
+ ## [0.1.0] - 2024-12-7
27
+
28
+ ### Added
29
+
30
+ - Git command show was implemented.
31
+ - Projects can run arbitrarily ordered graphs.
32
+ - Repo can be installed from a nested directory without a Rakefile.
33
+ - Python interpreter can be set using ENV option PIP_PYTHON.
34
+ - Node workspaces can be copied by registry package name.
35
+
36
+ ### Changed
37
+
38
+ - Parallel tasks support using Regexp patterns.
39
+ - Project copy globs were renamed include and exclude.
40
+
41
+ ### Fixed
42
+
43
+ - Project workspaces did not detect for a valid directory.
44
+ - Git pull did not display colors for diff bar chart.
45
+ - Git commit did not fetch latest refs before submitting.
46
+
47
+ ## [0.0.12] - 2024-12-1
48
+
49
+ ### Added
50
+
51
+ - Changelog was created.
52
+
53
+ [0.1.1]: https://github.com/anpham6/squared/releases/tag/v0.1.1-ruby
54
+ [0.1.0]: https://github.com/anpham6/squared/releases/tag/v0.1.0-ruby
55
+ [0.0.12]: https://github.com/anpham6/squared/releases/tag/v0.0.12-ruby
data/README.md CHANGED
@@ -108,7 +108,7 @@ Workspace management uses [Ruby](https://www.ruby-lang.org/en/documentation/inst
108
108
  mkdir workspaces
109
109
  cd workspaces # REPO_ROOT
110
110
 
111
- wget https://raw.githubusercontent.com/anpham6/squared/master/Rakefile
111
+ wget https://unpkg.com/squared/Rakefile
112
112
 
113
113
  rake -T # List tasks
114
114
 
@@ -129,10 +129,17 @@ REPO_ROOT=/tmp/123 NODE_INSTALL=pnpm repo:init
129
129
  ```sh
130
130
  # NODE_TAG=latest
131
131
  # RUBY_VERSION=2.4.0-3.3.0
132
+ # MANIFEST=nightly,staging,prod,android
132
133
  # BUILD={dev,prod}
133
134
  # DEV={0,1,local}
134
- # DOCS=1
135
+ # DOCS=any
136
+ # PIPE_FAIL={0,1}
135
137
  docker build -t squared --build-arg MANIFEST=prod --build-arg SQUARED=prod .
138
+ docker build -t node --build-arg NODE_TAG=20 --build-arg NODE_INSTALL=pnpm -f Dockerfile.slim . # no docs
139
+ # OR
140
+ # RUBY_TAG=latest
141
+ # NODE_VERSION=22.x
142
+ docker build -t ruby --build-arg RUBY_TAG=3.0 --build-arg NODE_VERSION=20.x --build-arg PIPE_FAIL=0 -f Dockerfile.ruby .
136
143
 
137
144
  # Express
138
145
  docker run -it --name express --rm -p 127.0.0.1:80:80 \
data/README.ruby.md CHANGED
@@ -20,6 +20,7 @@ gem install squared
20
20
 
21
21
  * [Repo](https://source.android.com/docs/setup/reference/repo)
22
22
  * Python 3.6
23
+ * Not compatible with Windows
23
24
 
24
25
  ```sh
25
26
  mkdir -p ~/.bin
@@ -30,7 +31,7 @@ chmod a+rx ~/.bin/repo
30
31
 
31
32
  ## Example - Rakefile
32
33
 
33
- Projects from any accessible folder can be added either relative to `REPO_ROOT` or absolutely. The same Rakefile can also manage other similarly cloned repositories remotely by setting the `REPO_ROOT` environment variable to the location. Missing projects will simply be excluded from the task runner.
34
+ Projects from any accessible folder can be added relative to the parent directory (e.g. *REPO_ROOT*) or absolutely. The same Rakefile can also manage other similarly cloned `Repo` repositories remotely by setting the `REPO_ROOT` environment variable to the location. Missing projects will simply be excluded from the task runner.
34
35
 
35
36
  ```ruby
36
37
  require "squared"
@@ -45,7 +46,7 @@ require "squared/app" # All workspace related modules
45
46
 
46
47
  # NODE_ENV = production
47
48
  # REPO_ROOT = /workspaces
48
- # REPO_HOME = /workspaces/squared (Dir.pwd)
49
+ # REPO_HOME = /workspaces/squared
49
50
  # rake = /workspaces/squared/Rakefile
50
51
  # pathname = /workspaces/pathname
51
52
  # optparse = /workspaces/optparse
@@ -88,7 +89,7 @@ Workspace::Application
88
89
  variable_set :clean, ["build/sqd/"]
89
90
  end
90
91
  .style("banner", 255.255) # 256 colors (fg | fg.bg | -0.bg)
91
- .build(default: "status", parallel: ["pull", "fetch", "rebase", "copy", "clean", "outdated:ruby"]) do |workspace|
92
+ .build(default: "build", parallel: ["pull", "fetch", "rebase", "copy", "clean", /^outdated:/]) do |workspace|
92
93
  workspace
93
94
  .enable_aixterm
94
95
  .style({
@@ -130,12 +131,13 @@ Workspace::Application
130
131
  ```ruby
131
132
  Workspace::Application
132
133
  .new(main: "squared")
134
+ .graph(["depend"], ref: :git) # Optional
133
135
  .with(:python) do
134
136
  add("android-docs", "android")
135
137
  add("chrome-docs", "chrome", graph: "android")
136
138
  end
137
139
  .with(:node) do
138
- graph(["build", "copy"]) # Optional
140
+ graph(["build", "copy"]) # Overrides "git"
139
141
  add("e-mc", "emc")
140
142
  add("pi-r", "pir", graph: "emc")
141
143
  add("squared-express", "express", graph: "pir")
@@ -15,7 +15,7 @@ module Squared
15
15
  def_delegators :@data, :+, :each, :each_with_index, :entries, :to_a, :include?
16
16
 
17
17
  def initialize(data = [])
18
- @data = ::Set.new(data)
18
+ @data = Set.new(data)
19
19
  end
20
20
 
21
21
  def add(val)
@@ -29,7 +29,7 @@ module Squared
29
29
  alias inspect to_s
30
30
  end
31
31
 
32
- class JoinSet < ::Set
32
+ class JoinSet < Set
33
33
  def self.to_s
34
34
  super.match(/[^:]+$/)[0]
35
35
  end
@@ -94,7 +94,7 @@ module Squared
94
94
  ret = wrap.(ret, code) unless code.empty?
95
95
  return ret unless data
96
96
 
97
- out = +''
97
+ out = ''.dup
98
98
  data.to_a.each_with_index do |group, i|
99
99
  next if i == 0
100
100
 
@@ -20,17 +20,21 @@ module Squared
20
20
  end
21
21
  end
22
22
 
23
- def copy_d(src, dest, glob: ['**/*'], create: false, verbose: true)
23
+ def copy_d(src, dest, glob: ['**/*'], pass: nil, create: false, verbose: true)
24
24
  src = ::Pathname.new(src)
25
25
  dest = ::Pathname.new(dest)
26
- raise "#{dest} (not found)" if !create && !dest.exist?
26
+ raise "#{dest} (not found)" if !create && !dest.parent.exist?
27
27
 
28
28
  subdir = []
29
29
  files = 0
30
30
  dest.mkpath if create
31
+ if pass
32
+ exclude = []
33
+ (pass.is_a?(::Array) ? pass : [pass]).each { |val| exclude += ::Dir.glob(src.join(val)) }
34
+ end
31
35
  (glob.is_a?(::Array) ? glob : [glob]).each do |val|
32
36
  ::Dir.glob(src.join(val)) do |path|
33
- next if (path = ::Pathname.new(path)).directory?
37
+ next if exclude&.include?(path) || (path = ::Pathname.new(path)).directory?
34
38
 
35
39
  target = dest.join(path.relative_path_from(src))
36
40
  dir = target.dirname
@@ -27,8 +27,12 @@ module Squared
27
27
  end
28
28
  end
29
29
 
30
- def task_invoked?(name)
31
- ::Rake::Task.tasks.any? { |obj| obj.already_invoked && obj.name == name }
30
+ def task_invoked?(*args)
31
+ ::Rake::Task.tasks.any? do |obj|
32
+ next unless obj.already_invoked
33
+
34
+ args.any? { |val| val.is_a?(::Regexp) ? val.match?(obj.name) : val == obj.name }
35
+ end
32
36
  end
33
37
 
34
38
  def env(key, default = nil, suffix: @envname, equals: nil, ignore: nil)
@@ -9,7 +9,7 @@ module Squared
9
9
  class Viewer
10
10
  include Common::Format
11
11
  include Utils
12
- include ::Rake::DSL
12
+ include Rake::DSL
13
13
 
14
14
  def self.to_s
15
15
  super.match(/[^:]+$/)[0]
@@ -51,7 +51,7 @@ module Squared
51
51
  ['path not found', realpath]
52
52
  else
53
53
  @required = true
54
- project ? [project, 'not found'] : %w[name missing]
54
+ project ? [project, 'not found'] : ['name', 'missing']
55
55
  end
56
56
  warn log_message(:warn, msg, subject: self.class, hint: hint)
57
57
  end
@@ -63,18 +63,18 @@ module Squared
63
63
  view = @command && @command != name ? @command : 'view'
64
64
  params = ->(args) { exist? ? [realpath, [args.keys] + args.extras] : [args.keys, args.extras] }
65
65
  namespace view do
66
- if @mime['json'] && (exist? || !::Rake::Task.task_defined?("#{ns}:#{view}:json"))
66
+ if @mime['json'] && (exist? || !Rake::Task.task_defined?("#{ns}:#{view}:json"))
67
67
  desc format_desc(view, 'json')
68
68
  task 'json', [:keys] do |_, args|
69
69
  read_keys(JSON, 'json', *params.(args))
70
70
  end
71
71
  end
72
72
 
73
- if @mime['yaml'] && (exist? || !::Rake::Task.task_defined?("#{ns}:#{view}:yaml"))
73
+ if @mime['yaml'] && (exist? || !Rake::Task.task_defined?("#{ns}:#{view}:yaml"))
74
74
  desc format_desc(view, 'yaml', 'yml')
75
75
  task 'yaml', [:keys] do |_, args|
76
76
  require 'yaml'
77
- read_keys(YAML, 'yaml', *params.(args), ext: %w[yml yaml])
77
+ read_keys(YAML, 'yaml', *params.(args), ext: ['yml', 'yaml'])
78
78
  end
79
79
  end
80
80
  end
@@ -120,7 +120,7 @@ module Squared
120
120
  def also(path, type = nil, name: nil, gem: nil, parse: nil, opts: {})
121
121
  return self if @mime.frozen? || !(file = basepath(path)).exist?
122
122
 
123
- ext = mime_type(file)
123
+ ext = mimetype(file)
124
124
  type = type&.to_s || ext
125
125
  unless parse
126
126
  case type
@@ -140,6 +140,12 @@ module Squared
140
140
  self
141
141
  end
142
142
 
143
+ def enabled?
144
+ return File.exist?(realpath) if exist?
145
+
146
+ !@required || !!project&.enabled?
147
+ end
148
+
143
149
  def extensions
144
150
  exist? ? [@ext.sub('.', '')] : @mime.keys
145
151
  end
@@ -154,12 +160,6 @@ module Squared
154
160
  "#<#{self.class}: #{name} => #{exist? ? realpath : "#{main} {#{extensions.join(', ')}}"}>"
155
161
  end
156
162
 
157
- def enabled?
158
- return File.exist?(realpath) if exist?
159
-
160
- !@required || !!project&.enabled?
161
- end
162
-
163
163
  private
164
164
 
165
165
  def puts(*args)
@@ -167,7 +167,7 @@ module Squared
167
167
  end
168
168
 
169
169
  def read_keys(reader, type, file, keys, ext: [type])
170
- if file && (mime = mime_type(file)) && basepath(file).exist?
170
+ if file && (mime = mimetype(file)) && basepath(file).exist?
171
171
  raise_error(file, mime, hint: 'invalid') unless ext.include?(mime)
172
172
  else
173
173
  if ext.include?(mime)
@@ -227,7 +227,7 @@ module Squared
227
227
  if val.nil?
228
228
  val = data
229
229
  items.each do |name|
230
- raise name unless val.is_a?(::Hash) && val.key?(name)
230
+ raise name unless val.is_a?(Hash) && val.key?(name)
231
231
 
232
232
  val = val[name]
233
233
  end
@@ -256,15 +256,28 @@ module Squared
256
256
  end
257
257
  end
258
258
 
259
- def basepath(file)
260
- project ? project.basepath(file) : Pathname.new(file).realdirpath
261
- end
262
-
263
259
  def task_name(val)
264
260
  @prefix ? "#{@prefix}:#{val}" : val.to_s
265
261
  end
266
262
 
267
- def mime_type(file)
263
+ def format_desc(command, *ext, exist: exist?)
264
+ val = "#{ext.first}[#{exist ? '' : "file?=#{File.basename(main)}.#{ext.last},"}keys+]"
265
+ message(@prefix, *name.split(':'), command, val, empty: true)
266
+ end
267
+
268
+ def exist?
269
+ !@ext.empty? && (!@required || !project.nil?)
270
+ end
271
+
272
+ def warning?
273
+ project ? project.workspace.warning : true
274
+ end
275
+
276
+ def stdin?
277
+ pipe == 0
278
+ end
279
+
280
+ def mimetype(file)
268
281
  case (ret = File.extname(file).sub('.', '').downcase)
269
282
  when 'yml'
270
283
  'yaml'
@@ -277,25 +290,12 @@ module Squared
277
290
  end
278
291
  end
279
292
 
280
- def format_desc(command, *ext, exist: exist?)
281
- val = "#{ext.first}[#{exist ? '' : "file?=#{File.basename(main)}.#{ext.last},"}keys+]"
282
- message(@prefix, *name.split(':'), command, val, empty: true)
283
- end
284
-
285
293
  def realpath
286
294
  basepath(file = main + @ext).to_s rescue file
287
295
  end
288
296
 
289
- def exist?
290
- !@ext.empty? && (!@required || !project.nil?)
291
- end
292
-
293
- def warning?
294
- project ? project.workspace.warning : true
295
- end
296
-
297
- def stdin?
298
- pipe == 0
297
+ def basepath(file)
298
+ project ? project.basepath(file) : Pathname.new(file).realdirpath
299
299
  end
300
300
  end
301
301
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Squared
4
- VERSION = '0.0.12'
4
+ VERSION = '0.1.1'
5
5
  end
@@ -5,7 +5,7 @@ module Squared
5
5
  class Application
6
6
  include Common::Format
7
7
  include Utils
8
- include ::Rake::DSL
8
+ include Rake::DSL
9
9
 
10
10
  SCRIPT_OBJ = {
11
11
  run: nil,
@@ -18,12 +18,19 @@ module Squared
18
18
  private_constant :SCRIPT_OBJ
19
19
 
20
20
  class << self
21
- def implement(*objs)
21
+ def implement(*objs, base: false)
22
+ return if base && objs.size > 1
23
+
22
24
  objs.each do |obj|
23
- next unless obj < impl_project
25
+ next unless base || obj < impl_project
24
26
 
25
- kind_project.unshift(obj)
26
- obj.tasks&.each { |task| impl_series.add(task, obj) }
27
+ if base
28
+ @impl_project = obj
29
+ impl_series.base_set(obj)
30
+ else
31
+ kind_project.unshift(obj)
32
+ obj.tasks&.each { |task| impl_series.add(task, obj) }
33
+ end
27
34
  if (args = obj.batchargs)
28
35
  impl_series.batch(*args)
29
36
  end
@@ -71,12 +78,12 @@ module Squared
71
78
  @extensions = []
72
79
  @pipe = env_pipe(pipe, (ARG[:OUT] && env(ARG[:OUT])) || 1, root: @home)
73
80
  @exception = env_bool(exception)
74
- @verbose = env_bool(verbose, verbose.nil? || verbose.is_a?(::String) ? @pipe != 0 : verbose)
81
+ @verbose = env_bool(verbose, verbose.nil? || verbose.is_a?(String) ? @pipe != 0 : verbose)
75
82
  @warning = @verbose != false
76
83
  @closed = false
77
84
  if common
78
85
  @theme = __get__(:theme)[:workspace]
79
- ARG[:COLOR] = false if @pipe == 0 || @pipe.is_a?(::Pathname)
86
+ ARG[:COLOR] = false if @pipe == 0 || @pipe.is_a?(Pathname)
80
87
  else
81
88
  @theme = {}
82
89
  end
@@ -95,7 +102,7 @@ module Squared
95
102
 
96
103
  def initialize_session
97
104
  @envname = @main.gsub(/[^\w]+/, '_').upcase.freeze
98
- return unless @pipe.is_a?(::Pathname)
105
+ return unless @pipe.is_a?(Pathname)
99
106
 
100
107
  bord = '#' * Project.line_width
101
108
  puts bord, format('Session started on %s by %s', Time.now.to_s, @main), bord
@@ -104,7 +111,13 @@ module Squared
104
111
  def build(parallel: [], **kwargs)
105
112
  return self unless enabled? && !@closed
106
113
 
107
- kwargs[:parallel] = parallel.map(&:to_s)
114
+ if kwargs[:pattern].is_a?(Array)
115
+ kwargs[:parallel] = parallel.map(&:to_s)
116
+ else
117
+ kwargs[:pattern] = []
118
+ kwargs[:parallel] = parallel.reject { |val| val.is_a?(Regexp) && (kwargs[:pattern] << val) }
119
+ .map(&:to_s)
120
+ end
108
121
  @project.each_value do |proj|
109
122
  next unless proj.enabled?
110
123
 
@@ -131,9 +144,9 @@ module Squared
131
144
  kind = val.first
132
145
  val = kind if val.size == 1
133
146
  case kind
134
- when ::String
147
+ when String
135
148
  @group = val
136
- when ::Symbol
149
+ when Symbol
137
150
  @ref = val
138
151
  else
139
152
  raise_error('group{Symbol} | ref{String}', hint: 'missing') if block_given?
@@ -182,14 +195,14 @@ module Squared
182
195
  def banner(*args, command: true, styles: nil, border: nil, group: @group, ref: @ref)
183
196
  data = { command: command, order: [], styles: check_style(styles, empty: false), border: check_style(border) }
184
197
  args.each do |meth|
185
- if meth.is_a?(::Array)
198
+ if meth.is_a?(Array)
186
199
  found = false
187
200
  meth = meth.select do |val|
188
201
  case val
189
- when ::Symbol
202
+ when Symbol
190
203
  found = true
191
204
  Application.attr_banner.include?(val)
192
- when ::String
205
+ when String
193
206
  true
194
207
  else
195
208
  false
@@ -227,10 +240,10 @@ module Squared
227
240
  ref = if kwargs.key?(:ref)
228
241
  kwargs = kwargs.dup unless @withargs
229
242
  kwargs.delete(:ref)
230
- elsif @ref.is_a?(::Symbol)
243
+ elsif @ref.is_a?(Symbol)
231
244
  @ref
232
245
  end
233
- if @group.is_a?(::String) && !kwargs.key?(:group)
246
+ if @group.is_a?(String) && !kwargs.key?(:group)
234
247
  kwargs = kwargs.dup unless @withargs
235
248
  kwargs[:group] = @group
236
249
  end
@@ -242,7 +255,7 @@ module Squared
242
255
  index += 1
243
256
  name = "#{project}-#{index}"
244
257
  end
245
- proj = ((if !ref.is_a?(::Class)
258
+ proj = ((if !ref.is_a?(Class)
246
259
  Application.find(ref, path: path)
247
260
  elsif ref < Project::Base
248
261
  ref
@@ -359,18 +372,33 @@ module Squared
359
372
  ret
360
373
  end
361
374
 
375
+ def task_sync(key)
376
+ key = task_name(key)
377
+ task_defined?(ret = task_join(key, 'sync')) ? ret : key
378
+ end
379
+
362
380
  def script_find(*args)
363
381
  args.reverse_each do |val|
364
- next unless val && (ret = val.is_a?(::Symbol) ? @script[:ref!][val] : @script[:group!][val.to_sym])
382
+ next unless val && (ret = val.is_a?(Symbol) ? @script[:ref!][val] : @script[:group!][val.to_sym])
365
383
 
366
384
  return ret
367
385
  end
368
386
  @script[:ref!][:_] || SCRIPT_OBJ
369
387
  end
370
388
 
371
- def script_get(group: nil, ref: nil)
389
+ def script_get(*args, group: nil, ref: nil)
372
390
  if group
373
391
  @script[:group][group.to_sym]
392
+ elsif ref.is_a?(Array)
393
+ ref = ref.each
394
+ end
395
+ if ref.instance_of?(Enumerator)
396
+ ref.each do |key|
397
+ next unless (ret = @script[:ref][key])
398
+
399
+ return ret if args.empty? || args.any? { |val| ret.key?(val) }
400
+ end
401
+ nil
374
402
  elsif ref
375
403
  @script[:ref][ref]
376
404
  end
@@ -384,14 +412,6 @@ module Squared
384
412
  @banner[:ref][:_]
385
413
  end
386
414
 
387
- def to_s
388
- (home? ? home : root).to_s
389
- end
390
-
391
- def inspect
392
- "#<#{self.class}: #{main} => #{self}>"
393
- end
394
-
395
415
  def enabled?
396
416
  !@extensions.empty? || @project.values.any?(&:enabled?)
397
417
  end
@@ -409,7 +429,7 @@ module Squared
409
429
  end
410
430
 
411
431
  def task_defined?(*key)
412
- ::Rake::Task.task_defined?(key.size == 1 ? key.first : task_join(*key))
432
+ Rake::Task.task_defined?(key.size == 1 ? key.first : task_join(*key))
413
433
  end
414
434
 
415
435
  def dev?(**kwargs)
@@ -432,6 +452,10 @@ module Squared
432
452
  home.join(*args)
433
453
  end
434
454
 
455
+ def pwd
456
+ Pathname.new(Rake.application.original_dir)
457
+ end
458
+
435
459
  def baseref
436
460
  Application.baseref
437
461
  end
@@ -440,14 +464,22 @@ module Squared
440
464
  { exception: exception, warning: warning }
441
465
  end
442
466
 
467
+ def to_s
468
+ (home? ? home : root).to_s
469
+ end
470
+
471
+ def inspect
472
+ "#<#{self.class}: #{main} => #{self}>"
473
+ end
474
+
443
475
  public :task_join
444
476
 
445
477
  private
446
478
 
447
479
  def __build__(default: nil, **)
448
- if default && task_defined?(t = task_name(default)) && !task_defined?(n = ::Rake.application.default_task_name)
449
- task n => t
450
- end
480
+ return unless default && task_defined?(out = task_name(default))
481
+
482
+ task Rake.application.default_task_name => out
451
483
  end
452
484
 
453
485
  def puts(*args)
@@ -477,10 +509,6 @@ module Squared
477
509
  end
478
510
  end
479
511
 
480
- def script_obj
481
- SCRIPT_OBJ.dup
482
- end
483
-
484
512
  def script?(state, target: nil, pat: nil, group: nil, ref: baseref, global: false)
485
513
  data = script_find(ref, group)
486
514
  if global
@@ -489,7 +517,11 @@ module Squared
489
517
  end
490
518
  return false if state == :prod && data[:dev] == true && data[:global]
491
519
 
492
- target && pat.is_a?(::Regexp) ? as_a(target).any? { |val| pat.match?(val) } : pat == true
520
+ target && pat.is_a?(Regexp) ? as_a(target).any? { |val| pat.match?(val) } : pat == true
521
+ end
522
+
523
+ def scriptobj
524
+ SCRIPT_OBJ.dup
493
525
  end
494
526
  end
495
527
  end