squared 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -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