squared 0.0.7 → 0.0.8

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.
@@ -7,9 +7,8 @@ module Squared
7
7
  REQUIREMENTS = %w[requirements.txt pyproject.toml setup.py].freeze
8
8
  OPT_USER = %w[pre dry-run].freeze
9
9
  OPT_FORCE = [*OPT_USER, 'user'].freeze
10
- OPT_UPGRADE = [*OPT_FORCE, 'eager'].freeze
11
10
  OPT_GENERAL = %w{venv isolated no-cache-dir [v]erbose}.freeze
12
- private_constant :REQUIREMENTS, :OPT_USER, :OPT_FORCE, :OPT_UPGRADE, :OPT_GENERAL
11
+ private_constant :REQUIREMENTS, :OPT_USER, :OPT_FORCE, :OPT_GENERAL
13
12
 
14
13
  class << self
15
14
  def populate(*); end
@@ -42,12 +41,12 @@ module Squared
42
41
  end
43
42
 
44
43
  @@tasks[ref] = {
45
- install: %i[user upgrade force]
44
+ install: %i[user target upgrade force]
46
45
  }.freeze
47
46
 
48
47
  def populate(*)
49
48
  super
50
- return unless outdated? && !@exclude.include?(Python.ref)
49
+ return unless outdated? && ref?(Python.ref)
51
50
 
52
51
  namespace name do
53
52
  @@tasks[Python.ref].each do |action, flags|
@@ -56,16 +55,26 @@ module Squared
56
55
  case action
57
56
  when :install
58
57
  list = case flag
58
+ when :target
59
+ req = 'dir'
60
+ OPT_USER + %w[upgrade eager]
59
61
  when :upgrade
60
- OPT_UPGRADE
62
+ OPT_FORCE + ['eager']
61
63
  when :force
62
64
  OPT_FORCE
63
65
  else
64
66
  OPT_USER
65
67
  end
66
- desc format_desc(action, flag, list + OPT_GENERAL)
67
- task flag do |_, args|
68
- depend(flag, opts: args.to_a, override: true)
68
+ desc format_desc(action, flag, list + OPT_GENERAL, req: req)
69
+ if flag == :target
70
+ task flag, [:dir, :opts] do |_, args|
71
+ guard_params(action, flag, args: args, key: :dir)
72
+ depend(flag, dir: args.dir, opts: args.to_a)
73
+ end
74
+ else
75
+ task flag do |_, args|
76
+ depend(flag, opts: args.to_a)
77
+ end
69
78
  end
70
79
  end
71
80
  end
@@ -74,33 +83,42 @@ module Squared
74
83
  end
75
84
  end
76
85
 
77
- def depend(flag = nil, opts: [], override: false)
78
- if @depend && !override
86
+ def depend(flag = nil, dir: nil, opts: [])
87
+ if @depend && !flag
79
88
  super
80
89
  elsif outdated?
90
+ sync = invoked_sync?('depend', flag)
81
91
  case (type = install_type)
82
92
  when 1, 2
83
93
  cmd = pip_session 'install'
84
94
  case flag
85
95
  when :user
86
96
  cmd << '--user'
87
- append_general opts, OPT_USER
97
+ append_pip opts, OPT_USER
98
+ when :target
99
+ cmd << "--target=#{shell_escape(base_path(dir).to_s, quote: true)}"
100
+ append_pip opts, OPT_USER + ['upgrade']
101
+ append_eager opts
88
102
  when :upgrade
89
103
  cmd << '--upgrade'
90
- append_general opts, OPT_UPGRADE
104
+ append_pip opts, OPT_FORCE
105
+ append_eager opts
91
106
  when :force
92
107
  cmd << '--force-reinstall'
93
- append_general opts, OPT_FORCE
108
+ append_pip opts, OPT_FORCE
94
109
  end
95
110
  cmd << (type == 1 ? '-r requirements.txt' : '.')
96
- run(sync: invoked_sync?('depend'))
111
+ run(sync: sync)
97
112
  when 3
98
- run_s("#{@bin} setup.py install", sync: invoked_sync?('depend'))
113
+ run_s("#{@bin} setup.py install", sync: sync)
99
114
  end
100
115
  end
101
116
  end
102
117
 
103
- def outdated(*); end
118
+ def outdated(*)
119
+ pip_session 'list', '--outdated'
120
+ run
121
+ end
104
122
 
105
123
  def install_type(*)
106
124
  requirements.exist? ? @reqindex + 1 : 0
@@ -116,14 +134,11 @@ module Squared
116
134
  session('pip', *cmd)
117
135
  end
118
136
 
119
- def append_general(opts, list = [])
120
- list += OPT_GENERAL
137
+ def append_pip(opts, list = [])
121
138
  opts.each do |opt|
122
- next unless (v = opt.match(/^v+$/)) || list.include?(opt)
139
+ next unless list.include?(opt) || OPT_GENERAL.include?(opt) || (v = opt.match(/^v+$/))
123
140
 
124
141
  @session << case opt
125
- when 'eager'
126
- '--upgrade-strategy=eager'
127
142
  when 'venv'
128
143
  '--require-virtualenv'
129
144
  else
@@ -135,8 +150,15 @@ module Squared
135
150
  if (val = env('PIP_PROXY'))
136
151
  @session << "--proxy=#{shell_escape(val, quote: true)}"
137
152
  end
153
+ if (val = env('PIP_LOG'))
154
+ @session << "--log=#{shell_escape(base_path(val).to_s, quote: true)}"
155
+ end
138
156
  append_nocolor
139
157
  end
158
+
159
+ def append_eager(opts)
160
+ @session << '--upgrade-strategy=eager' if opts.include?('eager')
161
+ end
140
162
  end
141
163
  end
142
164
  end
@@ -63,7 +63,7 @@ module Squared
63
63
 
64
64
  def populate(*)
65
65
  super
66
- return unless outdated? && !@exclude.include?(Ruby.ref)
66
+ return unless outdated? && ref?(Ruby.ref)
67
67
 
68
68
  namespace name do
69
69
  @@tasks[Ruby.ref].each do |action, flags|
@@ -93,19 +93,19 @@ module Squared
93
93
  task flag, [:name] do |_, args|
94
94
  name = args.to_a
95
95
  guard_params(action, flag, args: name)
96
- depend(flag, opts: name, override: true)
96
+ depend(flag, opts: name)
97
97
  end
98
98
  when :with, :without
99
99
  desc format_desc(action, flag, 'group+')
100
100
  task flag, [:group] do |_, args|
101
101
  group = args.to_a
102
102
  guard_params(action, flag, args: group)
103
- depend(flag, opts: group, override: true)
103
+ depend(flag, opts: group)
104
104
  end
105
105
  else
106
106
  desc format_desc(action, flag, OPT_INSTALL)
107
107
  task flag, [:opts] do |_, args|
108
- depend(flag, opts: args.to_a, override: true)
108
+ depend(flag, opts: args.to_a)
109
109
  end
110
110
  end
111
111
  when :update, :outdated
@@ -142,11 +142,17 @@ module Squared
142
142
  end
143
143
  end
144
144
 
145
- def depend(flag = nil, opts: [], override: false)
146
- if @depend && !override
145
+ def depend(flag = nil, opts: [])
146
+ if @depend && !flag
147
147
  super
148
148
  elsif outdated?
149
149
  case flag
150
+ when :gem
151
+ gem_session 'install'
152
+ append_value opts
153
+ when :with, :without
154
+ gem_session 'install'
155
+ append_repeat flag, opts
150
156
  when :redownload, :local, :'prefer-local'
151
157
  cmd = bundle_session 'install', "--#{flag}"
152
158
  if (val = env('BUNDLE_TRUST_POLICY'))
@@ -166,17 +172,11 @@ module Squared
166
172
  end}"
167
173
  end
168
174
  append_bundle opts, OPT_INSTALL
169
- when :gem
170
- gem_session 'install'
171
- append_value opts
172
- when :with, :without
173
- gem_session 'install'
174
- append_repeat flag, opts
175
175
  else
176
176
  bundle_session 'install'
177
177
  append_bundle
178
178
  end
179
- run_rb
179
+ run_rb(sync: invoked_sync?('depend', flag))
180
180
  end
181
181
  end
182
182
 
@@ -207,7 +207,7 @@ module Squared
207
207
  append_bundle opts, OPT_OUTDATED
208
208
  cmd = cmd.done
209
209
  log.info cmd
210
- print_item format_banner(cmd) if store_pwd || invoked_sync?("outdated#{rev ? ":#{rev}" : ''}")
210
+ print_item format_banner(cmd) if store_pwd || invoked_sync?("outdated#{rev && ":#{rev}"}")
211
211
  start = 0
212
212
  found = 0
213
213
  major = 0
@@ -224,41 +224,29 @@ module Squared
224
224
  l = lat.join
225
225
  styles = []
226
226
  data.each do |val|
227
- break unless styles && (req = /(>?=|~>|!=|<=?) (#{Regexp.escape(val.join)})/.match(line))
227
+ break unless (req = /(>=?|=|~>|!=|<=?) (#{Regexp.escape(val.join)})/.match(line))
228
228
 
229
229
  v = semver(val).join
230
230
  case req[1]
231
231
  when '>', '>='
232
- if c == l
233
- styles = nil
234
- elsif l < v
235
- styles = %i[red underline]
236
- break
237
- elsif semmajor(cur, lat)
238
- styles = %i[green underline]
239
- major += 1
240
- elsif cur[3] != lat[3]
232
+ if semmajor(cur, lat)
241
233
  styles = %i[green bold]
234
+ major += 1
242
235
  else
243
- styles[0] = :green
236
+ styles[0] = cur[2] == lat[2] ? :yellow : :green
244
237
  end
245
238
  when '<', '<='
246
239
  if c <= v
247
240
  if semmajor(cur, lat)
248
- styles = %i[green underline]
241
+ styles = %i[green bold]
249
242
  major += 1
250
243
  else
251
244
  styles[0] = :yellow
252
245
  end
253
- elsif l >= v
254
- styles = nil
255
246
  end
256
247
  when '!='
257
- if c == v
258
- styles = %i[red underline]
259
- break
260
- elsif l == v
261
- styles = nil
248
+ if c == l
249
+ styles.clear
262
250
  else
263
251
  styles[1] = :bold
264
252
  end
@@ -266,27 +254,23 @@ module Squared
266
254
  if c < v && cur[0] == val[0] && !semmajor(cur, val)
267
255
  styles[0] = :yellow
268
256
  elsif semmajor(lat, val)
269
- styles = nil
270
- else
271
- styles[1] = :bold
272
- end
273
- when '='
274
- if c == v
275
257
  styles[1] = :underline
276
258
  else
277
- styles[0] = :red
259
+ styles[1] = :bold
278
260
  end
279
261
  end
280
262
  end
281
- next unless styles && !styles.empty?
282
-
283
- case styles[0]
284
- when :yellow, :green
285
- line = sub_style(line, pat: /^(\S+)(.+)$/, styles: theme[:active])
286
- found += 1
263
+ unless styles.empty?
264
+ case styles[0]
265
+ when :green
266
+ line = sub_style(line, pat: /^(\S+)(.+)$/, styles: theme[styles[1] == :bold ? :major : :active])
267
+ found += 1
268
+ when :yellow
269
+ found += 1
270
+ end
271
+ line = sub_style(line, pat: /^((?:\S+\s+){2})(#{Regexp.escape(l)})(.+)$/,
272
+ styles: styles.compact, index: 2)
287
273
  end
288
- line = sub_style(line, pat: /^((?:\S+\s+){2})(#{Regexp.escape(l)})(.+)$/,
289
- styles: styles.compact, index: 2)
290
274
  end
291
275
  end
292
276
  puts "#{start.to_s.rjust(2)}. #{line}"
@@ -393,8 +377,8 @@ module Squared
393
377
 
394
378
  private
395
379
 
396
- def run_rb
397
- run(banner: !@session.include?('--quiet'))
380
+ def run_rb(sync: true)
381
+ run(sync: sync, banner: !@session.include?('--quiet'))
398
382
  end
399
383
 
400
384
  def append_bundle(opts = nil, list = nil)
@@ -413,7 +397,7 @@ module Squared
413
397
  end
414
398
 
415
399
  def append_repeat(flag, opts)
416
- opts.each { |val| @session << "--#{flag}=#{shell_escape(val)}" }
400
+ opts.each { |val| @session << "--#{flag}=#{shell_escape(val, quote: true)}" }
417
401
  end
418
402
 
419
403
  def append_value(opts)
@@ -7,8 +7,6 @@ module Squared
7
7
  include Format
8
8
  include System
9
9
 
10
- attr_accessor :warning
11
-
12
10
  def repo(url, manifest = 'latest', run: nil, dev: nil, prod: nil, ref: @ref, group: @group)
13
11
  @home = if (val = env('REPO_HOME'))
14
12
  home = Pathname.new(val)
@@ -34,11 +32,18 @@ module Squared
34
32
  end
35
33
  @root.join(main).realdirpath
36
34
  else
37
- install?(pwd = Pathname.pwd) ? pwd.join(main) : pwd
35
+ install?(pwd = @home) ? pwd.join(main) : pwd
38
36
  end
39
37
  @root = @home.parent
40
38
  @manifest_url = url
41
39
  @manifest = manifest
40
+ set_ref = lambda do
41
+ if group
42
+ @script[:group][:_] = group.to_s
43
+ elsif ref
44
+ @script[:ref][:_] = ref.to_sym
45
+ end
46
+ end
42
47
  if repo?
43
48
  @script[:build] = case (val = env('REPO_BUILD'))
44
49
  when 'verbose'
@@ -53,8 +58,15 @@ module Squared
53
58
  end
54
59
  @script[:dev] = bool_match(env('REPO_DEV'), dev)
55
60
  @script[:prod] = bool_match(env('REPO_PROD'), prod)
56
- @script[:ref][:_] = env('REPO_REF', ref)
57
- @script[:group][:_] = env('REPO_GROUP', group)
61
+ if (val = env('REPO_GROUP'))
62
+ @script[:group][:_] = val.to_s
63
+ @script[:env] = true
64
+ elsif (val = env('REPO_REF'))
65
+ @script[:ref][:_] = val.to_sym
66
+ @script[:env] = true
67
+ else
68
+ set_ref
69
+ end
58
70
  @warning = case env('REPO_WARN')
59
71
  when '0'
60
72
  false
@@ -68,22 +80,11 @@ module Squared
68
80
  @script[:build] = run
69
81
  @script[:dev] = dev
70
82
  @script[:prod] = prod
71
- @script[:ref][:_] = ref
72
- @script[:group][:_] = group
83
+ set_ref
73
84
  end
74
85
  self
75
86
  end
76
87
 
77
- protected
78
-
79
- def repo?
80
- !@manifest_url.nil? && (install? || !!@override)
81
- end
82
-
83
- def empty?(dir)
84
- dir.empty? || (dir.children.size == 1 && dir.join(dir.children.first).to_s == __FILE__)
85
- end
86
-
87
88
  private
88
89
 
89
90
  def __repo__(**kwargs)
@@ -125,7 +126,7 @@ module Squared
125
126
  stage ||= 'all'
126
127
  repo['sync'].invoke
127
128
  @project.select do |_, proj|
128
- next unless proj.enabled?
129
+ next false unless proj.enabled? && proj.ref?(Project::Base.ref)
129
130
 
130
131
  proj.depend if proj.depend?
131
132
  proj.build?
@@ -192,6 +193,14 @@ module Squared
192
193
  end
193
194
  end
194
195
 
196
+ def repo?
197
+ !@manifest_url.nil? && (install? || !!@override)
198
+ end
199
+
200
+ def empty?(dir)
201
+ dir.empty? || (dir.children.size == 1 && dir.join(dir.children.first).to_s == __FILE__)
202
+ end
203
+
195
204
  def install?(dir = root)
196
205
  return true if empty?(dir) || dir.join('.repo').directory?
197
206
  return false unless dir == root && env('REPO_HOME').nil? && !env('REPO_ROOT').nil?
@@ -8,18 +8,22 @@ module Squared
8
8
  include ::Rake::DSL
9
9
  extend Forwardable
10
10
 
11
+ TASK_BASE = %i[build refresh depend outdated doc test copy clean].freeze
12
+ TASK_KEYS = TASK_BASE.dup
13
+ TASK_EXTEND = {}
14
+ private_constant :TASK_BASE, :TASK_KEYS, :TASK_EXTEND
15
+
16
+ def self.add(task, obj)
17
+ TASK_KEYS << task unless TASK_KEYS.include?(task)
18
+ (TASK_EXTEND[task] ||= []).push(obj)
19
+ end
20
+
11
21
  attr_reader :sync, :multiple, :parallel
12
22
 
13
23
  def_delegators :@data, :[], :each, :each_key, :keys, :fetch, :to_a, :to_s, :inspect, :merge!, :key?
14
24
 
15
- def initialize(tasks, keys: Workspace::Application::WORKSPACE_KEYS)
16
- if tasks.is_a?(Array)
17
- @data = {}
18
- tasks.each { |key| __set__ key }
19
- else
20
- @data = tasks.dup
21
- end
22
- @keys = keys
25
+ def initialize(prefix = nil)
26
+ @prefix = prefix
23
27
  @sync = []
24
28
  @multiple = []
25
29
  @parallel = []
@@ -28,77 +32,80 @@ module Squared
28
32
  parent: {},
29
33
  id: []
30
34
  }
35
+ @data = {}
36
+ TASK_KEYS.each { |key| @data[key] = [] }
31
37
  end
32
38
 
33
39
  def __set__(key)
34
40
  self[key.to_sym] ||= []
35
41
  end
36
42
 
37
- def populate(proj)
43
+ def __populate__(proj)
38
44
  return unless @session
39
45
 
40
46
  group, parent, id = @session.values
41
- workspace = proj.workspace
47
+ ws = proj.workspace
42
48
  each do |key, items|
43
- target = "#{proj.name}:#{key}"
44
- if @keys.include?(key)
45
- next unless proj.has?(key) || (target = workspace.task_base?(key, target))
46
- else
47
- next unless workspace.task_include?(proj, key)
48
- end
49
- next unless workspace.task_defined?(target)
49
+ task = "#{proj.name}:#{key}"
50
+ next if include?(key) ? !proj.has?(key) && !(task = ws.task_base?(key, task)) : !ws.task_extend?(proj, key)
51
+ next unless ws.task_defined?(task)
50
52
 
51
53
  if (g = proj.group)
52
54
  id << g
53
- (group[:"#{key}:#{g}"] ||= []).push(target)
55
+ (group[:"#{key}:#{g}"] ||= []).push(task)
54
56
  else
55
- items << target
57
+ items << task
56
58
  end
57
- next unless (b = find_base(proj)) && (name = b.ref.to_s) != g
59
+ next unless (b = ws.find_base(proj)) && (name = b.ref.to_s) != g
58
60
 
59
61
  id << name
60
- (parent[:"#{key}:#{name}"] ||= []).push(target)
62
+ (parent[:"#{key}:#{name}"] ||= []).push(task)
61
63
  end
62
64
  end
63
65
 
64
- def build(**kwargs)
65
- thread = kwargs.fetch(:parallel, []).map(&:to_s)
66
+ def __build__(parallel: [], **)
66
67
  group, parent, id = @session.values
67
68
  merge!(parent) if id.uniq.size > 1
68
69
  merge!(group)
69
70
  each do |key, items|
70
71
  next if items.empty?
71
72
 
72
- key = key.to_s
73
+ name = key.to_s
74
+ key = @prefix ? "#{@prefix}:#{name}" : name
75
+ val = key.split(':').join(' => ')
73
76
  if items.size > 1
74
- multiple << key
75
- if thread.include?(key) || (key.include?(':') && thread.include?(key.split(':').first.to_sym))
76
- desc "#{key} (thread)"
77
+ @multiple << key
78
+ if parallel.include?(name) || (name.include?(':') && parallel.include?(name.split(':').first.to_sym))
79
+ desc "#{val} (thread)"
77
80
  multitask key => items
78
- parallel << key
81
+ @parallel << key
79
82
 
80
- desc "#{key} (sync)"
81
- task "#{key}:sync": items
82
- sync << "#{key}:sync"
83
- multiple << "#{key}:sync"
83
+ desc "#{val} (sync)"
84
+ task "#{key}:sync" => items
85
+ @sync << "#{key}:sync"
84
86
  next
85
87
  end
86
88
  end
87
89
 
88
- desc key
90
+ desc val
89
91
  task key => items
90
92
  end
93
+ @multiple += sync
91
94
  @session = nil
92
95
  end
93
96
 
94
- def method_missing(key, *)
95
- self[key]
96
- end
97
-
98
97
  def has?(key)
99
98
  !key.nil? && key?(key = key.to_sym) && !self[key].empty?
100
99
  end
101
100
 
101
+ def include?(key)
102
+ TASK_BASE.include?(key)
103
+ end
104
+
105
+ def extend?(obj, key)
106
+ TASK_EXTEND.fetch(key, []).any? { |kind| obj.is_a?(kind) && obj.ref?(kind.ref) }
107
+ end
108
+
102
109
  def multiple?(val = nil)
103
110
  already_invoked?(multiple, val)
104
111
  end
@@ -111,12 +118,14 @@ module Squared
111
118
  already_invoked?(parallel, val)
112
119
  end
113
120
 
114
- def respond_to_missing?(key, *)
115
- key?(key)
116
- end
117
-
118
121
  private
119
122
 
123
+ def method_missing(key, *)
124
+ raise NoMethodError, key unless key?(key)
125
+
126
+ self[key]
127
+ end
128
+
120
129
  def already_invoked?(list, val)
121
130
  return list.include?(val) && Common::Task.invoked?(val) if val
122
131
 
@@ -12,7 +12,7 @@ module Squared
12
12
  if id.is_a?(::Symbol)
13
13
  project id
14
14
  else
15
- (id = Pathname.new(id).realdirpath.to_s) rescue nil if id.is_a?(::String)
15
+ id = dirpath(id) if id.is_a?(::String)
16
16
  __get__(:project).find { |_, val| val.path.to_s == id.to_s }
17
17
  end
18
18
  end
@@ -26,6 +26,12 @@ module Squared
26
26
  raise NoMethodError, message('project is not initialized', hint: name)
27
27
  end
28
28
 
29
+ def dirpath(val, absolute: true)
30
+ Pathname.new(val).realdirpath
31
+ rescue StandardError
32
+ absolute ? Pathname.pwd.join(val) : Pathname.new(val)
33
+ end
34
+
29
35
  def project?(name)
30
36
  !!project(name)&.enabled?
31
37
  end
@@ -39,6 +45,6 @@ module Squared
39
45
  end
40
46
  end
41
47
 
42
- require_relative 'workspace/application'
43
48
  require_relative 'workspace/series'
49
+ require_relative 'workspace/application'
44
50
  require_relative 'workspace/project'
data/squared.gemspec CHANGED
@@ -26,4 +26,5 @@ Gem::Specification.new do |spec|
26
26
 
27
27
  spec.add_dependency "rake"
28
28
  spec.add_dependency "logger"
29
+ spec.add_dependency "rexml"
29
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: squared
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - An Pham
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-11-12 00:00:00.000000000 Z
11
+ date: 2024-11-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rexml
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  description: Rake task generator for managing multi-language workspaces.
42
56
  email:
43
57
  - anpham6@gmail.com