squared 0.0.7 → 0.0.9

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: 45b563863fb21461ec7c629dc01a197485c15c8a26239db170a91970a6cade9a
4
- data.tar.gz: f7051ae9101dbced194185f5731c6bd028ccd3e56dfbbab047a7370c220412de
3
+ metadata.gz: 90258e1d46b51b15fcb414cddf85407968d227b5032797e76ead83befa5d302b
4
+ data.tar.gz: a01b153f7c26b7f15a24cc66a159e47e42bc117e7b0810d7146c6ca3766f3cd0
5
5
  SHA512:
6
- metadata.gz: 74adde082a170b07b65ccc258b94681826c9fdbda9120a39128f9236d4215c904a7dac32451428e92cdfbabd354e6dce810447df03660169b34783d02a808978
7
- data.tar.gz: c50ee1d27e5be607e84fd82bd4d15e4d3ec8e4d12acd4619ef1421d2206e313205e8aaf849965e6140d6e5873848001d2c55d00f0335f8274ef6c95213ec7990
6
+ metadata.gz: 484c0af12a637957f3ed9ddc43b6f08bee1f3dbcba50a2acdfdd0dcb7bb929b83b64d40fd8bbf17ceddc5d8177a27773e4193198cbc80f2991651bf55366b2c8
7
+ data.tar.gz: a9617a969c41e971235b98bc730fd440f6c913a2ce21b9e8acb1907ae170ac72da1bb5d72df8650c1833827599fb0d95ab4aae19e5c75249dac07c0096efe077
data/README.ruby.md CHANGED
@@ -34,12 +34,14 @@ Projects from any accessible folder can be added either relative to `REPO_ROOT`
34
34
  require "squared"
35
35
  require "squared/workspace/repo" # Repo (optional)
36
36
 
37
+ # NODE_ENV = production
37
38
  # REPO_ROOT = /workspaces
38
39
  # REPO_HOME = /workspaces/squared
39
40
  # rake = /workspaces/squared/Rakefile
40
41
 
41
42
  Workspace::Application
42
- .new("squared") # REPO_HOME
43
+ .new(main: "squared") # Dir.pwd? (main? is implicitly basename)
44
+ .banner("group", "project", styles: %i[yellow black], border: "bold") # name | project | path | ref | group?
43
45
  .repo("https://github.com/anpham6/squared-repo", "nightly", run: "build", ref: :node) # Repo (optional)
44
46
  .run("rake install", ref: :ruby)
45
47
  .depend(false, group: "default")
@@ -48,11 +50,11 @@ Workspace::Application
48
50
  .add("pathname", run: "rake compile", copy: "rake install", test: "rake test", group: "default", ref: :ruby) # Ruby (with C extensions)
49
51
  .add("optparse", doc: "rake rdoc", group: "default") # Uses bundler/gem_tasks (without C extensions)
50
52
  .add("logger", copy: { from: "lib", glob: "**/*.rb", gemdir: "~/.rvm/gems/ruby-3.3.5/gems/logger-1.6.1" }, clean: ["tmp/"]) # autodetect: true
51
- .add("android", "android-docs", run: false, doc: "make html", ref: :python) # Python
52
53
  .add("emc", "e-mc", copy: { from: "publish", into: "@e-mc", also: [:pir, "squared-express/"] }, ref: :node) # Node
53
54
  .add("pir", "pi-r", copy: { from: "publish", into: "@pi-r" }, clean: ["publish/**/*.js", "tmp/"]) # Trailing slash required for directories
54
55
  .add("squared", log: { file: "tmp/%Y-%m-%d.log", level: "debug" }, group: "app") # Copy target (main)
55
- .style(:banner, 255.255) # 256 colors (fg | fg.bg | -0.bg)
56
+ .add("sqd", "squared/sqd", script: ["build:sqd", "prod:sqd"], depend: false, clean: ["build/sqd/"], exclude: :git) # NPM workspaces
57
+ .style("banner", 255.255) # 256 colors (fg | fg.bg | -0.bg)
56
58
  .build(default: "status", parallel: ["pull", "fetch", "rebase", "copy", "clean"]) do |workspace|
57
59
  workspace
58
60
  .enable_aixterm
@@ -64,21 +66,33 @@ Workspace::Application
64
66
  # pathname = /workspaces/pathname
65
67
  # optparse = /workspaces/optparse
66
68
  # log = /workspaces/logger
67
- # android = /workspaces/android-docs
68
69
  # emc = /workspaces/e-mc
69
70
  # pir = /workspaces/pi-r
70
71
  # squared = /workspaces/squared
71
72
 
72
73
  Workspace::Application
73
- .new("squared")
74
- .group("default", "ruby", run: "rake build", copy: "rake install", clean: "rake clean", override: {
75
- pathname: { run: "rake compile" }
74
+ .new(ENV["SQUARED_DIR"], prefix: "rb", common: false) # Local styles
75
+ .group("default", "ruby/", run: "rake build", copy: "rake install", clean: "rake clean", ref: :ruby, override: {
76
+ pathname: {
77
+ run: "rake compile" # rake rb:pathname:build
78
+ }
76
79
  })
80
+ .with(:python) do # ref=Symbol | group=String
81
+ banner("path", command: false, styles: "yellow") #
82
+ doc("make html") # rake rb:doc:python
83
+ run(false) # rake rb:build:python (disabled)
84
+ exclude(%i[base git]) # Project::Git.ref (superclass)
85
+ add("android", "android-docs") # rake rb:android:doc
86
+ add("chrome", "chrome-docs") # rake rb:chrome:doc
87
+ end #
88
+ .style("inline", "bold")
77
89
  .build
78
90
  # default = /workspaces/ruby/*
79
91
  # pathname = /workspaces/ruby/pathname
80
92
  # optparse = /workspaces/ruby/optparse
81
93
  # logger = /workspaces/ruby/logger
94
+ # android = /workspaces/android-docs
95
+ # chrome = /workspaces/chrome-docs
82
96
  ```
83
97
 
84
98
  **NOTE**: The use of "**ref**" (class name) is only necessary when running `repo:init` for the first time into an empty directory.
@@ -124,6 +138,7 @@ rake clean:node # none + ["publish/**/*.js", "tmp/"] + ["build/"]
124
138
  * header
125
139
  * active
126
140
  * inline
141
+ * major
127
142
 
128
143
  ## LICENSE
129
144
 
@@ -26,7 +26,8 @@ module Squared
26
26
  workspace: {
27
27
  header: %i[bold],
28
28
  active: %i[bold],
29
- inline: %i[bold]
29
+ inline: %i[bold],
30
+ major: %i[bold]
30
31
  },
31
32
  project: {},
32
33
  viewer: {
@@ -82,16 +83,16 @@ module Squared
82
83
  args.reject(&:empty?).join(' => ') + (hint ? " (#{hint})" : '')
83
84
  end
84
85
 
85
- def as_a(obj, flat: nil)
86
- if obj.nil?
87
- []
88
- elsif !obj.is_a?(::Array)
89
- [obj]
86
+ def as_a(obj, meth = nil, flat: nil, compact: false)
87
+ return [] if obj.nil?
88
+
89
+ if !obj.is_a?(::Array)
90
+ obj = [obj]
90
91
  elsif flat
91
- obj.flatten(flat == true ? nil : flat)
92
- else
93
- obj
92
+ obj = obj.flatten(flat == true ? nil : flat)
94
93
  end
94
+ obj = obj.map(&meth) if meth
95
+ compact ? obj.compact : obj
95
96
  end
96
97
  end
97
98
  end
@@ -109,7 +109,7 @@ module Squared
109
109
  def check_style(*args, empty: true)
110
110
  ret = []
111
111
  colors = __get__(:colors)
112
- as_a(args, flat: true).each do |val|
112
+ as_a(args, flat: true, compact: true).each do |val|
113
113
  if !val.is_a?(Numeric)
114
114
  val = val.to_sym
115
115
  ret << val if colors.key?(val) || TEXT_STYLE.include?(val)
@@ -201,7 +201,7 @@ module Squared
201
201
  "| #{s} |"
202
202
  end
203
203
  out << bord
204
- out.push(pr.(title), bord) if title
204
+ out << pr.(title) << bord if title
205
205
  lines.each { |line| out << pr.(line) }
206
206
  out << bord
207
207
  if block_given?
@@ -7,12 +7,13 @@ module Squared
7
7
  module Task
8
8
  module_function
9
9
 
10
- def invoke(name, *args, exception: true)
11
- ::Rake::Task[name].invoke(*args)
10
+ def invoke(series, *args, exception: true, warning: true)
11
+ series = [series] unless series.is_a?(::Array)
12
+ series.each { |name| ::Rake::Task[name].invoke(*args) }
12
13
  rescue StandardError => e
13
14
  raise if exception
14
15
 
15
- warn e
16
+ warn e if warning
16
17
  end
17
18
 
18
19
  def invoked?(name)
@@ -17,14 +17,15 @@ module Squared
17
17
  end
18
18
  end
19
19
 
20
- attr_reader :name, :main, :project, :theme
20
+ attr_reader :main, :name, :project, :theme
21
21
 
22
- def initialize(main, name = nil, project: nil, dump: nil, opts: {}, auto: true, common: true)
22
+ def initialize(main, name = nil, project: nil, prefix: nil, dump: nil, opts: {}, auto: true, common: true)
23
23
  if project
24
24
  main = @project.base_path(main).to_s if (@project = __get__(:project)[project.to_sym])
25
25
  @required = true
26
26
  end
27
27
  @name = name&.to_s || @project&.name
28
+ @prefix = prefix
28
29
  @ext = File.extname(main)
29
30
  @dump = dump
30
31
  @mime = {}
@@ -59,18 +60,18 @@ module Squared
59
60
 
60
61
  params = ->(args) { exist? ? [realpath, [args.keys] + args.extras] : [args.keys, args.extras] }
61
62
 
62
- namespace name do
63
+ namespace(ns = task_name(name)) do
63
64
  view = @command && @command != name ? @command : 'view'
64
65
  namespace view do
65
- if @mime['json'] && (exist? || !::Rake::Task.task_defined?("#{name}:#{view}:json"))
66
- desc format_desc(view, %w[json])
66
+ if @mime['json'] && (exist? || !::Rake::Task.task_defined?("#{ns}:#{view}:json"))
67
+ desc format_desc(view, 'json')
67
68
  task 'json', [:keys] do |_, args|
68
69
  read_keys(JSON, 'json', *params.(args))
69
70
  end
70
71
  end
71
72
 
72
- if @mime['yaml'] && (exist? || !::Rake::Task.task_defined?("#{name}:#{view}:yaml"))
73
- desc format_desc(view, %w[yaml yml])
73
+ if @mime['yaml'] && (exist? || !::Rake::Task.task_defined?("#{ns}:#{view}:yaml"))
74
+ desc format_desc(view, 'yaml', 'yml')
74
75
  task 'yaml', [:keys] do |_, args|
75
76
  require 'yaml'
76
77
  read_keys(YAML, 'yaml', *params.(args), ext: %w[yml yaml])
@@ -91,8 +92,9 @@ module Squared
91
92
  obj = eval(parse)
92
93
  ext << type if (ext = as_a(ext)).empty?
93
94
  file = realpath if file.nil? && exist?
94
- namespace name do
95
- desc format_desc(command, ext, exist: exist)
95
+
96
+ namespace task_name(name) do
97
+ desc format_desc(command, *ext, exist: exist)
96
98
  namespace command do
97
99
  task type, [:keys] do |_, args|
98
100
  if file
@@ -158,7 +160,7 @@ module Squared
158
160
  !@required || (!project.nil? && project.enabled?)
159
161
  end
160
162
 
161
- protected
163
+ private
162
164
 
163
165
  def read_keys(reader, type, file, keys, ext: [type])
164
166
  if (mime = mime_type(file)) && base_path(file).exist?
@@ -188,19 +190,16 @@ module Squared
188
190
  .realpath
189
191
  .to_s
190
192
  .sub(Regexp.new("^#{Regexp.escape(File.join(Dir.pwd, ''))}"), '')
191
- sub = if pipe?
192
- nil
193
- else
194
- styles = theme
193
+ sub = if !pipe?
195
194
  [
196
- { pat: /^((?:[^:]|(?<! ):(?! ))+)$/, styles: styles[:banner] },
197
- { pat: /^(.*?)(<[^>]+>)(.+)$/m, styles: styles[:undefined], index: 2 },
198
- { pat: /^(.+)( : (?!undefined).+)$/m, styles: styles[:key] },
199
- { pat: /^(.+ : )(-?[\d.]+)(\s*)$/m, styles: styles[:number], index: 2 },
200
- { pat: /^(.+ : ")(.+)("\s*)$/m, styles: styles[:string], index: 2 },
201
- { pat: /^(.+ : \{)(.+)(\}\s*)$/m, styles: styles[:hash], index: 2 },
202
- { pat: /^(.+ : \[)(.+)(\]\s*)$/m, styles: styles[:array], index: 2 },
203
- { pat: /^(.+ : (?!undefined))([^"\[{].*)$/m, styles: styles[:value], index: 2 }
195
+ { pat: /^((?:[^:]|(?<! ):(?! ))+)$/, styles: theme[:banner] },
196
+ { pat: /^(.*?)(<[^>]+>)(.+)$/m, styles: theme[:undefined], index: 2 },
197
+ { pat: /^(.+)( : (?!undefined).+)$/m, styles: theme[:key] },
198
+ { pat: /^(.+ : )(-?[\d.]+)(\s*)$/m, styles: theme[:number], index: 2 },
199
+ { pat: /^(.+ : ")(.+)("\s*)$/m, styles: theme[:string], index: 2 },
200
+ { pat: /^(.+ : \{)(.+)(\}\s*)$/m, styles: theme[:hash], index: 2 },
201
+ { pat: /^(.+ : \[)(.+)(\]\s*)$/m, styles: theme[:array], index: 2 },
202
+ { pat: /^(.+ : (?!undefined))([^"\[{].*)$/m, styles: theme[:value], index: 2 }
204
203
  ]
205
204
  end
206
205
  emphasize(lines, title: title, sub: sub)
@@ -224,7 +223,7 @@ module Squared
224
223
  end
225
224
  end
226
225
  rescue StandardError
227
- project&.log&.warn "#{Viewer}(#{type}) => #{file ? "#{file} " : ''}{#{key}: undefined}"
226
+ project&.log&.warn "#{Viewer}(#{type}) => #{file && "#{file} "}{#{key}: undefined}"
228
227
  val = Regexp.escape($!.message)
229
228
  key = key.sub(/(#{val})\.|\.(#{val})|(#{val})/) do
230
229
  s = "<#{$3 || $2 || $1}>"
@@ -251,6 +250,10 @@ module Squared
251
250
  project ? project.base_path(file) : Pathname.new(file).realdirpath
252
251
  end
253
252
 
253
+ def task_name(val)
254
+ @prefix ? "#{@prefix}:#{val}" : val.to_s
255
+ end
256
+
254
257
  def mime_type(file)
255
258
  case (ret = File.extname(file).sub('.', '').downcase)
256
259
  when 'yml'
@@ -262,8 +265,9 @@ module Squared
262
265
  end
263
266
  end
264
267
 
265
- def format_desc(command, ext, exist: exist?)
266
- message(name, command, "#{ext.first}[#{exist ? '' : "file?=#{File.basename(main)}.#{ext.last},"}keys*]")
268
+ def format_desc(command, *ext, exist: exist?)
269
+ message(@prefix || '', *name.split(':'), command,
270
+ "#{ext.first}[#{exist ? '' : "file?=#{File.basename(main)}.#{ext.last},"}keys*]")
267
271
  end
268
272
 
269
273
  def realpath
@@ -283,7 +287,7 @@ module Squared
283
287
  end
284
288
 
285
289
  def warning?
286
- project && defined?(project.warning) == 'method' ? project.warning : true
290
+ project ? project.workspace.warning : true
287
291
  end
288
292
  end
289
293
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Squared
4
- VERSION = '0.0.7'
4
+ VERSION = '0.0.9'
5
5
  end
@@ -7,58 +7,45 @@ module Squared
7
7
  include Format
8
8
  include ::Rake::DSL
9
9
 
10
- TASK_BASE = {
11
- build: [],
12
- refresh: [],
13
- depend: [],
14
- outdated: [],
15
- doc: [],
16
- test: [],
17
- copy: [],
18
- clean: []
19
- }
20
- TASK_EXTEND = {}
21
- WORKSPACE_KEYS = TASK_BASE.keys.freeze
22
- private_constant :TASK_BASE, :TASK_EXTEND
23
-
24
10
  class << self
25
11
  def implement(*objs)
26
12
  objs.each do |obj|
27
- next unless obj < Project::Base
28
-
29
- project_kind.unshift(obj)
30
- obj.tasks&.each do |val|
31
- TASK_BASE[val] ||= []
32
- (TASK_EXTEND[val] ||= []).push(obj)
13
+ if obj < Project::Base
14
+ @impl_project.unshift(obj)
15
+ obj.tasks&.each { |task| @impl_series.add(task, obj) }
16
+ elsif obj < Workspace::Series
17
+ @impl_series = obj
33
18
  end
34
19
  end
35
20
  end
36
21
 
37
- def find(path: nil, ref: nil)
38
- if ref.is_a?(::Symbol) || ref.is_a?(::String)
39
- ret = project_kind.find { |proj| proj.ref == ref.to_sym }
40
- return ret if ret
22
+ def find(ref = nil, path: nil)
23
+ if ref && (ret = impl_project.find { |proj| proj.ref == ref.to_sym })
24
+ ret
25
+ elsif path
26
+ impl_project.find { |proj| proj.is_a?(path) }
41
27
  end
42
- project_kind.find { |proj| proj.is_a?(path) } if path
43
28
  end
44
29
 
45
30
  def to_s
46
31
  super.to_s.match(/[^:]+$/)[0]
47
32
  end
48
33
 
49
- attr_reader :project_kind
34
+ attr_reader :impl_project, :impl_series
50
35
  end
51
36
 
52
- @project_kind = []
37
+ @impl_project = []
38
+ @impl_series = Workspace::Series
53
39
 
54
- attr_reader :main, :root, :home, :series, :theme
40
+ attr_reader :root, :home, :main, :prefix, :series, :theme
55
41
  attr_accessor :exception, :warning, :pipe, :verbose
56
42
 
57
- def initialize(main, *, exception: false, pipe: false, verbose: nil, **kwargs)
58
- @main = main.to_s
59
- @home = Pathname.pwd
43
+ def initialize(home = Dir.pwd, *, main: nil, prefix: nil, exception: false, pipe: false, verbose: nil, **kwargs)
44
+ @home = (home = Pathname.new(home)).realdirpath
45
+ @main = (main || home.basename).to_s
60
46
  @root = @home.parent
61
- @series = Series.new(TASK_BASE)
47
+ @prefix = prefix
48
+ @series = Application.impl_series.new(self)
62
49
  @project = {}
63
50
  @extensions = []
64
51
  @script = {
@@ -66,42 +53,57 @@ module Squared
66
53
  ref: {},
67
54
  build: nil,
68
55
  dev: nil,
69
- prod: nil
56
+ prod: nil,
57
+ env: false
70
58
  }
71
- @theme = kwargs.key?(:common) && !kwargs[:common] ? {} : __get__(:theme)[:workspace]
72
59
  @exception = exception.is_a?(String) ? !env(exception, ignore: '0').nil? : exception
73
60
  @pipe = pipe.is_a?(String) ? !env(pipe, ignore: '0').nil? : pipe
74
61
  @verbose = verbose.nil? ? !@pipe : verbose
75
62
  @warning = @verbose
76
- __set__(:no_color, true) if @pipe
63
+ if kwargs.fetch(:common, true)
64
+ @theme = __get__(:theme)[:workspace]
65
+ __set__(:no_color, true) if @pipe
66
+ else
67
+ @theme = {}
68
+ end
69
+ @banner = {}
77
70
  end
78
71
 
79
72
  def build(**kwargs)
73
+ kwargs[:parallel] = kwargs.fetch(:parallel, []).map(&:to_s)
80
74
  return unless enabled?
81
75
 
82
76
  @project.each_value do |proj|
83
77
  next unless proj.enabled?
84
78
 
85
79
  proj.populate(**kwargs)
86
- series.populate(proj)
80
+ series.__populate__(proj)
87
81
  end
88
82
 
89
- Application.project_kind.each { |obj| obj.populate(self, **kwargs) }
83
+ Application.impl_project.each { |obj| obj.populate(self, **kwargs) }
90
84
  @extensions.each { |ext| __send__(ext, **kwargs) }
91
85
 
86
+ series.__build__(**kwargs)
92
87
  __build__(**kwargs)
93
- series.build(**kwargs)
94
88
 
95
89
  yield self if block_given?
96
90
  end
97
91
 
98
- def with(group: nil, ref: nil)
92
+ def with(val, &blk)
99
93
  @group = nil
100
94
  @ref = nil
101
- if group
102
- @group = group
103
- elsif ref
104
- @ref = ref
95
+ if val.is_a?(::String)
96
+ @group = val
97
+ if block_given?
98
+ instance_eval(&blk)
99
+ @group = nil
100
+ end
101
+ elsif val.is_a?(::Symbol)
102
+ @ref = val
103
+ if block_given?
104
+ instance_eval(&blk)
105
+ @ref = nil
106
+ end
105
107
  end
106
108
  self
107
109
  end
@@ -126,6 +128,10 @@ module Squared
126
128
  script_command :test, script, group, ref
127
129
  end
128
130
 
131
+ def exclude(base, group: @group, ref: @ref)
132
+ script_command :exclude, as_a(base, :to_sym).freeze, group, ref
133
+ end
134
+
129
135
  def add(name, path = nil, **kwargs)
130
136
  ref = if kwargs.key?(:ref)
131
137
  kwargs.delete(:ref)
@@ -135,10 +141,10 @@ module Squared
135
141
  kwargs[:group] = @group if !kwargs.key?(:group) && !@group.is_a?(::Array)
136
142
  path = root_path(path || name.to_s)
137
143
  proj = ((if !ref.is_a?(::Class)
138
- Application.find(path: path, ref: ref)
144
+ Application.find(ref, path: path)
139
145
  elsif ref < Project::Base
140
146
  ref
141
- end) || Project::Base).new(name, path, self, **kwargs)
147
+ end) || Project::Base).new(task_name(name), path, self, **kwargs)
142
148
  @project[name = name.to_sym] = proj
143
149
  __get__(:project)[name] = proj unless kwargs[:private]
144
150
  self
@@ -165,7 +171,7 @@ module Squared
165
171
  end
166
172
 
167
173
  def compose(name, &blk)
168
- namespace(name, &blk)
174
+ namespace(task_name(name), &blk)
169
175
  self
170
176
  end
171
177
 
@@ -177,31 +183,54 @@ module Squared
177
183
  def style(name, *args, target: nil, empty: false)
178
184
  data = nil
179
185
  if target
180
- as_a(target).each_with_index do |val, i|
186
+ as_a(target).each_with_index do |key, i|
181
187
  if i == 0
182
- break unless (data = __get__(:theme)[val.to_sym])
188
+ break unless (data = __get__(:theme)[key.to_sym])
183
189
  else
184
- data = data[val.to_sym] ||= {}
190
+ data = data[key.to_sym] ||= {}
185
191
  end
186
192
  end
187
- return unless data
188
193
  end
189
- apply_style(data || theme, name, *args, empty: empty)
194
+ apply_style(data || theme, name, *args, empty: empty) unless target && !data
190
195
  self
191
196
  end
192
197
 
193
- def script(group: nil, ref: nil)
198
+ def banner(*order, command: true, styles: [], border: [], group: nil, ref: nil)
199
+ return (group && @banner[group.to_sym]) || @banner[:"_#{ref || ''}"] if order.empty?
200
+
201
+ key = if group ||= @group
202
+ group.to_sym
203
+ else
204
+ :"_#{ref || @ref || ''}"
205
+ end
206
+ data = { command: command, order: [], styles: check_style(styles, empty: false), border: check_style(border) }
207
+ order.flatten.each do |val|
208
+ case (val = val.to_sym)
209
+ when :name, :project, :path, :ref, :group
210
+ data[:order] << val
211
+ end
212
+ end
213
+ @banner[key] = data if command || !data[:order].empty?
214
+ self
215
+ end
216
+
217
+ def script(*args, group: nil, ref: nil)
194
218
  if group
195
219
  @script[:group][group.to_sym]
196
220
  elsif ref
197
221
  @script[:ref][ref.to_sym]
222
+ elsif (val = @script[:build])
223
+ r = @script[:ref][:_]
224
+ g = @script[:group][:_]
225
+ args.empty? || (!r && !g) || (r && args.include?(r)) || (g && args.include?(g)) ? [val, @script[:env]] : []
198
226
  else
199
- @script[:build]
227
+ []
200
228
  end
201
229
  end
202
230
 
203
231
  def env(key, default = nil, equals: nil, ignore: nil)
204
- ret = ENV.fetch("#{key}_#{main.gsub(/[^\w]+/, '_').upcase}", ENV[key]).to_s
232
+ @env ||= main.gsub(/[^\w]+/, '_').upcase
233
+ ret = ENV.fetch("#{key}_#{@env}", ENV[key]).to_s
205
234
  return ret == equals.to_s unless equals.nil?
206
235
 
207
236
  ret.empty? || (ignore && as_a(ignore).any? { |val| ret == val.to_s }) ? default : ret
@@ -216,7 +245,19 @@ module Squared
216
245
  end
217
246
 
218
247
  def find_base(obj)
219
- Application.project_kind.find { |proj| obj.instance_of?(proj) }
248
+ Application.impl_project.find { |proj| obj.instance_of?(proj) }
249
+ end
250
+
251
+ def task_name(val, desc: false)
252
+ ret = @prefix ? "#{@prefix}:#{val}" : val.to_s
253
+ desc ? ret.split(':').join(' => ') : ret
254
+ end
255
+
256
+ def task_namespace(val, first: false)
257
+ return nil unless (val = val.to_s).include?(':')
258
+
259
+ ret = val.split(':')
260
+ first ? ret.first : ret[0..-2].join(':')
220
261
  end
221
262
 
222
263
  def to_s
@@ -231,17 +272,11 @@ module Squared
231
272
  !@extensions.empty? || @project.any? { |_, proj| proj.enabled? }
232
273
  end
233
274
 
234
- def task_base?(key, val)
235
- return val if task_defined?(key)
236
-
237
- val if key == :refresh && series[:build].include?(val = "#{val.split(':').first}:build")
275
+ def task_extend?(obj, key)
276
+ series.extend?(obj, key)
238
277
  end
239
278
 
240
- def task_include?(obj, key)
241
- TASK_EXTEND.fetch(key, []).any? { |item| obj.is_a?(item) }
242
- end
243
-
244
- def task_defined?(key)
279
+ def task_defined?(key, *)
245
280
  ::Rake::Task.task_defined?(key)
246
281
  end
247
282
 
@@ -258,44 +293,49 @@ module Squared
258
293
  private
259
294
 
260
295
  def __build__(**kwargs)
261
- if !task_defined?('default') && (default = kwargs[:default]) && !series.has?(default)
262
- task default: default
263
- end
264
- return unless series.has?('build')
265
-
266
- if (refresh = series[:refresh]).all? { |val| val.end_with?(':build') }
267
- refresh.clear
296
+ if !task_defined?('default') && (target = kwargs[:default]) && task_defined?(target = task_name(target))
297
+ task 'default' => target
268
298
  end
269
- init = ['depend', dev? && series.has?('refresh') ? 'refresh' : 'build']
299
+ return unless series.some?(:build)
270
300
 
271
- task default: init[1] unless task_defined?('default')
301
+ init = [task_name('depend'), task_name(dev? && series.some?(:refresh) ? 'refresh' : 'build')]
272
302
 
273
- return if task_defined?('init') || !series.has?(init[0])
303
+ task 'default' => init[1] unless task_defined?('default')
304
+ return unless series.some?(:depend) && !task_defined?(key = task_name('init'))
274
305
 
275
- desc 'init'
276
- task init: init
306
+ desc key
307
+ task key => init
277
308
  end
278
309
 
279
310
  def script_command(task, val, group, ref)
280
311
  if group
281
312
  label = :group
282
- items = as_a(group)
313
+ items = as_a(group, :to_sym)
283
314
  else
284
315
  label = :ref
285
- items = as_a(ref)
316
+ items = as_a(ref, :to_sym)
286
317
  end
287
- items.each { |name| (@script[label][name.to_sym] ||= {})[task] = val }
318
+ items.each { |name| (@script[label][name] ||= {})[task] = val }
288
319
  self
289
320
  end
290
321
 
291
322
  def script?(state, script: nil, pat: nil, ref: nil, group: nil, global: false)
292
- gr = @script[:ref][:_]
293
- gg = @script[:group][:_]
294
- if global && ((!ref && !group) || (!gr && !gg) || (ref && ref == gr) || (group && group == gg))
323
+ r = @script[:ref][:_]
324
+ g = @script[:group][:_]
325
+ if global && ((!ref && !group) || (!r && !g) || (ref && contains?(r, ref)) || (group && contains?(g, group)))
295
326
  pat = @script[state] if pat.nil?
296
327
  script ||= @script[:build]
297
328
  end
298
- pat.is_a?(::Regexp) ? pat.match?(script) : pat == true
329
+ if pat.is_a?(::Regexp)
330
+ script = script[state == :prod ? 1 : 0] if script.is_a?(::Array)
331
+ pat.match?(script)
332
+ else
333
+ pat == true
334
+ end
335
+ end
336
+
337
+ def contains?(data, val)
338
+ as_a(data).any? { |item| item.to_s == val.to_s }
299
339
  end
300
340
  end
301
341
  end