standalone-ruby 1.3 → 1.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.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -19
  3. data/bin/standalone-ruby +3 -3
  4. data/lib/data/exe_template/launcher_stub.c +35 -0
  5. data/lib/data/exe_template/launcher_stub.cpp +9 -0
  6. data/lib/data/tcc/include/_mingw.h +54 -0
  7. data/lib/data/tcc/include/assert.h +71 -0
  8. data/lib/data/tcc/include/conio.h +159 -0
  9. data/lib/data/tcc/include/ctype.h +232 -0
  10. data/lib/data/tcc/include/dir.h +26 -0
  11. data/lib/data/tcc/include/direct.h +95 -0
  12. data/lib/data/tcc/include/dirent.h +96 -0
  13. data/lib/data/tcc/include/dos.h +110 -0
  14. data/lib/data/tcc/include/errno.h +117 -0
  15. data/lib/data/tcc/include/excpt.h +20 -0
  16. data/lib/data/tcc/include/fcntl.h +135 -0
  17. data/lib/data/tcc/include/fenv.h +85 -0
  18. data/lib/data/tcc/include/float.h +224 -0
  19. data/lib/data/tcc/include/inttypes.h +275 -0
  20. data/lib/data/tcc/include/io.h +296 -0
  21. data/lib/data/tcc/include/limits.h +115 -0
  22. data/lib/data/tcc/include/locale.h +100 -0
  23. data/lib/data/tcc/include/malloc.h +87 -0
  24. data/lib/data/tcc/include/math.h +438 -0
  25. data/lib/data/tcc/include/mem.h +8 -0
  26. data/lib/data/tcc/include/memory.h +9 -0
  27. data/lib/data/tcc/include/process.h +158 -0
  28. data/lib/data/tcc/include/setjmp.h +72 -0
  29. data/lib/data/tcc/include/share.h +44 -0
  30. data/lib/data/tcc/include/signal.h +111 -0
  31. data/lib/data/tcc/include/stdarg.h +16 -0
  32. data/lib/data/tcc/include/stdbool.h +10 -0
  33. data/lib/data/tcc/include/stddef.h +26 -0
  34. data/lib/data/tcc/include/stdint.h +184 -0
  35. data/lib/data/tcc/include/stdio.h +413 -0
  36. data/lib/data/tcc/include/stdlib.h +482 -0
  37. data/lib/data/tcc/include/string.h +206 -0
  38. data/lib/data/tcc/include/sys/fcntl.h +8 -0
  39. data/lib/data/tcc/include/sys/file.h +9 -0
  40. data/lib/data/tcc/include/sys/locking.h +52 -0
  41. data/lib/data/tcc/include/sys/stat.h +190 -0
  42. data/lib/data/tcc/include/sys/time.h +3 -0
  43. data/lib/data/tcc/include/sys/timeb.h +82 -0
  44. data/lib/data/tcc/include/sys/types.h +118 -0
  45. data/lib/data/tcc/include/sys/unistd.h +9 -0
  46. data/lib/data/tcc/include/sys/utime.h +89 -0
  47. data/lib/data/tcc/include/tchar.h +367 -0
  48. data/lib/data/tcc/include/time.h +219 -0
  49. data/lib/data/tcc/include/unistd.h +10 -0
  50. data/lib/data/tcc/include/values.h +4 -0
  51. data/lib/data/tcc/include/varargs.h +11 -0
  52. data/lib/data/tcc/include/wchar.h +318 -0
  53. data/lib/data/tcc/include/wctype.h +127 -0
  54. data/lib/data/tcc/include/winapi/basetsd.h +119 -0
  55. data/lib/data/tcc/include/winapi/basetyps.h +144 -0
  56. data/lib/data/tcc/include/winapi/winbase.h +1852 -0
  57. data/lib/data/tcc/include/winapi/wincon.h +207 -0
  58. data/lib/data/tcc/include/winapi/windef.h +240 -0
  59. data/lib/data/tcc/include/winapi/windows.h +176 -0
  60. data/lib/data/tcc/include/winapi/winerror.h +1054 -0
  61. data/lib/data/tcc/include/winapi/wingdi.h +2843 -0
  62. data/lib/data/tcc/include/winapi/winnetwk.h +346 -0
  63. data/lib/data/tcc/include/winapi/winnls.h +651 -0
  64. data/lib/data/tcc/include/winapi/winnt.h +2667 -0
  65. data/lib/data/tcc/include/winapi/winreg.h +159 -0
  66. data/lib/data/tcc/include/winapi/winsvc.h +309 -0
  67. data/lib/data/tcc/include/winapi/winuser.h +3472 -0
  68. data/lib/data/tcc/include/winapi/winver.h +133 -0
  69. data/lib/data/tcc/lib/gdi32.def +337 -0
  70. data/lib/data/tcc/lib/kernel32.def +763 -0
  71. data/lib/data/tcc/lib/libtcc1.a +0 -0
  72. data/lib/data/tcc/lib/msvcrt.def +782 -0
  73. data/lib/data/tcc/lib/user32.def +654 -0
  74. data/lib/data/tcc/tcc.exe +0 -0
  75. data/lib/data/tcc/tiny_impdef.exe +0 -0
  76. data/lib/data/tcc/tiny_libmaker.exe +0 -0
  77. data/lib/data/vbs/default_vbs.txt +1 -1
  78. data/lib/data/vbs/vbs_gui.txt +1 -1
  79. data/lib/standalone_ruby.rb +6 -6
  80. data/lib/utils/config_generator.rb +5 -0
  81. data/lib/utils/displayer.rb +61 -56
  82. data/lib/utils/exe_packer.rb +68 -0
  83. data/lib/utils/launcher.rb +55 -14
  84. data/lib/utils/launcher_handler.rb +27 -4
  85. data/lib/utils/logger_helper.rb +24 -22
  86. data/lib/utils/parameter_parser.rb +206 -189
  87. data/lib/utils/ruby_copy.rb +26 -20
  88. metadata +77 -3
  89. data/lib/data/bat/default_bat.txt +0 -9
@@ -1,57 +1,62 @@
1
- class Displayer
2
- def initialize(params)
3
- @params = params
4
- end
5
-
6
- def display_params
7
- begin
8
- display_text = []
9
-
10
- display_text << "Project Path: #{@params[:project_path]}" if @params[:project_path]
11
- display_text << "Ruby Path: #{@params[:ruby_path]}" if @params[:ruby_path]
12
- display_text << "Ruby Folder: #{File.basename(@params[:ruby_path])}" if @params[:ruby_path]
13
- display_text << "Main File: #{@params[:main_file]}" if @params[:main_file]
14
- display_text << "Launcher: #{@params[:launcher]}" if @params[:launcher]
15
- display_text << "Launcher Type: #{@params[:launcher_type]}" if @params[:launcher_type]
16
- display_text << "Template: #{@params[:template]}" if @params[:template]
17
- display_text << "Template: Default Template" unless @params[:template]
18
-
19
- puts display_text.join("\n") unless display_text.empty?
20
-
21
- rescue Exception => e
22
- print("Display Error: ".red); puts("#{e.message}".red)
23
- end
24
- end
25
-
26
- def banner
27
- banner = -<<'BANNER'
28
-
29
- ┌─┐┌┬┐┌─┐┌┐┌┌┬┐┌─┐┬ ┌─┐┌┐┌┌─┐ ┬─┐┬ ┬┌┐
30
- └─┐ ├─┤│││ ││├─┤│ │ ││││├┤ ├┬┘│ │├┴┐└┬┘
31
- └─┘ ┴ ┴ ┴┘└┘─┴┘┴ ┴┴─┘└─┘┘└┘└─┘ ┴└─└─┘└─┘ ┴
32
-
33
- # Github: https://github.com/ardatetikbey/Standalone-Ruby
34
-
35
- BANNER
36
-
37
- puts banner
38
- end
39
- end
40
-
41
- class String
42
- def red
43
- "\e[31m#{self}\e[0m"
44
- end
45
-
46
- def green
47
- "\e[32m#{self}\e[0m"
48
- end
49
-
50
- def magenta
51
- "\e[35m#{self}\e[0m"
52
- end
53
-
54
- def yellow
55
- "\e[33m#{self}\e[0m"
56
- end
1
+ require_relative 'logger_helper'
2
+
3
+ class Displayer
4
+ def initialize(params)
5
+ @params = params
6
+ @logger = LoggerHelper.instance
7
+ end
8
+
9
+ def display_params
10
+ begin
11
+ display_text = []
12
+
13
+ display_text << "Platform: #{@params[:platform]}" if @params[:platform]
14
+ display_text << "Project Path: #{@params[:project_path]}" if @params[:project_path]
15
+ display_text << "Exe File: #{@params[:exe]}" if @params[:exe]
16
+ display_text << "Ruby Path: #{@params[:ruby_path]}" if @params[:ruby_path]
17
+ display_text << "Compiler: TCC (Thanks! Credit: https://bellard.org/tcc/)"
18
+ display_text << "Ruby Folder: #{File.basename(@params[:ruby_path])}" if @params[:ruby_path]
19
+ display_text << "Main File: #{@params[:main_file]}" if @params[:main_file]
20
+ display_text << "Launcher: #{@params[:launcher]}" if @params[:launcher]
21
+ display_text << "Launcher Type: #{@params[:launcher_type]}" if @params[:launcher_type]
22
+ display_text << "Template: #{@params[:template]}" if @params[:template]
23
+ display_text << "Template: Default Template" unless @params[:template]
24
+ display_text << "Log Path: Users Documents Directory"
25
+
26
+ puts display_text.join("\n") unless display_text.empty?
27
+
28
+ rescue Exception => e
29
+ print("Display Error: ".red); puts("#{e.message}".red)
30
+ @logger.error("Display Error: #{e.message}")
31
+ end
32
+ end
33
+
34
+ def banner
35
+ banner = -<<'BANNER'
36
+ Standalone-Ruby v1.4 - Package your Ruby projects as exe!
37
+ # Github: https://github.com/ardatetikbey/Standalone-Ruby
38
+ # RubyGems: https://rubygems.org/gems/standalone-ruby
39
+
40
+ BANNER
41
+
42
+ puts banner
43
+ end
44
+ end
45
+
46
+ class String
47
+ def red
48
+ "\e[31m#{self}\e[0m"
49
+ end
50
+
51
+ def green
52
+ "\e[32m#{self}\e[0m"
53
+ end
54
+
55
+ def magenta
56
+ "\e[35m#{self}\e[0m"
57
+ end
58
+
59
+ def yellow
60
+ "\e[33m#{self}\e[0m"
61
+ end
57
62
  end
@@ -0,0 +1,68 @@
1
+ require_relative 'logger_helper'
2
+
3
+ class ExePacker
4
+ def initialize(params)
5
+ @params = params
6
+ @logger = LoggerHelper.instance
7
+ end
8
+
9
+ def pack
10
+ begin
11
+ stub_path = File.join(File.expand_path("../data/exe_template", __dir__), "launcher_stub.c")
12
+ @logger.info("Reading stub template from: #{stub_path}")
13
+
14
+ stub_content = File.read(stub_path)
15
+ stub_content.gsub!("LAUNCHER_FILE", "#{File.basename(@params[:launcher])}")
16
+
17
+ stub_output = "#{File.join(@params[:project_path].to_s, "launcher_stub.c")}"
18
+ exe_path = "#{File.join(@params[:project_path].to_s, @params[:exe].to_s)}"
19
+
20
+ File.open(stub_output, 'w') { |f| f.write(stub_content) }
21
+
22
+ if @params[:use_gcc]
23
+ puts "\nChecking GCC..."
24
+ output = `where gcc`
25
+
26
+ if File.exist?(output.strip)
27
+ gcc_path = output.strip
28
+ puts "GCC Path: #{gcc_path}"
29
+
30
+ command = "#{gcc_path} -o #{exe_path} #{stub_output}"
31
+ @logger.info("Running command: #{command}")
32
+ `#{command}`
33
+ else
34
+ print("Error: ".red); puts("GCC could not be found!");
35
+ exit!
36
+ end
37
+ else
38
+ puts "\nUsing TCC..."
39
+
40
+ tcc_path = File.join(File.expand_path("../data/tcc", __dir__), "tcc.exe")
41
+ @logger.info("TCC Path: #{tcc_path}")
42
+
43
+ command = "#{tcc_path} -o #{exe_path} #{stub_output} -lkernel32"
44
+ @logger.info("Running command: #{command}")
45
+ `#{command}`
46
+ end
47
+
48
+ File.delete(stub_output)
49
+ @logger.info("Stub file deleted successfully")
50
+
51
+ puts("\nExe file has been generated!")
52
+ @logger.info("Exe file generated successfully at: #{exe_path}")
53
+ rescue Exception => err
54
+ @logger.error("Error occurred: #{err.message}")
55
+ print("Error: ".red); puts(err.message)
56
+ end
57
+ end
58
+ end
59
+
60
+ class String
61
+ def red
62
+ "\e[31m#{self}\e[0m"
63
+ end
64
+
65
+ def yellow
66
+ "\e[33m#{self}\e[0m"
67
+ end
68
+ end
@@ -1,36 +1,77 @@
1
1
  require 'optparse'
2
2
 
3
3
  class Launcher
4
-
5
4
  require_relative 'displayer'
6
5
  require_relative 'parameter_parser'
7
6
  require_relative 'ruby_copy'
7
+ require_relative 'logger_helper'
8
+ require_relative 'exe_packer'
8
9
  require_relative 'launcher_handler'
9
- # require_relative 'logger_helper'
10
+ # require_relative 'config_generator'
10
11
 
11
12
  def initialize
12
13
  @parser = ParameterParser.new
13
14
  @parser.parse
14
-
15
15
  @params = @parser.params
16
+
16
17
  @displayer = Displayer.new(@params)
17
18
  @ruby_copy = RubyCopy.new(@params)
19
+ @logger = LoggerHelper.instance
20
+ @exe_packer = ExePacker.new(@params)
18
21
  @launcher_handler = LauncherHandler.new(@params)
19
22
  end
20
23
 
21
- def run
22
- Signal.trap("INT") do
23
- puts "\nProgram interrupted. Shutting down..."
24
- exit(0)
24
+ def platform_analysis
25
+ case RUBY_PLATFORM
26
+ when /win32|mingw|cygwin/
27
+ @params[:platform] = 'Windows'
28
+ @logger.info("Working on windows platform.")
29
+ else
30
+ print("Error: ".red); puts("This platform is not supported! Exiting...")
31
+ @logger.error("This platform is not supported! Exiting...")
32
+ exit!
25
33
  end
34
+ end
35
+
36
+ def run
37
+ begin
38
+ Signal.trap("INT") do
39
+ @logger.info("The program was closed because an interrupt command was detected.")
40
+ puts "\nProgram interrupted. Shutting down..."
41
+ exit(0)
42
+ end
26
43
 
27
- @displayer.banner
28
- @displayer.display_params
44
+ platform_analysis
29
45
 
30
- @launcher_handler.handle
31
- @ruby_copy.robocopy_interpreter
46
+ @logger.info("the executor function is started.")
47
+ @displayer.banner
48
+ @logger.info("Banner display was made.")
49
+ @displayer.display_params
50
+ @logger.info("The parameters entered by the user are reflected on the screen.")
51
+ @ruby_copy.robocopy_interpreter
52
+ @logger.info("Ruby interpreter copy function completed.")
53
+ @launcher_handler.handle
54
+ @logger.info("Launcher handler finished.")
55
+ @exe_packer.pack
56
+ @logger.info("Exe pack finished.")
57
+
58
+ puts "\nThanks for using Standalone-Ruby!"
59
+
60
+ print("\nWARNING: ".yellow); puts("Instead of changing the path of the created exe file, create a shortcut. The same applies here as in every application.")
61
+ @logger.info("Program finished.")
62
+ rescue Exception => e
63
+ @logger.error("Launcher Error: #{e.message}")
64
+ print("Launcher Error: "); puts("#{e.message}".red)
65
+ end
66
+ end
67
+ end
68
+
69
+ class String
70
+ def red
71
+ "\e[31m#{self}\e[0m"
72
+ end
32
73
 
33
- puts "Program Output Path: #{@params[:project_path]}"
34
- puts "Thanks for using Standalone-Ruby!"
74
+ def yellow
75
+ "\e[33m#{self}\e[0m"
35
76
  end
36
- end
77
+ end
@@ -1,14 +1,19 @@
1
1
  require 'fileutils'
2
2
 
3
+ require_relative 'logger_helper'
4
+
3
5
  class LauncherHandler
4
6
  def initialize(params)
5
7
  @params = params
8
+ @logger = LoggerHelper.instance
6
9
  end
7
10
 
8
11
  def handle
9
12
  begin
10
13
  puts("\nThe template creation process has been started.")
11
14
 
15
+ # FileUtils.mkdir(File.join(@params[:project_path], "sRb_files"))
16
+
12
17
  if @params[:template]
13
18
  if @params[:gui] == true
14
19
  ruby_file = "rubyw.exe"
@@ -18,15 +23,20 @@ class LauncherHandler
18
23
 
19
24
  user_template = @params[:template].to_s
20
25
  content = File.read(user_template)
26
+ @logger.info("The content of the user template has been read.")
21
27
 
22
28
  content.gsub!("STANDALONE_RUBY_PATH", "#{File.join(File.basename(@params[:ruby_path].to_s), "bin", "#{ruby_file}")}")
29
+ @logger.info("Placed the defined Ruby interpreter path in the template.")
30
+
23
31
  content.gsub!("STANDALONE_MAIN_FILE", "#{File.basename(@params[:main_file].to_s)}")
32
+ @logger.info("The main project file path defined in the template is placed.")
24
33
 
25
34
  new_launcher_path = File.join(@params[:project_path].to_s, @params[:launcher_name].to_s)
26
-
27
35
  File.open(new_launcher_path, "w") do |f_man|
28
36
  f_man.puts content
29
37
  end
38
+
39
+ @logger.info("New launcher file directory created as #{new_launcher_path.to_s}")
30
40
  else
31
41
  if @params[:launcher_type] == "vbs"
32
42
  if @params[:gui] == true
@@ -41,17 +51,23 @@ class LauncherHandler
41
51
 
42
52
  if File.exist?(vbs_template)
43
53
  content = File.read(vbs_template)
54
+ @logger.info("The content of the template has been read.")
44
55
 
45
56
  content.gsub!("STANDALONE_RUBY_PATH", "#{File.join(File.basename(@params[:ruby_path].to_s), "bin", "#{ruby_file}")}")
57
+ @logger.info("Placed the defined Ruby interpreter path in the template.")
58
+
46
59
  content.gsub!("STANDALONE_MAIN_FILE", "#{File.basename(@params[:main_file].to_s)}")
60
+ @logger.info("The main project file path defined in the template is placed.")
47
61
 
48
62
  new_launcher_path = File.join(@params[:project_path].to_s, @params[:launcher_name].to_s)
49
-
50
63
  File.open(new_launcher_path, "w") do |f_man|
51
64
  f_man.puts content
52
65
  end
66
+
67
+ @logger.info("New launcher file directory created as #{new_launcher_path.to_s}")
53
68
  else
54
- print("Handler Error: ".red); puts("Template file not found!")
69
+ print("Handler Error: ".red); puts("The template file could not be found.")
70
+ @logger.error("Template file not found!")
55
71
  exit!
56
72
  end
57
73
  else
@@ -66,23 +82,30 @@ class LauncherHandler
66
82
 
67
83
  if File.exist?(bat_template)
68
84
  content = File.read(bat_template)
85
+ @logger.info("The content of the template has been read.")
69
86
 
70
87
  content.gsub!("STANDALONE_RUBY_PATH", "#{File.join(File.basename(@params[:ruby_path].to_s), "bin", "#{ruby_file}")}")
88
+ @logger.info("Placed the defined Ruby interpreter path in the template.")
89
+
71
90
  content.gsub!("STANDALONE_MAIN_FILE", "#{File.basename(@params[:main_file].to_s)}")
91
+ @logger.info("The main project file path defined in the template is placed.")
72
92
 
73
93
  new_launcher_path = File.join(@params[:project_path].to_s, @params[:launcher_name].to_s)
74
-
75
94
  File.open(new_launcher_path, "w") do |f_man|
76
95
  f_man.puts content
77
96
  end
97
+
98
+ @logger.info("New launcher file directory created as #{new_launcher_path.to_s}")
78
99
  else
79
100
  print("Handler Error: ".red); puts("The template file could not be found.")
101
+ @logger.error("Handler Error: Template file not found!")
80
102
  exit!
81
103
  end
82
104
  end
83
105
  end
84
106
  rescue Exception => e
85
107
  print("Handler Error: ".red); puts("#{e.message}")
108
+ @logger.error("Handler Error: #{e.message}")
86
109
  end
87
110
  end
88
111
  end
@@ -1,22 +1,24 @@
1
- require 'logger'
2
- require 'time'
3
- require 'fileutils'
4
-
5
- class LoggerHelper
6
- def self.instance
7
- log_directory = 'program_logs'
8
- FileUtils.mkdir_p(log_directory) unless Dir.exist?(log_directory)
9
-
10
- timestamp = Time.now.strftime("%Y-%m-%d_%H-%M-%S")
11
- log_file = "#{log_directory}/application_#{timestamp}.log"
12
-
13
- @logger ||= Logger.new(log_file)
14
- @logger.level = Logger::INFO
15
-
16
- @logger.formatter = proc do |severity, datetime, msg|
17
- "#{datetime.strftime('%Y-%m-%d %H:%M:%S')} [#{severity}] #{msg}\n"
18
- end
19
-
20
- return @logger
21
- end
22
- end
1
+ require 'logger'
2
+ require 'time'
3
+ require 'fileutils'
4
+
5
+ class LoggerHelper
6
+ def self.instance
7
+ documents_path = File.join(ENV['USERPROFILE'], 'Documents', 'standalone-ruby-logs')
8
+
9
+ FileUtils.mkdir_p(documents_path) unless Dir.exist?(documents_path)
10
+
11
+ timestamp = Time.now.strftime("%Y-%m-%d_%H-%M-%S")
12
+ log_file = File.join(documents_path, "standalone-ruby_#{timestamp}.log")
13
+
14
+ logger = Logger.new(log_file)
15
+ logger.level = Logger::INFO
16
+
17
+ logger.formatter = proc do |severity, datetime, progname, msg|
18
+ msg = "(empty message)" if msg.nil? || msg.strip.empty?
19
+ "#{datetime.strftime('%Y-%m-%d %H:%M:%S')} [#{severity}] #{msg}\n"
20
+ end
21
+
22
+ return logger
23
+ end
24
+ end