justprep 1.2.3 → 1.2.4
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 +4 -4
- data/README.md +17 -8
- data/justprep.gemspec +7 -9
- data/lib/justprep/common/constants.crb +51 -5
- data/lib/justprep/common/error_messages.crb +19 -1
- data/lib/justprep/common/expand_file_path.crb +3 -0
- data/lib/justprep/common/generate_module_tasks.crb +61 -0
- data/lib/justprep/common/handle_command_line_parameters.crb +16 -2
- data/lib/justprep/common/include_content_from.crb +4 -2
- data/lib/justprep/common/just_find_it.crb +5 -1
- data/lib/justprep/common/replacement_for_module_line.crb +4 -0
- data/lib/justprep/common/usage.crb +33 -8
- data/lib/justprep/crystal_methods.rb +1 -1
- data/lib/justprep.rb +16 -15
- metadata +9 -15
- data/lib/justprep/common/generate_module_recipes.crb +0 -27
- data/prototype.rb +0 -125
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa284b4a811b6a6482c55b8fbb60e13e20833583d92d7b5d43672bf0dd9178a1
|
4
|
+
data.tar.gz: 592f588b3f165fa25e4fb0309f6763ceb625d8859cb6e1d80709a98bb3bd0eb8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a5d250ba9b75361d51c0c756772a846199f8486b4ce2772b0c2d60e76550e9f3bde3b59ac2b3d77d249594bb30246a89de64d97e26e4089ba3dd711bacf2535d
|
7
|
+
data.tar.gz: 6dc5e9a051e6326a95decf12dae092fe9ca59d97f25344009818f784fdf47f12960ccbe007a921d46b12ff4264b6536b0a5257e5e92f7bda4dd708aafd9e27c7
|
data/README.md
CHANGED
@@ -1,19 +1,28 @@
|
|
1
|
-
#
|
1
|
+
# `justprep`
|
2
2
|
|
3
|
-
|
3
|
+
Just a CLI pre-processor tool for task runners like "just" my current favorite.
|
4
4
|
|
5
|
-
|
5
|
+
This directory is the codebase for the Ruby gem implementation. It also contains the common directory where \*.crb files are kept. These are the files that are shared between this Ruby gem implementation and the Crystal implementation.
|
6
6
|
|
7
|
-
|
7
|
+
### Installation for the Ruby version
|
8
8
|
|
9
|
-
|
9
|
+
gem install justprep
|
10
10
|
|
11
|
-
|
11
|
+
### Installation for the Crystal version
|
12
12
|
|
13
|
-
|
13
|
+
brew install --build-from-source MadBomber/tap/justprep
|
14
|
+
|
15
|
+
### Documentation
|
16
|
+
|
17
|
+
Since this capability is implemented in both Ruby and Crystal there is only one set of documentation. Both implementations act the same way. See the [repository's Wiki](https://github.com/MadBomber/justprep/wiki) for details.
|
18
|
+
|
19
|
+
|
20
|
+
### Contributing
|
14
21
|
|
15
22
|
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/justprep.
|
16
23
|
|
24
|
+
If you have a different CLI task runner than what justprep currently supports, let me know so we can add it to the support list.
|
25
|
+
|
17
26
|
## License
|
18
27
|
|
19
|
-
|
28
|
+
justprep is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/justprep.gemspec
CHANGED
@@ -8,18 +8,16 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["Dewayne VanHoozer"]
|
9
9
|
spec.email = ["dvanhoozer@gmail.com"]
|
10
10
|
|
11
|
-
spec.summary = "
|
11
|
+
spec.summary = "Just a pre-processor for CLI task runners like 'just'"
|
12
12
|
spec.description = <<~EOS
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
been process a new "justfile" is created which can then be used by
|
19
|
-
the 'just' tool.
|
13
|
+
justprep is a CLI tool implemented as a Ruby gem AND a
|
14
|
+
compiled Crystal binary. It allows a task file to be
|
15
|
+
auto-generated from seperate source files that contain
|
16
|
+
inclusionary keywords such as include, import, require
|
17
|
+
and with.
|
20
18
|
EOS
|
21
19
|
|
22
|
-
spec.homepage = "http://github.com/MadBomber/justprep
|
20
|
+
spec.homepage = "http://github.com/MadBomber/justprep"
|
23
21
|
spec.license = "MIT"
|
24
22
|
spec.required_ruby_version = ">= 2.4.0"
|
25
23
|
|
@@ -1,7 +1,53 @@
|
|
1
|
-
VERSION = "1.2.
|
1
|
+
VERSION = "1.2.4"
|
2
2
|
|
3
|
-
|
4
|
-
JUSTPREP_FILENAME_OUT = ENV.fetch("JUSTPREP_FILENAME_OUT", "justfile")
|
5
|
-
JUSTPREP_KEYWORDS = ENV.fetch("JUSTPREP_KEYWORDS", "import include require with").split
|
3
|
+
class Justprep
|
6
4
|
|
7
|
-
|
5
|
+
# define class variables used for configuration
|
6
|
+
# This helps Crystal know what the type of the varibles are.
|
7
|
+
|
8
|
+
@@justprep_for = "String"
|
9
|
+
@@justprep_module_keyword = "String"
|
10
|
+
@@justprep_keywords = ["String", "String"]
|
11
|
+
@@justprep_filename_in = "String"
|
12
|
+
@@justprep_filename_out = "String"
|
13
|
+
@@filename_option = "String"
|
14
|
+
|
15
|
+
|
16
|
+
# defining all these instance methods for Ruby's unit tests
|
17
|
+
|
18
|
+
def justprep_for ; @@justprep_for end
|
19
|
+
def justprep_module_keyword; @@justprep_module_keyword end
|
20
|
+
def justprep_keywords ; @@justprep_keywords end
|
21
|
+
def justprep_filename_in ; @@justprep_filename_in end
|
22
|
+
def justprep_filename_out ; @@justprep_filename_out end
|
23
|
+
def filename_option ; @@filename_option end
|
24
|
+
|
25
|
+
|
26
|
+
def using_just?
|
27
|
+
"just" == @@justprep_for
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
# Sets the configuration class variables from their cooresponding
|
32
|
+
# system environment variables. Any configuration coming from the
|
33
|
+
# command-line parameters are set in the handle_command_line_parameters()
|
34
|
+
# method.
|
35
|
+
#
|
36
|
+
def set_configuration
|
37
|
+
@@justprep_for = ENV.fetch("JUSTPREP_FOR", "just")
|
38
|
+
@@justprep_module_keyword = ENV.fetch("JUSTPREP_MODULE_KEYWORD", "module")
|
39
|
+
@@justprep_keywords = ENV.fetch("justprep_keywords", "import include require with").split
|
40
|
+
|
41
|
+
if using_just?
|
42
|
+
@@justprep_filename_in = ENV.fetch("JUSTPREP_FILENAME_IN", "main.just")
|
43
|
+
@@justprep_filename_out = ENV.fetch("JUSTPREP_FILENAME_OUT", "justfile")
|
44
|
+
@@filename_option = "-f"
|
45
|
+
|
46
|
+
else
|
47
|
+
@@justprep_filename_in = ENV.fetch("JUSTPREP_FILENAME_IN")
|
48
|
+
@@justprep_filename_out = ENV.fetch("JUSTPREP_FILENAME_OUT")
|
49
|
+
@@filename_option = ""
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end # class Justprep
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# common/error_messages.crb
|
2
2
|
|
3
|
+
class Justprep
|
4
|
+
|
3
5
|
# Parameters:
|
4
6
|
# line_number .. Integer (zero-based index)
|
5
7
|
# a_line ....... String
|
@@ -19,7 +21,7 @@ def error_file_does_not_exist(line_number, a_line)
|
|
19
21
|
|
20
22
|
x = a_line.index(" ")
|
21
23
|
|
22
|
-
if a_line.starts_with?(
|
24
|
+
if a_line.starts_with?(@@justprep_module_keyword.to_s)
|
23
25
|
x = a_line.index(" ", x.nil? ? 0 : x + 1) # because Crystal thinks x could be nil
|
24
26
|
end
|
25
27
|
|
@@ -51,3 +53,19 @@ def error_syntax(line_number, a_line)
|
|
51
53
|
return nil
|
52
54
|
end
|
53
55
|
|
56
|
+
|
57
|
+
def error_keyword_conflict
|
58
|
+
comma_space = ", "
|
59
|
+
STDERR.puts "
|
60
|
+
|
61
|
+
ERROR: There is a conflict between the environment variables
|
62
|
+
$JUSTPREP_MODULE_KEYWORD _cannot_ be in $JUSTPREP_KEYWORDS
|
63
|
+
|
64
|
+
$JUSTPREP_KEYWORDS => #{@@justprep_keywords.join(comma_space)}
|
65
|
+
$JUSTPREP_MODULE_KEYWORD => #{@@justprep_module_keyword}
|
66
|
+
|
67
|
+
"
|
68
|
+
return nil
|
69
|
+
end
|
70
|
+
|
71
|
+
end # class Justprep
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# common/expand_file_path.crb
|
2
2
|
|
3
|
+
class Justprep
|
4
|
+
|
3
5
|
# use an external shell to expand system environment variables
|
4
6
|
def expand_file_path(a_path_string)
|
5
7
|
a_path_string = a_path_string.strip
|
@@ -13,3 +15,4 @@ def expand_file_path(a_path_string)
|
|
13
15
|
return a_path_string
|
14
16
|
end
|
15
17
|
|
18
|
+
end # class Justprep
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# .../ruby/lib/justprep/common/generate_module_tasks.crb
|
2
|
+
|
3
|
+
class Justprep
|
4
|
+
|
5
|
+
# Given an Array of Strings representing the fake
|
6
|
+
# module names it returns a String to be appended
|
7
|
+
# to the generated justfile.
|
8
|
+
#
|
9
|
+
# Input:
|
10
|
+
# module_names .... Array(String) fake module names
|
11
|
+
#
|
12
|
+
# Output:
|
13
|
+
# tasks ... String
|
14
|
+
#
|
15
|
+
def generate_module_tasks(module_names)
|
16
|
+
if self.using_just?
|
17
|
+
tasks = create_just_tasks(module_names)
|
18
|
+
else
|
19
|
+
tasks = "# Do not know how to make modules for #{@@justprep_for}"
|
20
|
+
end
|
21
|
+
|
22
|
+
return tasks
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
def create_just_tasks(module_names)
|
27
|
+
tasks = ""
|
28
|
+
|
29
|
+
module_names.each do |mod_name|
|
30
|
+
tasks += "
|
31
|
+
|
32
|
+
# Module #{mod_name}
|
33
|
+
@#{mod_name} what='' args='':
|
34
|
+
#{@@justprep_for} #{@@filename_option} {{module_#{mod_name}}} {{what}} {{args}}
|
35
|
+
|
36
|
+
"
|
37
|
+
end
|
38
|
+
|
39
|
+
return tasks
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
def create_run_tasks(module_names)
|
44
|
+
tasks = ""
|
45
|
+
|
46
|
+
module_names.each do |mod_name|
|
47
|
+
tasks += "
|
48
|
+
|
49
|
+
##
|
50
|
+
# Module #{mod_name}
|
51
|
+
# Encapsulates additional tasks
|
52
|
+
#{mod_name}:
|
53
|
+
#{JUSTPREP_FOR} #{FILENAME_OPTION} ${module_#{mod_name}} ${@}
|
54
|
+
|
55
|
+
"
|
56
|
+
end
|
57
|
+
|
58
|
+
return tasks
|
59
|
+
end
|
60
|
+
|
61
|
+
end # class Justprep
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# common/handle_command_line_parameters.crb
|
2
2
|
|
3
|
+
class Justprep
|
3
4
|
|
4
5
|
# take care of ARGV
|
5
6
|
#
|
@@ -8,17 +9,30 @@
|
|
8
9
|
# otherwise it terminates the process
|
9
10
|
#
|
10
11
|
def handle_command_line_parameters
|
12
|
+
# When true, header/footer wrappers around include content are excluded
|
13
|
+
@@no_brag = false
|
14
|
+
|
11
15
|
if ARGV.size > 0
|
12
16
|
ARGV.each do |param|
|
13
17
|
if "--version" == param
|
14
18
|
puts "jusrprep v#{VERSION} (#{IMPLEMENTATION})"
|
19
|
+
exit(1)
|
15
20
|
elsif ["-h", "--help"].includes?(param)
|
16
21
|
usage
|
22
|
+
exit(1)
|
23
|
+
elsif "--no-brag" == param
|
24
|
+
@@no_brag = true
|
17
25
|
else
|
18
26
|
STDERR.puts "justprep does not support: #{param}"
|
27
|
+
exit(1)
|
19
28
|
end
|
20
29
|
end
|
21
|
-
|
22
|
-
exit(1)
|
23
30
|
end
|
24
31
|
end
|
32
|
+
|
33
|
+
|
34
|
+
def no_brag?
|
35
|
+
@@no_brag
|
36
|
+
end
|
37
|
+
|
38
|
+
end # class Justprep
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# .../ruby/lib/justprep/common/def include_content_from.crb
|
2
2
|
|
3
|
+
class Justprep
|
3
4
|
|
4
5
|
# single-level inclusion
|
5
6
|
#
|
@@ -11,14 +12,15 @@
|
|
11
12
|
# nil .... This is a function without specific return value
|
12
13
|
#
|
13
14
|
def include_content_from(out_file, module_filename)
|
14
|
-
out_file.puts "\n# >>> #{module_filename}"
|
15
|
+
out_file.puts "\n# >>> #{module_filename}" unless no_brag?
|
15
16
|
|
16
17
|
File.read_lines(module_filename).each do |m_line|
|
17
18
|
out_file.puts m_line
|
18
19
|
end
|
19
20
|
|
20
|
-
out_file.puts "# <<< #{module_filename}\n"
|
21
|
+
out_file.puts "# <<< #{module_filename}\n" unless no_brag?
|
21
22
|
|
22
23
|
return nil
|
23
24
|
end
|
24
25
|
|
26
|
+
end # class Justprep
|
@@ -1,9 +1,11 @@
|
|
1
1
|
# common/just_find_it.crb
|
2
2
|
|
3
|
+
class Justprep
|
4
|
+
|
3
5
|
# look for first occurace of mainfile
|
4
6
|
# returns nil when none are found.
|
5
7
|
def just_find_it(here = FileUtils.pwd)
|
6
|
-
mainfile_path = here + "/" +
|
8
|
+
mainfile_path = here + "/" + @@justprep_filename_in.to_s
|
7
9
|
return mainfile_path if File.exists?(mainfile_path)
|
8
10
|
|
9
11
|
parts = here.to_s.split("/")
|
@@ -12,3 +14,5 @@ def just_find_it(here = FileUtils.pwd)
|
|
12
14
|
return nil if parts.empty?
|
13
15
|
return just_find_it(parts.join('/'))
|
14
16
|
end
|
17
|
+
|
18
|
+
end # class Justprep
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# .../ruby/lig/justprep/common/replacement_for_module_line.crb
|
2
2
|
|
3
|
+
class Justprep
|
4
|
+
|
3
5
|
# Inserts the module_name into the Array of module_names
|
4
6
|
# Returns a string that defines the variable for the path to the module
|
5
7
|
#
|
@@ -48,3 +50,5 @@ def replacement_for_module_line(line_number, a_string)
|
|
48
50
|
|
49
51
|
return [module_name, "module_#{module_name} := \"#{path_to_module}\""]
|
50
52
|
end
|
53
|
+
|
54
|
+
end # class Justprep
|
@@ -1,30 +1,53 @@
|
|
1
1
|
# common/usage.crb
|
2
2
|
|
3
|
+
class Justprep
|
4
|
+
|
3
5
|
def usage
|
4
6
|
usage_text = "
|
5
7
|
justprep v#{VERSION} (#{IMPLEMENTATION})
|
6
8
|
|
7
|
-
|
9
|
+
Just a pre-processor to CLI task runners such as 'just'
|
8
10
|
By Dewayne VanHoozer <dvanhoozer@gmail.com>
|
9
11
|
|
10
12
|
USAGE:
|
11
|
-
justprep [flags]
|
13
|
+
justprep [flags]
|
14
|
+
justprep && #{@@justprep_for}
|
12
15
|
|
13
16
|
FLAGS:
|
14
17
|
--version Shows the current version
|
15
18
|
-h, --help Displays this usage message
|
19
|
+
--no-brag Do not add header/footer around included content
|
16
20
|
|
17
21
|
DESCRIPTION:
|
18
|
-
Looks for a file named #{
|
22
|
+
Looks for a file named #{@@justprep_filename_in} in the current
|
19
23
|
directory hierarchy. If found it replaces all lines that
|
20
|
-
have the keywords (#{
|
21
|
-
by file path with the contents of the specified file.
|
24
|
+
have the keywords (#{@@justprep_keywords.join(", ")}) followed
|
25
|
+
by a file path with the contents of the specified file.
|
26
|
+
|
27
|
+
if it finds a line that begins with the module keyword
|
28
|
+
(#{@@justprep_module_keyword}) in sets up a fake module
|
29
|
+
system consistent with the target CLI task runner #{@@justprep_for}.
|
22
30
|
|
23
31
|
SYSTEM ENVIRONMENT VARIABLES:
|
24
|
-
Default Value
|
25
|
-
|
26
|
-
|
32
|
+
Default / Current Value
|
33
|
+
JUSTPREP_FOR ............ 'just'
|
34
|
+
'#{@@justprep_for}'
|
35
|
+
|
36
|
+
JUSTPREP_FILENAME_IN .... 'main.just'
|
37
|
+
'#{@@justprep_filename_in}'
|
38
|
+
|
39
|
+
JUSTPREP_FILENAME_OUT ... 'justfile'
|
40
|
+
'#{@@justprep_filename_out}'
|
41
|
+
|
27
42
|
JUSTPREP_KEYWORDS ....... 'import include require with'
|
43
|
+
'#{@@justprep_keywords.join(' ')}'
|
44
|
+
|
45
|
+
JUSTPREP_MODULE_KEYWORD . 'module'
|
46
|
+
'#{@@justprep_module_keyword}'
|
47
|
+
|
48
|
+
DOCUMENTATION:
|
49
|
+
A full set of documentation can be found in the project's
|
50
|
+
wiki: https://github.com/MadBomber/justprep/wiki
|
28
51
|
|
29
52
|
SUGGESTION:
|
30
53
|
Create an alias for your command shell. For example
|
@@ -44,3 +67,5 @@ THANKS TO:
|
|
44
67
|
|
45
68
|
return usage_text
|
46
69
|
end
|
70
|
+
|
71
|
+
end # class Justprep
|
data/lib/justprep.rb
CHANGED
@@ -10,8 +10,9 @@
|
|
10
10
|
#
|
11
11
|
# variable name default value
|
12
12
|
# --------------------- -------------
|
13
|
-
#
|
14
|
-
#
|
13
|
+
# JUSTPREP_FOR ............ 'just'
|
14
|
+
# JUSTPREP_FILENAME_IN ... 'main.just'
|
15
|
+
# JUSTPREP_FILENAME_OUT ... 'justfile'
|
15
16
|
# JUSTPREP_KEYWORDS ... 'import include require with'
|
16
17
|
# JUSTPREP_MODULE_KEYWORD . 'module'
|
17
18
|
#
|
@@ -39,7 +40,7 @@ load COMMON_DIR + "expand_file_path.crb"
|
|
39
40
|
load COMMON_DIR + "handle_command_line_parameters.crb"
|
40
41
|
load COMMON_DIR + "just_find_it.crb"
|
41
42
|
load COMMON_DIR + "usage.crb"
|
42
|
-
load COMMON_DIR + "
|
43
|
+
load COMMON_DIR + "generate_module_tasks.crb"
|
43
44
|
load COMMON_DIR + "replacement_for_module_line.crb"
|
44
45
|
load COMMON_DIR + "include_content_from.crb"
|
45
46
|
|
@@ -47,6 +48,7 @@ class Justprep
|
|
47
48
|
attr_accessor :module_names
|
48
49
|
|
49
50
|
def initialize
|
51
|
+
set_configuration # sets class vars from envars
|
50
52
|
handle_command_line_parameters # may terminate the process
|
51
53
|
@module_names = []
|
52
54
|
end
|
@@ -54,23 +56,22 @@ class Justprep
|
|
54
56
|
|
55
57
|
# Main function called from executable
|
56
58
|
def execute
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
STDERR.puts
|
59
|
+
# SMELL: for some reason the crystal_methods alias_method of
|
60
|
+
# includes? for include? is not working.
|
61
|
+
|
62
|
+
if @@justprep_keywords.include?(@@justprep_module_keyword)
|
63
|
+
error_keyword_conflict
|
63
64
|
exit(1)
|
64
65
|
end
|
65
66
|
|
66
67
|
in_filename = just_find_it
|
67
68
|
|
68
69
|
if in_filename.nil?
|
69
|
-
STDERR.puts "WARNING: JUSTPREP_FILENAME_IN Not Found: #{
|
70
|
+
STDERR.puts "WARNING: $JUSTPREP_FILENAME_IN Not Found: #{@@justprep_filename_in}"
|
70
71
|
exit(0)
|
71
72
|
end
|
72
73
|
|
73
|
-
out_filename = File.dirname(in_filename) + "/" +
|
74
|
+
out_filename = File.dirname(in_filename) + "/" + @@justprep_filename_out
|
74
75
|
|
75
76
|
in_file = File.open(in_filename, "r")
|
76
77
|
out_file = File.open(out_filename, "w")
|
@@ -90,8 +91,8 @@ class Justprep
|
|
90
91
|
# NOTE: Leading spaces are not allowed. The keywords
|
91
92
|
# MUST be complete left-justified.
|
92
93
|
#
|
93
|
-
if
|
94
|
-
out_file.puts "# #{a_line}"
|
94
|
+
if @@justprep_keywords.include?(parts.first.downcase)
|
95
|
+
out_file.puts "# #{a_line}" unless no_brag?
|
95
96
|
|
96
97
|
glob_filename = expand_file_path(parts[1..parts.size].join(" "))
|
97
98
|
|
@@ -110,7 +111,7 @@ class Justprep
|
|
110
111
|
exit(1)
|
111
112
|
end
|
112
113
|
end
|
113
|
-
elsif
|
114
|
+
elsif @@justprep_module_keyword == parts.first.downcase
|
114
115
|
result_array = replacement_for_module_line(line_number, a_line)
|
115
116
|
@module_names << result_array.first
|
116
117
|
out_file.puts result_array.last
|
@@ -119,7 +120,7 @@ class Justprep
|
|
119
120
|
end
|
120
121
|
end # in_file.readlines ...
|
121
122
|
|
122
|
-
out_file.puts
|
123
|
+
out_file.puts generate_module_tasks(@module_names)
|
123
124
|
|
124
125
|
out_file.close
|
125
126
|
end # def
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: justprep
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dewayne VanHoozer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bump
|
@@ -24,14 +24,9 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
description:
|
28
|
-
allows a
|
29
|
-
that
|
30
|
-
and with. These keywords are followed by a path to a file. If the
|
31
|
-
file exists, the contents of the file are inserted into the file
|
32
|
-
at the position of the keyword command. After all keywords have
|
33
|
-
been process a new "justfile" is created which can then be used by
|
34
|
-
the 'just' tool.
|
27
|
+
description: "justprep is a CLI tool implemented as a Ruby gem AND a \ncompiled Crystal
|
28
|
+
binary. It allows a task file to be \nauto-generated from seperate source files
|
29
|
+
that contain \ninclusionary keywords such as include, import, require \nand with.\n"
|
35
30
|
email:
|
36
31
|
- dvanhoozer@gmail.com
|
37
32
|
executables:
|
@@ -53,7 +48,7 @@ files:
|
|
53
48
|
- lib/justprep/common/constants.crb
|
54
49
|
- lib/justprep/common/error_messages.crb
|
55
50
|
- lib/justprep/common/expand_file_path.crb
|
56
|
-
- lib/justprep/common/
|
51
|
+
- lib/justprep/common/generate_module_tasks.crb
|
57
52
|
- lib/justprep/common/handle_command_line_parameters.crb
|
58
53
|
- lib/justprep/common/include_content_from.crb
|
59
54
|
- lib/justprep/common/just_find_it.crb
|
@@ -61,8 +56,7 @@ files:
|
|
61
56
|
- lib/justprep/common/usage.crb
|
62
57
|
- lib/justprep/crystal_methods.rb
|
63
58
|
- lib/justprep/version.rb
|
64
|
-
|
65
|
-
homepage: http://github.com/MadBomber/justprep/tree/main/ruby
|
59
|
+
homepage: http://github.com/MadBomber/justprep
|
66
60
|
licenses:
|
67
61
|
- MIT
|
68
62
|
metadata:
|
@@ -82,8 +76,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
82
76
|
- !ruby/object:Gem::Version
|
83
77
|
version: '0'
|
84
78
|
requirements: []
|
85
|
-
rubygems_version: 3.3.
|
79
|
+
rubygems_version: 3.3.18
|
86
80
|
signing_key:
|
87
81
|
specification_version: 4
|
88
|
-
summary:
|
82
|
+
summary: Just a pre-processor for CLI task runners like 'just'
|
89
83
|
test_files: []
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# .../ruby/lib/justprep/common/generate_module_recipes.crb
|
2
|
-
|
3
|
-
# Given an Array of Strings representing the fake
|
4
|
-
# module names it returns a String to be appended
|
5
|
-
# to the generated justfile.
|
6
|
-
#
|
7
|
-
# Input:
|
8
|
-
# module_names .... Array(String) fake module names
|
9
|
-
#
|
10
|
-
# Output:
|
11
|
-
# recipes ... String
|
12
|
-
#
|
13
|
-
def generate_module_recipes(module_names)
|
14
|
-
recipes = ""
|
15
|
-
|
16
|
-
module_names.each do |mod_name|
|
17
|
-
recipes += "
|
18
|
-
|
19
|
-
# Module #{mod_name}
|
20
|
-
@#{mod_name} what='' args='':
|
21
|
-
just -f {{module_#{mod_name}}} {{what}} {{args}}
|
22
|
-
|
23
|
-
"
|
24
|
-
end
|
25
|
-
|
26
|
-
return recipes
|
27
|
-
end
|
data/prototype.rb
DELETED
@@ -1,125 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# encoding: utf-8
|
3
|
-
# frozen_string_literal: true
|
4
|
-
# warn_indent: true
|
5
|
-
##########################################################
|
6
|
-
###
|
7
|
-
## File: justprep.rb
|
8
|
-
## Desc: A preprocessor for justfiles using "main.just"
|
9
|
-
## Looks for keywords: import include require with
|
10
|
-
## followed by a file name or path.
|
11
|
-
##
|
12
|
-
## It looks for a file "main.just" in the current directory.
|
13
|
-
## If it does not exist, does nothing. Otherwise it reviews
|
14
|
-
## the file for the KEYWORDS. When found it inserts the
|
15
|
-
## content of the specified file into that position. The
|
16
|
-
## final text is written out to the "justfile" for processing
|
17
|
-
## with the "just" tool.
|
18
|
-
##
|
19
|
-
## There is NO ERROR checking. including file names/paths
|
20
|
-
## are assume to have to space characters.
|
21
|
-
##
|
22
|
-
## By: Dewayne VanHoozer (dvanhoozer@gmail.com)
|
23
|
-
#
|
24
|
-
|
25
|
-
KEYWORDS = %w[ import include require with ]
|
26
|
-
BASEFILE = 'justfile'
|
27
|
-
MAINFILE = 'main.just'
|
28
|
-
|
29
|
-
require 'pathname'
|
30
|
-
|
31
|
-
######################################################
|
32
|
-
# Local methods
|
33
|
-
|
34
|
-
# review the text looking for module references
|
35
|
-
def find_modules(text)
|
36
|
-
modules = []
|
37
|
-
|
38
|
-
KEYWORDS.each do |keyword|
|
39
|
-
modules << text.select{|x| x.start_with? "#{keyword} "}
|
40
|
-
end
|
41
|
-
|
42
|
-
return modules.flatten!
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
# somg;e-level inclusion
|
47
|
-
def include_content_from(file_path)
|
48
|
-
content = []
|
49
|
-
content << "\n# >>> #{file_path}"
|
50
|
-
content << file_path.readlines.map{|x| x.chomp} # TODO: support recursion??
|
51
|
-
content << "# <<< #{file_path}\n"
|
52
|
-
|
53
|
-
return content.flatten
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
# look for first occurace of mainfile
|
58
|
-
def just_find_it(here=Pathname.pwd)
|
59
|
-
mainfile = here + MAINFILE
|
60
|
-
return mainfile if mainfile.exist?
|
61
|
-
return nil if here == here.parent
|
62
|
-
return just_find_it(here.parent)
|
63
|
-
end
|
64
|
-
|
65
|
-
|
66
|
-
# use an external shell to expand system environment variables
|
67
|
-
def expand_file_path(a_path_string)
|
68
|
-
if a_path_string.start_with? '~'
|
69
|
-
a_path_string = "${HOME}" + a_path_string[1, a_path_string.size-1]
|
70
|
-
end
|
71
|
-
|
72
|
-
a_path_string = `echo "#{a_path_string}"`.chomp
|
73
|
-
|
74
|
-
return a_path_string
|
75
|
-
end
|
76
|
-
|
77
|
-
|
78
|
-
######################################################
|
79
|
-
# Main
|
80
|
-
|
81
|
-
mainfile = just_find_it
|
82
|
-
|
83
|
-
exit(0) if mainfile.nil?
|
84
|
-
|
85
|
-
basefile = mainfile.parent + BASEFILE
|
86
|
-
|
87
|
-
text = mainfile.readlines.map{|x| x.chomp} # drop the line ending from each line
|
88
|
-
|
89
|
-
modules = find_modules text
|
90
|
-
|
91
|
-
if modules.empty?
|
92
|
-
basefile.write text
|
93
|
-
exit(0)
|
94
|
-
end
|
95
|
-
|
96
|
-
modules.each do |a_line|
|
97
|
-
an_index = text.index a_line
|
98
|
-
begin_filename = a_line.index(' ')
|
99
|
-
module_filename = a_line[begin_filename, a_line.size - begin_filename].strip
|
100
|
-
|
101
|
-
if module_filename.empty?
|
102
|
-
STDERR.puts "#{an_index}: #{a_line}"
|
103
|
-
STDERR.puts "ERROR: No path/to/file was provided"
|
104
|
-
next
|
105
|
-
end
|
106
|
-
|
107
|
-
if module_filename.include?('~') || module_filename.include?('$')
|
108
|
-
module_filename = expand_file_path(module_filename)
|
109
|
-
end
|
110
|
-
|
111
|
-
module_path = Pathname.new(module_filename)
|
112
|
-
|
113
|
-
if module_path.relative?
|
114
|
-
module_path = mainfile.parent + module_path
|
115
|
-
end
|
116
|
-
|
117
|
-
if module_path.exist?
|
118
|
-
text[an_index] = include_content_from(module_path)
|
119
|
-
else
|
120
|
-
STDERR.puts "#{an_index}: #{a_line}"
|
121
|
-
STDERR.puts "| ERROR: File Does Not Exist - #{module_path}"
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
basefile.write text.flatten!.join "\n"
|