squared 0.0.6 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 60e2da1ce8ec4439d4180db0c0f806d9984046ef5f12b34008563edd7b40b938
4
- data.tar.gz: 6eb7ef1c8273d10747cb79c1a113dae53210cebd167969f4a1546a9fc07162f0
3
+ metadata.gz: d9b753ae5817f7ddd43ccf1152dde2bd4bc8d37ed2eae1d39d7c118e84c20947
4
+ data.tar.gz: 910b375d08c1fda296862a22e612832eb0ebbbea505a6d860f2db9e48ff9a2ee
5
5
  SHA512:
6
- metadata.gz: 75f989753670bd5854a8dccc6a3bf8d3d7397d2a373a50d46eaa7add861ff8d1f24cffb1c9ac00d48756d89abb50728c35368beb62649b3d704f3d7b059b449a
7
- data.tar.gz: 6387222860eb65bd57cd14ba86b77b39d47a64d5a03940a5b6f6ac0ccea6368f0ab8df0a1886d5f6e6eec83f89887397b72f57a647a4ad06efa632020c1a5938
6
+ metadata.gz: 3595a660add974bb7bf69df55aaca30d7fb8bfb47ae21cdfd0b5d978ce36f35acb97e15f746d97204afa1a800c639a028e3835a9431addf63e6eb6402df6f87c
7
+ data.tar.gz: cda2b5a2aa217354d8f06d307c3136ae25d77358b0a478195c7ad945701f08f1e16450340819bd1a41e958a1a31f5e4b13ce167dee4a0d40630f4a3e9a61ada7
data/README.ruby.md CHANGED
@@ -6,12 +6,12 @@
6
6
 
7
7
  ## Prerequisites
8
8
 
9
- * Ruby 2.4+
9
+ * Ruby 2.4
10
10
 
11
11
  ### Optional
12
12
 
13
13
  * [Repo](https://source.android.com/docs/setup/reference/repo)
14
- * Python 3.6+
14
+ * Python 3.6
15
15
 
16
16
  ```sh
17
17
  mkdir -p ~/.bin
@@ -36,44 +36,61 @@ require "squared/workspace/repo" # Repo (optional)
36
36
 
37
37
  # REPO_ROOT = /workspaces
38
38
  # REPO_HOME = /workspaces/squared
39
+ # NODE_ENV = production
39
40
  # rake = /workspaces/squared/Rakefile
40
41
 
41
42
  Workspace::Application
42
- .new("squared") # REPO_HOME
43
- .repo("https://github.com/anpham6/squared-repo", "nightly", run: "build") # Repo (optional)
43
+ .new(main: "squared") # Dir.pwd? (main? is implicitly basename)
44
+ .repo("https://github.com/anpham6/squared-repo", "nightly", run: "build", ref: :node) # Repo (optional)
44
45
  .run("rake install", ref: :ruby)
45
- .clean("rake clean", group: "default") # depend test doc
46
+ .depend(false, group: "default")
47
+ .clean("rake clean", group: "default")
46
48
  .clean(["build/"], group: "app")
47
49
  .add("pathname", run: "rake compile", copy: "rake install", test: "rake test", group: "default", ref: :ruby) # Ruby (with C extensions)
48
50
  .add("optparse", doc: "rake rdoc", group: "default") # Uses bundler/gem_tasks (without C extensions)
49
51
  .add("logger", copy: { from: "lib", glob: "**/*.rb", gemdir: "~/.rvm/gems/ruby-3.3.5/gems/logger-1.6.1" }, clean: ["tmp/"]) # autodetect: true
50
- .add("android", "android-docs", run: false, doc: "make html", ref: :python) # Python
51
52
  .add("emc", "e-mc", copy: { from: "publish", into: "@e-mc", also: [:pir, "squared-express/"] }, ref: :node) # Node
52
53
  .add("pir", "pi-r", copy: { from: "publish", into: "@pi-r" }, clean: ["publish/**/*.js", "tmp/"]) # Trailing slash required for directories
53
54
  .add("squared", log: { file: "tmp/%Y-%m-%d.log", level: "debug" }, group: "app") # Copy target (main)
54
- .style(:banner, 255.255) # 256 colors (fg | fg.bg | -0.bg)
55
+ .add("sqd", "squared/sqd", script: ["build:sqd", "prod:sqd"], depend: false, clean: ["build/sqd/"], exclude: :git) # NPM workspaces
56
+ .style("banner", 255.255) # 256 colors (fg | fg.bg | -0.bg)
55
57
  .build(default: "status", parallel: ["pull", "fetch", "rebase", "copy", "clean"]) do |workspace|
56
58
  workspace
57
59
  .enable_aixterm
58
- .style(:banner, "bright_cyan", "bold", "bright_black!")
59
- .finalize! # Optional
60
+ .style({
61
+ banner: ["bright_cyan", "bold", "bright_black!"],
62
+ border: "bright_white"
63
+ })
60
64
  end
61
65
  # pathname = /workspaces/pathname
62
66
  # optparse = /workspaces/optparse
63
67
  # log = /workspaces/logger
64
- # android = /workspaces/android-docs
65
68
  # emc = /workspaces/e-mc
66
69
  # pir = /workspaces/pi-r
67
70
  # squared = /workspaces/squared
68
71
 
69
- Repo::Workspace
70
- .new("squared")
71
- .group("default", "ruby", run: "rake build", copy: "rake install", clean: "rake clean", pathname: { run: "rake compile" })
72
+ Workspace::Application
73
+ .new(ENV["SQUARED_DIR"], prefix: "rb", common: false) # Has empty styles
74
+ .group("default", "ruby", run: "rake build", copy: "rake install", clean: "rake clean", ref: :ruby, override: {
75
+ pathname: {
76
+ run: "rake compile" # rake rb:pathname:build
77
+ }
78
+ })
79
+ .with(ref: :python) do # Python
80
+ doc("make html") # rake rb:doc | rb:doc:python
81
+ run(false) # rake rb:build (disabled)
82
+ exclude(%i[base git]) # superclass
83
+ add("android", "android-docs") # rake rb:android:doc
84
+ add("chrome", "chrome-docs") # rake rb:chrome:doc
85
+ end
86
+ .style("inline", "bold")
72
87
  .build
73
88
  # default = /workspaces/ruby/*
74
89
  # pathname = /workspaces/ruby/pathname
75
90
  # optparse = /workspaces/ruby/optparse
76
91
  # logger = /workspaces/ruby/logger
92
+ # android = /workspaces/android-docs
93
+ # chrome = /workspaces/chrome-docs
77
94
  ```
78
95
 
79
96
  **NOTE**: The use of "**ref**" (class name) is only necessary when running `repo:init` for the first time into an empty directory.
@@ -93,6 +110,7 @@ rake pull:node # emc + pir + squared
93
110
 
94
111
  rake build # All except "android"
95
112
  rake doc # optparse + android
113
+ rake depend # All except "default"
96
114
 
97
115
  rake build:ruby # rake compile + rake install + rake install
98
116
 
@@ -103,6 +121,23 @@ rake clean:app # none + skip + ["build/"]
103
121
  rake clean:node # none + ["publish/**/*.js", "tmp/"] + ["build/"]
104
122
  ```
105
123
 
124
+ ## Commands
125
+
126
+ * run
127
+ * depend
128
+ * test
129
+ * doc
130
+ * clean
131
+
132
+ ## Styles
133
+
134
+ * banner
135
+ * border
136
+ * header
137
+ * active
138
+ * inline
139
+ * major
140
+
106
141
  ## LICENSE
107
142
 
108
143
  BSD 3-Clause
@@ -23,7 +23,12 @@ module Squared
23
23
  white!: '47'
24
24
  },
25
25
  theme: {
26
- workspace: {},
26
+ workspace: {
27
+ header: %i[bold],
28
+ active: %i[bold],
29
+ inline: %i[bold],
30
+ major: %i[bold]
31
+ },
27
32
  project: {},
28
33
  viewer: {
29
34
  banner: %i[blue bold],
@@ -59,7 +64,15 @@ module Squared
59
64
  VAR[key.is_a?(::String) ? key.to_sym : key] = val
60
65
  end
61
66
 
62
- def env(key, equals: nil, ignore: nil, default: nil, **)
67
+ def __freeze__
68
+ VAR.each_value(&:freeze)
69
+ VAR[:theme].each_value(&:freeze)
70
+ VAR.freeze
71
+ end
72
+
73
+ module_function
74
+
75
+ def env(key, default = nil, equals: nil, ignore: nil, **)
63
76
  ret = ENV.fetch(key, '')
64
77
  return ret == equals.to_s unless equals.nil?
65
78
 
@@ -70,22 +83,15 @@ module Squared
70
83
  args.reject(&:empty?).join(' => ') + (hint ? " (#{hint})" : '')
71
84
  end
72
85
 
73
- def as_a(obj, flat: nil)
74
- if obj.nil?
75
- []
76
- elsif !obj.is_a?(::Array)
77
- [obj]
86
+ def as_a(obj, meth = nil, flat: nil)
87
+ return [] if obj.nil?
88
+
89
+ if !obj.is_a?(::Array)
90
+ obj = [obj]
78
91
  elsif flat
79
- obj.flatten(flat == true ? nil : flat)
80
- else
81
- obj
92
+ obj = obj.flatten(flat == true ? nil : flat)
82
93
  end
83
- end
84
-
85
- def finalize!
86
- VAR.each_value(&:freeze)
87
- VAR[:theme].each_value(&:freeze)
88
- VAR.freeze
94
+ meth ? obj.map(&meth) : obj
89
95
  end
90
96
  end
91
97
  end
@@ -15,10 +15,14 @@ module Squared
15
15
  end
16
16
 
17
17
  def done
18
- ret = to_a.map!(&:to_s).reject(&:empty?).join(@delim)
18
+ ret = to_s
19
19
  clear
20
20
  ret
21
21
  end
22
+
23
+ def to_s
24
+ to_a.map!(&:to_s).reject(&:empty?).join(@delim)
25
+ end
22
26
  end
23
27
  end
24
28
  end
@@ -39,46 +39,8 @@ module Squared
39
39
 
40
40
  private
41
41
 
42
- def emphasize(val, title: nil, cols: nil, sub: nil, pipe: nil)
43
- n = 0
44
- if title
45
- title = title.to_s
46
- n = title.size
47
- end
48
- if val.is_a?(::Array)
49
- lines = val
50
- else
51
- lines = val.to_s.lines.map(&:chomp)
52
- lines[0] = "#{val.class}: #{lines.first}" if (err = val.is_a?(::StandardError))
53
- end
54
- n = cols || [n, lines.max_by(&:size).size].max
55
- if $stdout.tty?
56
- require 'io/console'
57
- (n = [n, $stdout.winsize[1] - 4].min) rescue nil
58
- end
59
- out = []
60
- bord = '-' * (n + 4)
61
- sub = as_a(sub)
62
- pr = lambda do |line|
63
- s = line.ljust(n)
64
- sub.each { |h| s = sub_style(s, **h) }
65
- "| #{s} |"
66
- end
67
- out << bord
68
- out.push(pr.(title), bord) if title
69
- lines.each { |line| out << pr.(line) }
70
- out << bord
71
- if block_given?
72
- yield out
73
- elsif pipe.respond_to?(:puts)
74
- pipe.puts out
75
- else
76
- err ? warn(out) : puts(out)
77
- end
78
- end
79
-
80
42
  def sub_style(val, *args, styles: nil, pat: nil, index: 1)
81
- return val unless ENV['NO_COLOR'].to_s.empty?
43
+ return val unless ENV.fetch('NO_COLOR', '').empty? && !__get__(:no_color)
82
44
 
83
45
  if pat && index != 0
84
46
  return val unless (data = pat.match(val))
@@ -158,11 +120,12 @@ module Squared
158
120
  ret << "-0.#{b}".to_f unless b.to_i > 255
159
121
  end
160
122
  end
161
- !empty && ret.empty? ? nil : ret
123
+ ret if empty || !ret.empty?
162
124
  end
163
125
 
164
126
  def apply_style(data, key, *args, empty: true)
165
- return unless !data.is_a?(Symbol) || (data = __get__(:theme)[data])
127
+ data = __get__(:theme)[data] if data.is_a?(Symbol)
128
+ return unless data
166
129
 
167
130
  set = ->(k, v) { data[k.to_sym] = check_style(v, empty: empty) }
168
131
  if key.is_a?(Hash)
@@ -172,10 +135,6 @@ module Squared
172
135
  end
173
136
  end
174
137
 
175
- def raise_error(*args, hint: nil, kind: ArgumentError)
176
- raise kind, message(*args, hint: hint)
177
- end
178
-
179
138
  def log_title(level, color: true)
180
139
  level = if level.is_a?(::Numeric)
181
140
  case level
@@ -209,6 +168,50 @@ module Squared
209
168
  msg << (color ? sub_style(subject, :underline) : subject) if subject
210
169
  message(msg.join(' '), *args, hint: hint)
211
170
  end
171
+
172
+ def raise_error(*args, hint: nil, kind: ArgumentError)
173
+ raise kind, message(*args, hint: hint)
174
+ end
175
+
176
+ module_function
177
+
178
+ def emphasize(val, title: nil, cols: nil, sub: nil, pipe: nil)
179
+ n = 0
180
+ if title
181
+ title = title.to_s
182
+ n = title.size
183
+ end
184
+ if val.is_a?(::Array)
185
+ lines = val
186
+ else
187
+ lines = val.to_s.lines.map(&:chomp)
188
+ lines[0] = "#{val.class}: #{lines.first}" if (err = val.is_a?(::StandardError))
189
+ end
190
+ n = cols || [n, lines.max_by(&:size).size].max
191
+ if $stdout.tty?
192
+ require 'io/console'
193
+ (n = [n, $stdout.winsize[1] - 4].min) rescue nil
194
+ end
195
+ out = []
196
+ bord = '-' * (n + 4)
197
+ sub = [sub] if sub && !sub.is_a?(::Array)
198
+ pr = lambda do |line|
199
+ s = line.ljust(n)
200
+ sub&.each { |h| s = sub_style(s, **h) }
201
+ "| #{s} |"
202
+ end
203
+ out << bord
204
+ out << pr.(title) << bord if title
205
+ lines.each { |line| out << pr.(line) }
206
+ out << bord
207
+ if block_given?
208
+ yield out
209
+ elsif pipe.respond_to?(:puts)
210
+ pipe.puts out
211
+ else
212
+ err ? warn(out) : puts(out)
213
+ end
214
+ end
212
215
  end
213
216
  end
214
217
  end
@@ -6,12 +6,12 @@ require 'rake'
6
6
  module Squared
7
7
  module Common
8
8
  module Shell
9
- private
9
+ module_function
10
10
 
11
11
  def shell_escape(val, quote: false)
12
- return (quote ? shell_quote(val, force: false) : val) if ::Rake::Win32.windows?
12
+ return Shellwords.escape(val) unless ::Rake::Win32.windows?
13
13
 
14
- Shellwords.escape(val)
14
+ quote ? shell_quote(val, force: false) : val
15
15
  end
16
16
 
17
17
  def shell_quote(val, force: true)
@@ -6,7 +6,7 @@ require 'fileutils'
6
6
  module Squared
7
7
  module Common
8
8
  module System
9
- private
9
+ module_function
10
10
 
11
11
  def shell(*cmd, **kwargs)
12
12
  if RUBY_VERSION =~ /^2\.[0-5]\./
@@ -20,13 +20,44 @@ module Squared
20
20
  end
21
21
  end
22
22
 
23
+ def confirm(msg, agree: 'Y', cancel: 'N', default: nil, attempts: 5, timeout: 15)
24
+ require 'readline'
25
+ require 'timeout'
26
+ agree = /^#{agree}$/i if agree.is_a?(String)
27
+ cancel = /^#{cancel}$/i if cancel.is_a?(String)
28
+ Timeout.timeout(timeout) do
29
+ begin
30
+ while (ch = Readline.readline(msg, true))
31
+ ch = ch.chomp
32
+ ch = default if ch.empty?
33
+ case ch
34
+ when agree
35
+ return true
36
+ when cancel
37
+ return false
38
+ end
39
+ attempts -= 1
40
+ exit 1 unless attempts >= 0
41
+ end
42
+ rescue Interrupt
43
+ puts
44
+ exit 0
45
+ else
46
+ false
47
+ end
48
+ end
49
+ end
50
+
23
51
  def copy_d(src, dest, glob: ['**/*'], create: false, verbose: true)
52
+ src = Pathname.new(src)
53
+ dest = Pathname.new(dest)
24
54
  raise "#{dest} (not found)" if !create && !dest.exist?
25
55
 
26
56
  subdir = []
27
57
  files = 0
28
58
  dest.mkpath if create
29
- as_a(glob).each do |val|
59
+ glob = [glob] unless glob.is_a?(::Array)
60
+ glob.each do |val|
30
61
  Dir.glob(src.join(val)) do |path|
31
62
  ent = Pathname.new(path)
32
63
  next if ent.directory?
@@ -48,7 +79,8 @@ module Squared
48
79
  if !overwrite
49
80
  path = Pathname.new(dest)
50
81
  if path.directory?
51
- src = as_a(src).reject { |val| path.join(File.basename(val)).exist? }
82
+ src = [src] unless src.is_a?(::Array)
83
+ src = src.reject { |val| path.join(File.basename(val)).exist? }
52
84
  elsif path.exist?
53
85
  return
54
86
  end
@@ -5,22 +5,14 @@ require 'rake'
5
5
  module Squared
6
6
  module Common
7
7
  module Task
8
- private
8
+ module_function
9
9
 
10
- def collect_args(args, *keys)
11
- ret = []
12
- return ret unless args.is_a?(::Rake::TaskArguments)
13
-
14
- keys.each { |key| ret << args.fetch(key) if args.key?(key) }
15
- ret += args.extras
16
- end
17
-
18
- def invoke(name, *args, exception: true)
10
+ def invoke(name, *args, exception: true, warning: true)
19
11
  ::Rake::Task[name].invoke(*args)
20
12
  rescue StandardError => e
21
13
  raise if exception
22
14
 
23
- warn e
15
+ warn e if warning
24
16
  end
25
17
 
26
18
  def invoked?(name)
@@ -9,7 +9,6 @@ module Squared
9
9
  class Viewer
10
10
  include Common
11
11
  include Format
12
- include Task
13
12
  include ::Rake::DSL
14
13
 
15
14
  class << self
@@ -18,14 +17,15 @@ module Squared
18
17
  end
19
18
  end
20
19
 
21
- attr_reader :name, :main, :project, :theme
20
+ attr_reader :main, :name, :project, :theme
22
21
 
23
- 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)
24
23
  if project
25
24
  main = @project.base_path(main).to_s if (@project = __get__(:project)[project.to_sym])
26
25
  @required = true
27
26
  end
28
27
  @name = name&.to_s || @project&.name
28
+ @prefix = prefix
29
29
  @ext = File.extname(main)
30
30
  @dump = dump
31
31
  @mime = {}
@@ -52,7 +52,7 @@ module Squared
52
52
  @required = true
53
53
  project ? [project, 'not found'] : %w[name missing]
54
54
  end
55
- warn log_message(:warn, msg, subject: self.class, hint: hint, color: !pipe?)
55
+ warn log_message(:warn, msg, subject: self.class, hint: hint)
56
56
  end
57
57
 
58
58
  def build
@@ -60,18 +60,19 @@ module Squared
60
60
 
61
61
  params = ->(args) { exist? ? [realpath, [args.keys] + args.extras] : [args.keys, args.extras] }
62
62
 
63
- namespace name do
63
+ ns = @prefix ? "#{@prefix}:#{name}" : name
64
+ namespace ns do
64
65
  view = @command && @command != name ? @command : 'view'
65
66
  namespace view do
66
- if @mime['json'] && (exist? || !::Rake::Task.task_defined?("#{name}:#{view}:json"))
67
- desc format_desc(view, %w[json])
67
+ if @mime['json'] && (exist? || !::Rake::Task.task_defined?("#{ns}:#{view}:json"))
68
+ desc format_desc(view, 'json')
68
69
  task 'json', [:keys] do |_, args|
69
70
  read_keys(JSON, 'json', *params.(args))
70
71
  end
71
72
  end
72
73
 
73
- if @mime['yaml'] && (exist? || !::Rake::Task.task_defined?("#{name}:#{view}:yaml"))
74
- desc format_desc(view, %w[yaml yml])
74
+ if @mime['yaml'] && (exist? || !::Rake::Task.task_defined?("#{ns}:#{view}:yaml"))
75
+ desc format_desc(view, 'yaml', 'yml')
75
76
  task 'yaml', [:keys] do |_, args|
76
77
  require 'yaml'
77
78
  read_keys(YAML, 'yaml', *params.(args), ext: %w[yml yaml])
@@ -92,12 +93,13 @@ module Squared
92
93
  obj = eval(parse)
93
94
  ext << type if (ext = as_a(ext)).empty?
94
95
  file = realpath if file.nil? && exist?
95
- namespace name do
96
- desc format_desc(command, ext, exist: exist)
96
+
97
+ namespace(@prefix ? "#{@prefix}:#{name}" : name) do
98
+ desc format_desc(command, *ext, exist: exist)
97
99
  namespace command do
98
100
  task type, [:keys] do |_, args|
99
101
  if file
100
- read_keys(obj, type, file.to_s, collect_args(args, :keys), ext: ext)
102
+ read_keys(obj, type, file.to_s, args.to_a, ext: ext)
101
103
  else
102
104
  read_keys(obj, type, args.keys, args.extras, ext: ext)
103
105
  end
@@ -159,7 +161,7 @@ module Squared
159
161
  !@required || (!project.nil? && project.enabled?)
160
162
  end
161
163
 
162
- protected
164
+ private
163
165
 
164
166
  def read_keys(reader, type, file, keys, ext: [type])
165
167
  if (mime = mime_type(file)) && base_path(file).exist?
@@ -188,7 +190,7 @@ module Squared
188
190
  title = Pathname.new(file)
189
191
  .realpath
190
192
  .to_s
191
- .sub(/^#{Regexp.escape(Dir.pwd + ::File::SEPARATOR)}/, '')
193
+ .sub(Regexp.new("^#{Regexp.escape(File.join(Dir.pwd, ''))}"), '')
192
194
  sub = if pipe?
193
195
  nil
194
196
  else
@@ -225,7 +227,7 @@ module Squared
225
227
  end
226
228
  end
227
229
  rescue StandardError
228
- project&.log&.warn "#{Viewer}(#{type}) => #{file ? "#{file} " : ''}{#{key}: undefined}"
230
+ project&.log&.warn "#{Viewer}(#{type}) => #{file && "#{file} "}{#{key}: undefined}"
229
231
  val = Regexp.escape($!.message)
230
232
  key = key.sub(/(#{val})\.|\.(#{val})|(#{val})/) do
231
233
  s = "<#{$3 || $2 || $1}>"
@@ -263,8 +265,9 @@ module Squared
263
265
  end
264
266
  end
265
267
 
266
- def format_desc(command, ext, exist: exist?)
267
- 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*]")
268
271
  end
269
272
 
270
273
  def realpath
@@ -284,7 +287,7 @@ module Squared
284
287
  end
285
288
 
286
289
  def warning?
287
- project && defined?(project.warning) == 'method' ? project.warning : true
290
+ project ? project.workspace.warning : true
288
291
  end
289
292
  end
290
293
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Squared
4
- VERSION = '0.0.6'
4
+ VERSION = '0.0.8'
5
5
  end