squared 0.0.4 → 0.0.6

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: 1795e8352e8278c8f4e26ced26ac936ce906ee8e626a9cf2ff2bf6a86412f09c
4
- data.tar.gz: '08b8e2538b6316ffb141c15e560187222cbb18e0a37f5c74af6ed5fda87e6dc3'
3
+ metadata.gz: 60e2da1ce8ec4439d4180db0c0f806d9984046ef5f12b34008563edd7b40b938
4
+ data.tar.gz: 6eb7ef1c8273d10747cb79c1a113dae53210cebd167969f4a1546a9fc07162f0
5
5
  SHA512:
6
- metadata.gz: a8d6bd537e66b744edd760ead7441aad45961bdc746e9ca81f577e8183893cd6209203f2ba507b5ab608bbf3ebe7a15aeb23aa84005a76bf10d0f3b3704c403d
7
- data.tar.gz: 9a29c720ce14050bc604c9b561c376f55437865610827075dd6a2a961ce82b22c1f4b3fd303884186f9c59b1a330ed73ce14ad16169724c3578d8d4e01388bfe
6
+ metadata.gz: 75f989753670bd5854a8dccc6a3bf8d3d7397d2a373a50d46eaa7add861ff8d1f24cffb1c9ac00d48756d89abb50728c35368beb62649b3d704f3d7b059b449a
7
+ data.tar.gz: 6387222860eb65bd57cd14ba86b77b39d47a64d5a03940a5b6f6ac0ccea6368f0ab8df0a1886d5f6e6eec83f89887397b72f57a647a4ad06efa632020c1a5938
data/README.ruby.md CHANGED
@@ -28,19 +28,26 @@ gem install squared
28
28
 
29
29
  ## Example - Rakefile
30
30
 
31
+ 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.
32
+
31
33
  ```ruby
32
34
  require "squared"
35
+ require "squared/workspace/repo" # Repo (optional)
33
36
 
34
- Repo::Workspace
37
+ # REPO_ROOT = /workspaces
38
+ # REPO_HOME = /workspaces/squared
39
+ # rake = /workspaces/squared/Rakefile
40
+
41
+ Workspace::Application
35
42
  .new("squared") # REPO_HOME
36
- .repo("https://github.com/anpham6/squared-repo", "nightly", run: 'build') # Optional
43
+ .repo("https://github.com/anpham6/squared-repo", "nightly", run: "build") # Repo (optional)
37
44
  .run("rake install", ref: :ruby)
38
45
  .clean("rake clean", group: "default") # depend test doc
39
46
  .clean(["build/"], group: "app")
40
47
  .add("pathname", run: "rake compile", copy: "rake install", test: "rake test", group: "default", ref: :ruby) # Ruby (with C extensions)
41
48
  .add("optparse", doc: "rake rdoc", group: "default") # Uses bundler/gem_tasks (without C extensions)
42
49
  .add("logger", copy: { from: "lib", glob: "**/*.rb", gemdir: "~/.rvm/gems/ruby-3.3.5/gems/logger-1.6.1" }, clean: ["tmp/"]) # autodetect: true
43
- .add("android", "android-docs", run: false, doc: "make html", ref: :python) # task namespace "android" | directory "android-docs"
50
+ .add("android", "android-docs", run: false, doc: "make html", ref: :python) # Python
44
51
  .add("emc", "e-mc", copy: { from: "publish", into: "@e-mc", also: [:pir, "squared-express/"] }, ref: :node) # Node
45
52
  .add("pir", "pi-r", copy: { from: "publish", into: "@pi-r" }, clean: ["publish/**/*.js", "tmp/"]) # Trailing slash required for directories
46
53
  .add("squared", log: { file: "tmp/%Y-%m-%d.log", level: "debug" }, group: "app") # Copy target (main)
@@ -51,6 +58,22 @@ Repo::Workspace
51
58
  .style(:banner, "bright_cyan", "bold", "bright_black!")
52
59
  .finalize! # Optional
53
60
  end
61
+ # pathname = /workspaces/pathname
62
+ # optparse = /workspaces/optparse
63
+ # log = /workspaces/logger
64
+ # android = /workspaces/android-docs
65
+ # emc = /workspaces/e-mc
66
+ # pir = /workspaces/pi-r
67
+ # squared = /workspaces/squared
68
+
69
+ Repo::Workspace
70
+ .new("squared")
71
+ .group("default", "ruby", run: "rake build", copy: "rake install", clean: "rake clean", pathname: { run: "rake compile" })
72
+ .build
73
+ # default = /workspaces/ruby/*
74
+ # pathname = /workspaces/ruby/pathname
75
+ # optparse = /workspaces/ruby/optparse
76
+ # logger = /workspaces/ruby/logger
54
77
  ```
55
78
 
56
79
  **NOTE**: The use of "**ref**" (class name) is only necessary when running `repo:init` for the first time into an empty directory.
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Squared
4
+ module Common
5
+ VAR = {
6
+ project: {},
7
+ colors: {
8
+ black: '30',
9
+ red: '31',
10
+ green: '32',
11
+ yellow: '33',
12
+ blue: '34',
13
+ magenta: '35',
14
+ cyan: '36',
15
+ white: '37',
16
+ black!: '40',
17
+ red!: '41',
18
+ green!: '42',
19
+ yellow!: '43',
20
+ blue!: '44',
21
+ magenta!: '45',
22
+ cyan!: '46',
23
+ white!: '47'
24
+ },
25
+ theme: {
26
+ workspace: {},
27
+ project: {},
28
+ viewer: {
29
+ banner: %i[blue bold],
30
+ key: %i[bold],
31
+ value: %i[green],
32
+ string: %i[yellow],
33
+ hash: %i[green black!],
34
+ array: %i[blue black!],
35
+ number: %i[magenta],
36
+ undefined: %i[red italic]
37
+ },
38
+ logger: {
39
+ unknown: %i[cyan],
40
+ fatal: %i[white bold red!],
41
+ error: %i[red bold],
42
+ warn: %i[yellow bold],
43
+ info: %i[blue],
44
+ debug: %i[green]
45
+ }
46
+ }
47
+ }.compare_by_identity
48
+ private_constant :VAR
49
+
50
+ private
51
+
52
+ def __get__(key)
53
+ VAR[key.is_a?(::String) ? key.to_sym : key]
54
+ end
55
+
56
+ def __set__(key, val)
57
+ return if VAR.frozen?
58
+
59
+ VAR[key.is_a?(::String) ? key.to_sym : key] = val
60
+ end
61
+
62
+ def env(key, equals: nil, ignore: nil, default: nil, **)
63
+ ret = ENV.fetch(key, '')
64
+ return ret == equals.to_s unless equals.nil?
65
+
66
+ ret.empty? || (ignore && as_a(ignore).any? { |val| ret == val.to_s }) ? default : ret
67
+ end
68
+
69
+ def message(*args, hint: nil)
70
+ args.reject(&:empty?).join(' => ') + (hint ? " (#{hint})" : '')
71
+ end
72
+
73
+ def as_a(obj, flat: nil)
74
+ if obj.nil?
75
+ []
76
+ elsif !obj.is_a?(::Array)
77
+ [obj]
78
+ elsif flat
79
+ obj.flatten(flat == true ? nil : flat)
80
+ else
81
+ obj
82
+ end
83
+ end
84
+
85
+ def finalize!
86
+ VAR.each_value(&:freeze)
87
+ VAR[:theme].each_value(&:freeze)
88
+ VAR.freeze
89
+ end
90
+ end
91
+ end
@@ -6,7 +6,7 @@ module Squared
6
6
  module Common
7
7
  class JoinSet < ::Set
8
8
  def self.to_s
9
- /[^:]+$/.match(super.to_s)[0]
9
+ super.to_s.match(/[^:]+$/)[0]
10
10
  end
11
11
 
12
12
  def initialize(data = [], delim: ' ')
@@ -1,5 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'logger'
4
+
5
+ require_relative 'base'
6
+
3
7
  module Squared
4
8
  module Common
5
9
  module Format
@@ -33,6 +37,8 @@ module Squared
33
37
  block_given? ? yield(self) : self
34
38
  end
35
39
 
40
+ private
41
+
36
42
  def emphasize(val, title: nil, cols: nil, sub: nil, pipe: nil)
37
43
  n = 0
38
44
  if title
@@ -66,14 +72,12 @@ module Squared
66
72
  yield out
67
73
  elsif pipe.respond_to?(:puts)
68
74
  pipe.puts out
69
- elsif err
70
- defined?(__warn__) == 'method' ? __warn__(out) : warn(out)
71
75
  else
72
- puts out
76
+ err ? warn(out) : puts(out)
73
77
  end
74
78
  end
75
79
 
76
- def sub_style(val, *args, pat: nil, styles: nil, index: 1)
80
+ def sub_style(val, *args, styles: nil, pat: nil, index: 1)
77
81
  return val unless ENV['NO_COLOR'].to_s.empty?
78
82
 
79
83
  if pat && index != 0
@@ -168,6 +172,10 @@ module Squared
168
172
  end
169
173
  end
170
174
 
175
+ def raise_error(*args, hint: nil, kind: ArgumentError)
176
+ raise kind, message(*args, hint: hint)
177
+ end
178
+
171
179
  def log_title(level, color: true)
172
180
  level = if level.is_a?(::Numeric)
173
181
  case level
@@ -188,13 +196,12 @@ module Squared
188
196
  level.to_s.downcase.to_sym
189
197
  end
190
198
  theme = __get__(:theme)[:logger]
191
- val = theme[level] || theme[level = :unknown]
192
- level = +level.to_s.upcase
193
- case level
199
+ styles = theme[level] || theme[level = :unknown]
200
+ case (ret = +level.to_s.upcase)
194
201
  when 'WARN', 'ERROR', 'FATAL'
195
- level += '!'
202
+ ret += '!'
196
203
  end
197
- color ? sub_style(level, *val) : level
204
+ color ? sub_style(ret, *styles) : ret
198
205
  end
199
206
 
200
207
  def log_message(level, *args, subject: nil, hint: nil, color: true)
@@ -1,24 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'shellwords'
4
+ require 'rake'
5
+
3
6
  module Squared
4
7
  module Common
5
8
  module Shell
6
- def shell_escape(val)
7
- return val if ::Rake::Win32.windows?
9
+ private
10
+
11
+ def shell_escape(val, quote: false)
12
+ return (quote ? shell_quote(val, force: false) : val) if ::Rake::Win32.windows?
8
13
 
9
- require 'shellwords'
10
14
  Shellwords.escape(val)
11
15
  end
12
16
 
13
17
  def shell_quote(val, force: true)
14
18
  ret = val.to_s.strip
15
- return ret if (!force && !ret.include?(' ')) || ret.match?(/(?:^|=)(["']).+\1$/m)
19
+ return ret if (!force && !ret.include?(' ')) || ret =~ /(?:^|=)(["']).+\1$/m
16
20
 
17
21
  ::Rake::Win32.windows? ? "\"#{double_quote(ret)}\"" : "'#{single_quote(ret)}'"
18
22
  end
19
23
 
20
24
  def fill_option(val)
21
- return "-#{val}" if val.size == 1 || val.match?(/^[a-z]\d+$/i)
25
+ return "-#{val}" if val.size == 1 || val =~ /^[a-z]\d+$/i
22
26
 
23
27
  val = "--#{val}" unless val.start_with?('-')
24
28
  shell_escape(val).sub('\\=', '=')
@@ -36,10 +40,6 @@ module Squared
36
40
  val.split(/\s*(?<!\\)#{char}\s*/)
37
41
  end
38
42
 
39
- def trailing_slash(val)
40
- val.to_s.chomp(::File::SEPARATOR) + ::File::SEPARATOR
41
- end
42
-
43
43
  def sanitize_args(*opts)
44
44
  opts.map { |val| val.include?(' ') ? shell_quote(val) : shell_escape(val) }.join(' ')
45
45
  end
@@ -1,12 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'pathname'
4
+ require 'fileutils'
4
5
 
5
6
  module Squared
6
7
  module Common
7
8
  module System
9
+ private
10
+
8
11
  def shell(*cmd, **kwargs)
9
- if /^2\.[0-5]\./.match?(RUBY_VERSION)
12
+ if RUBY_VERSION =~ /^2\.[0-5]\./
10
13
  exception = kwargs.delete(:exception)
11
14
  ret = system(*cmd, **kwargs)
12
15
  raise $?.to_s if !ret && exception
@@ -1,13 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'rake'
4
+
3
5
  module Squared
4
6
  module Common
5
7
  module Task
8
+ private
9
+
6
10
  def collect_args(args, *keys)
7
11
  ret = []
8
12
  return ret unless args.is_a?(::Rake::TaskArguments)
9
13
 
10
- keys.each { |key| ret << args[key] if args[key] }
14
+ keys.each { |key| ret << args.fetch(key) if args.key?(key) }
11
15
  ret += args.extras
12
16
  end
13
17
 
@@ -16,7 +20,7 @@ module Squared
16
20
  rescue StandardError => e
17
21
  raise if exception
18
22
 
19
- defined?(__warn__) == 'method' ? __warn__(e) : warn(e)
23
+ warn e
20
24
  end
21
25
 
22
26
  def invoked?(name)
@@ -1,86 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'pathname'
4
- require 'logger'
5
4
  require 'rake'
6
5
 
7
- module Squared
8
- module Common
9
- VAR = {
10
- project: {},
11
- colors: {
12
- black: '30',
13
- red: '31',
14
- green: '32',
15
- yellow: '33',
16
- blue: '34',
17
- magenta: '35',
18
- cyan: '36',
19
- white: '37',
20
- black!: '40',
21
- red!: '41',
22
- green!: '42',
23
- yellow!: '43',
24
- blue!: '44',
25
- magenta!: '45',
26
- cyan!: '46',
27
- white!: '47'
28
- },
29
- theme: {
30
- workspace: {},
31
- project: {},
32
- viewer: {
33
- banner: %i[blue bold],
34
- key: %i[bold],
35
- value: %i[green],
36
- string: %i[yellow],
37
- hash: %i[green black!],
38
- array: %i[blue black!],
39
- number: %i[magenta],
40
- undefined: %i[red italic]
41
- },
42
- logger: {
43
- unknown: %i[cyan],
44
- fatal: %i[white bold red!],
45
- error: %i[red bold],
46
- warn: %i[yellow bold],
47
- info: %i[blue],
48
- debug: %i[green]
49
- }
50
- }
51
- }.compare_by_identity
52
- private_constant :VAR
53
-
54
- def __get__(key)
55
- VAR[key.is_a?(::String) ? key.to_sym : key]
56
- end
57
-
58
- def __set__(key, val)
59
- return if VAR.frozen?
60
-
61
- VAR[key.is_a?(::String) ? key.to_sym : key] = val
62
- end
63
-
64
- def finalize!
65
- VAR.each_value(&:freeze)
66
- VAR[:theme].each_value(&:freeze)
67
- VAR.freeze
68
- end
69
-
70
- def message(*args, hint: nil)
71
- args.reject(&:empty?).join(' => ') + (hint ? " (#{hint})" : '')
72
- end
73
-
74
- def as_a(obj, flat: nil)
75
- return [] if obj.nil?
76
- return [obj] unless obj.is_a?(::Array)
77
- return obj unless flat
78
-
79
- obj.flatten(flat == true ? nil : flat)
80
- end
81
- end
82
- end
83
-
6
+ require_relative 'common/base'
84
7
  require_relative 'common/class'
85
8
  require_relative 'common/format'
86
9
  require_relative 'common/shell'
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'json'
4
4
 
5
+ require_relative 'common'
6
+
5
7
  module Squared
6
8
  module Config
7
9
  class Viewer
@@ -12,7 +14,7 @@ module Squared
12
14
 
13
15
  class << self
14
16
  def to_s
15
- /[^:]+$/.match(super.to_s)[0]
17
+ super.to_s.match(/[^:]+$/)[0]
16
18
  end
17
19
  end
18
20
 
@@ -63,14 +65,14 @@ module Squared
63
65
  namespace view do
64
66
  if @mime['json'] && (exist? || !::Rake::Task.task_defined?("#{name}:#{view}:json"))
65
67
  desc format_desc(view, %w[json])
66
- task :json, [:keys] do |_, args|
68
+ task 'json', [:keys] do |_, args|
67
69
  read_keys(JSON, 'json', *params.(args))
68
70
  end
69
71
  end
70
72
 
71
73
  if @mime['yaml'] && (exist? || !::Rake::Task.task_defined?("#{name}:#{view}:yaml"))
72
74
  desc format_desc(view, %w[yaml yml])
73
- task :yaml, [:keys] do |_, args|
75
+ task 'yaml', [:keys] do |_, args|
74
76
  require 'yaml'
75
77
  read_keys(YAML, 'yaml', *params.(args), ext: %w[yml yaml])
76
78
  end
@@ -161,7 +163,7 @@ module Squared
161
163
 
162
164
  def read_keys(reader, type, file, keys, ext: [type])
163
165
  if (mime = mime_type(file)) && base_path(file).exist?
164
- raise ArgumentError, message(file, mime, hint: 'invalid') unless ext.include?(mime)
166
+ raise_error(file, mime, hint: 'invalid') unless ext.include?(mime)
165
167
  else
166
168
  if ext.include?(mime)
167
169
  alt = file
@@ -172,11 +174,9 @@ module Squared
172
174
  alt = base_path("#{main}.{#{ext.join(',')}}")
173
175
  file = Dir[alt].first
174
176
  end
175
- unless file
176
- raise ArgumentError, message(reader.name, "#{File.basename(alt, '.*')}.#{ext.first}", hint: 'not found')
177
- end
177
+ raise_error(reader.name, "#{File.basename(alt, '.*')}.#{ext.first}", hint: 'not found') unless file
178
178
  end
179
- project&.info "#{Viewer}(#{type}) => #{file} {#{keys.join(', ')}}"
179
+ project&.log&.info "#{Viewer}(#{type}) => #{file} {#{keys.join(', ')}}"
180
180
  doc = if reader.respond_to?(:load_file)
181
181
  reader.load_file(file, **@mime[type])
182
182
  else
@@ -225,7 +225,7 @@ module Squared
225
225
  end
226
226
  end
227
227
  rescue StandardError
228
- project&.warn "#{Viewer}(#{type}) => #{file ? "#{file} " : ''}{#{key}: undefined}"
228
+ project&.log&.warn "#{Viewer}(#{type}) => #{file ? "#{file} " : ''}{#{key}: undefined}"
229
229
  val = Regexp.escape($!.message)
230
230
  key = key.sub(/(#{val})\.|\.(#{val})|(#{val})/) do
231
231
  s = "<#{$3 || $2 || $1}>"
@@ -284,7 +284,7 @@ module Squared
284
284
  end
285
285
 
286
286
  def warning?
287
- project ? project.warning : true
287
+ project && defined?(project.warning) == 'method' ? project.warning : true
288
288
  end
289
289
  end
290
290
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Squared
4
- VERSION = '0.0.4'
4
+ VERSION = '0.0.6'
5
5
  end