podoy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +35 -0
  4. data/Rakefile +4 -0
  5. data/lib/podoy/version.rb +5 -0
  6. data/lib/podoy.rb +8 -0
  7. data/sig/podoy.rbs +4 -0
  8. data/vendor/bundle/ruby/3.3.0+0/bin/rake +29 -0
  9. data/vendor/bundle/ruby/3.3.0+0/cache/rake-13.1.0.gem +0 -0
  10. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/History.rdoc +2403 -0
  11. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/MIT-LICENSE +21 -0
  12. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/README.rdoc +155 -0
  13. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/command_line_usage.rdoc +158 -0
  14. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/example/Rakefile1 +38 -0
  15. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/example/Rakefile2 +35 -0
  16. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/example/a.c +6 -0
  17. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/example/b.c +6 -0
  18. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/example/main.c +11 -0
  19. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/glossary.rdoc +42 -0
  20. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/jamis.rb +592 -0
  21. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/proto_rake.rdoc +127 -0
  22. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/rake.1 +156 -0
  23. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/rakefile.rdoc +622 -0
  24. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/doc/rational.rdoc +151 -0
  25. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/exe/rake +27 -0
  26. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/application.rb +855 -0
  27. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/backtrace.rb +24 -0
  28. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/clean.rb +78 -0
  29. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/cloneable.rb +17 -0
  30. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/cpu_counter.rb +107 -0
  31. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/default_loader.rb +15 -0
  32. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/dsl_definition.rb +195 -0
  33. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/early_time.rb +22 -0
  34. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/ext/core.rb +26 -0
  35. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/ext/string.rb +176 -0
  36. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/file_creation_task.rb +25 -0
  37. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/file_list.rb +435 -0
  38. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/file_task.rb +58 -0
  39. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/file_utils.rb +132 -0
  40. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/file_utils_ext.rb +134 -0
  41. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/invocation_chain.rb +57 -0
  42. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/invocation_exception_mixin.rb +17 -0
  43. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/late_time.rb +18 -0
  44. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/linked_list.rb +112 -0
  45. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/loaders/makefile.rb +54 -0
  46. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/multi_task.rb +14 -0
  47. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/name_space.rb +38 -0
  48. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/packagetask.rb +222 -0
  49. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/phony.rb +16 -0
  50. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/private_reader.rb +21 -0
  51. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/promise.rb +100 -0
  52. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/pseudo_status.rb +30 -0
  53. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/rake_module.rb +67 -0
  54. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/rake_test_loader.rb +27 -0
  55. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/rule_recursion_overflow_error.rb +20 -0
  56. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/scope.rb +43 -0
  57. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/task.rb +434 -0
  58. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/task_argument_error.rb +8 -0
  59. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/task_arguments.rb +109 -0
  60. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/task_manager.rb +331 -0
  61. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/tasklib.rb +12 -0
  62. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/testtask.rb +189 -0
  63. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/thread_history_display.rb +49 -0
  64. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/thread_pool.rb +163 -0
  65. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/trace_output.rb +23 -0
  66. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/version.rb +10 -0
  67. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake/win32.rb +51 -0
  68. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/lib/rake.rb +71 -0
  69. data/vendor/bundle/ruby/3.3.0+0/gems/rake-13.1.0/rake.gemspec +101 -0
  70. data/vendor/bundle/ruby/3.3.0+0/specifications/rake-13.1.0.gemspec +26 -0
  71. metadata +117 -0
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module Rake
3
+ module Backtrace # :nodoc: all
4
+ SYS_KEYS = RbConfig::CONFIG.keys.grep(/(?:[a-z]prefix|libdir)\z/)
5
+ SYS_PATHS = RbConfig::CONFIG.values_at(*SYS_KEYS).uniq +
6
+ [ File.join(File.dirname(__FILE__), "..") ]
7
+
8
+ SUPPRESSED_PATHS = SYS_PATHS.
9
+ map { |s| s.tr("\\", "/") }.
10
+ map { |f| File.expand_path(f) }.
11
+ reject { |s| s.nil? || s =~ /^ *$/ }
12
+ SUPPRESSED_PATHS_RE = SUPPRESSED_PATHS.map { |f| Regexp.quote(f) }.join("|")
13
+ SUPPRESSED_PATHS_RE << "|^org\\/jruby\\/\\w+\\.java" if
14
+ Object.const_defined?(:RUBY_ENGINE) and RUBY_ENGINE == "jruby"
15
+
16
+ SUPPRESS_PATTERN = %r!(\A(#{SUPPRESSED_PATHS_RE})|bin/rake:\d+)!i
17
+
18
+ def self.collapse(backtrace)
19
+ pattern = Rake.application.options.suppress_backtrace_pattern ||
20
+ SUPPRESS_PATTERN
21
+ backtrace.reject { |elem| elem =~ pattern }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+ # The 'rake/clean' file defines two file lists (CLEAN and CLOBBER) and
3
+ # two rake tasks (:clean and :clobber).
4
+ #
5
+ # [:clean] Clean up the project by deleting scratch files and backup
6
+ # files. Add files to the CLEAN file list to have the :clean
7
+ # target handle them.
8
+ #
9
+ # [:clobber] Clobber all generated and non-source files in a project.
10
+ # The task depends on :clean, so all the clean files will
11
+ # be deleted as well as files in the CLOBBER file list.
12
+ # The intent of this task is to return a project to its
13
+ # pristine, just unpacked state.
14
+
15
+ require "rake"
16
+
17
+ # :stopdoc:
18
+
19
+ module Rake
20
+ module Cleaner
21
+ extend FileUtils
22
+
23
+ module_function
24
+
25
+ def cleanup_files(file_names)
26
+ file_names.each do |file_name|
27
+ cleanup(file_name)
28
+ end
29
+ end
30
+
31
+ def cleanup(file_name, **opts)
32
+ begin
33
+ opts = { verbose: Rake.application.options.trace }.merge(opts)
34
+ rm_r file_name, **opts
35
+ rescue StandardError => ex
36
+ puts "Failed to remove #{file_name}: #{ex}" unless file_already_gone?(file_name)
37
+ end
38
+ end
39
+
40
+ def file_already_gone?(file_name)
41
+ return false if File.exist?(file_name)
42
+
43
+ path = file_name
44
+ prev = nil
45
+
46
+ while path = File.dirname(path)
47
+ return false if cant_be_deleted?(path)
48
+ break if [prev, "."].include?(path)
49
+ prev = path
50
+ end
51
+ true
52
+ end
53
+ private_class_method :file_already_gone?
54
+
55
+ def cant_be_deleted?(path_name)
56
+ File.exist?(path_name) &&
57
+ (!File.readable?(path_name) || !File.executable?(path_name))
58
+ end
59
+ private_class_method :cant_be_deleted?
60
+ end
61
+ end
62
+
63
+ CLEAN = ::Rake::FileList["**/*~", "**/*.bak", "**/core"]
64
+ CLEAN.clear_exclude.exclude { |fn|
65
+ fn.pathmap("%f").downcase == "core" && File.directory?(fn)
66
+ }
67
+
68
+ desc "Remove any temporary products."
69
+ task :clean do
70
+ Rake::Cleaner.cleanup_files(CLEAN)
71
+ end
72
+
73
+ CLOBBER = ::Rake::FileList.new
74
+
75
+ desc "Remove any generated files."
76
+ task clobber: [:clean] do
77
+ Rake::Cleaner.cleanup_files(CLOBBER)
78
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ module Rake
3
+ ##
4
+ # Mixin for creating easily cloned objects.
5
+
6
+ module Cloneable # :nodoc:
7
+ # The hook that is invoked by 'clone' and 'dup' methods.
8
+ def initialize_copy(source)
9
+ super
10
+ source.instance_variables.each do |var|
11
+ src_value = source.instance_variable_get(var)
12
+ value = src_value.clone rescue src_value
13
+ instance_variable_set(var, value)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+ module Rake
3
+
4
+ # Based on a script at:
5
+ # http://stackoverflow.com/questions/891537/ruby-detect-number-of-cpus-installed
6
+ class CpuCounter # :nodoc: all
7
+ def self.count
8
+ new.count_with_default
9
+ end
10
+
11
+ def count_with_default(default=4)
12
+ count || default
13
+ rescue StandardError
14
+ default
15
+ end
16
+
17
+ begin
18
+ require "etc"
19
+ rescue LoadError
20
+ else
21
+ if Etc.respond_to?(:nprocessors)
22
+ def count
23
+ return Etc.nprocessors
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ unless Rake::CpuCounter.method_defined?(:count)
31
+ Rake::CpuCounter.class_eval <<-'end;', __FILE__, __LINE__+1
32
+ require 'rbconfig'
33
+
34
+ def count
35
+ if RUBY_PLATFORM == 'java'
36
+ count_via_java_runtime
37
+ else
38
+ case RbConfig::CONFIG['host_os']
39
+ when /linux/
40
+ count_via_cpuinfo
41
+ when /darwin|bsd/
42
+ count_via_sysctl
43
+ when /mswin|mingw/
44
+ count_via_win32
45
+ else
46
+ # Try everything
47
+ count_via_win32 ||
48
+ count_via_sysctl ||
49
+ count_via_cpuinfo
50
+ end
51
+ end
52
+ end
53
+
54
+ def count_via_java_runtime
55
+ Java::Java.lang.Runtime.getRuntime.availableProcessors
56
+ rescue StandardError
57
+ nil
58
+ end
59
+
60
+ def count_via_win32
61
+ require 'win32ole'
62
+ wmi = WIN32OLE.connect("winmgmts://")
63
+ cpu = wmi.ExecQuery("select NumberOfCores from Win32_Processor") # TODO count hyper-threaded in this
64
+ cpu.to_enum.first.NumberOfCores
65
+ rescue StandardError, LoadError
66
+ nil
67
+ end
68
+
69
+ def count_via_cpuinfo
70
+ open('/proc/cpuinfo') { |f| f.readlines }.grep(/processor/).size
71
+ rescue StandardError
72
+ nil
73
+ end
74
+
75
+ def count_via_sysctl
76
+ run 'sysctl', '-n', 'hw.ncpu'
77
+ end
78
+
79
+ def run(command, *args)
80
+ cmd = resolve_command(command)
81
+ if cmd
82
+ IO.popen [cmd, *args] do |io|
83
+ io.read.to_i
84
+ end
85
+ else
86
+ nil
87
+ end
88
+ end
89
+
90
+ def resolve_command(command)
91
+ look_for_command("/usr/sbin", command) ||
92
+ look_for_command("/sbin", command) ||
93
+ in_path_command(command)
94
+ end
95
+
96
+ def look_for_command(dir, command)
97
+ path = File.join(dir, command)
98
+ File.exist?(path) ? path : nil
99
+ end
100
+
101
+ def in_path_command(command)
102
+ IO.popen ['which', command] do |io|
103
+ io.eof? ? nil : command
104
+ end
105
+ end
106
+ end;
107
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ module Rake
3
+
4
+ # Default Rakefile loader used by +import+.
5
+ class DefaultLoader
6
+
7
+ ##
8
+ # Loads a rakefile into the current application from +fn+
9
+
10
+ def load(fn)
11
+ Rake.load_rakefile(File.expand_path(fn))
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,195 @@
1
+ # frozen_string_literal: true
2
+ # Rake DSL functions.
3
+ require "rake/file_utils_ext"
4
+
5
+ module Rake
6
+
7
+ ##
8
+ # DSL is a module that provides #task, #desc, #namespace, etc. Use this
9
+ # when you'd like to use rake outside the top level scope.
10
+ #
11
+ # For a Rakefile you run from the command line this module is automatically
12
+ # included.
13
+
14
+ module DSL
15
+
16
+ #--
17
+ # Include the FileUtils file manipulation functions in the top
18
+ # level module, but mark them private so that they don't
19
+ # unintentionally define methods on other objects.
20
+ #++
21
+
22
+ include FileUtilsExt
23
+ private(*FileUtils.instance_methods(false))
24
+ private(*FileUtilsExt.instance_methods(false))
25
+
26
+ private
27
+
28
+ # :call-seq:
29
+ # task(task_name)
30
+ # task(task_name: dependencies)
31
+ # task(task_name, arguments => dependencies)
32
+ #
33
+ # Declare a basic task. The +task_name+ is always the first argument. If
34
+ # the task name contains a ":" it is defined in that namespace.
35
+ #
36
+ # The +dependencies+ may be a single task name or an Array of task names.
37
+ # The +argument+ (a single name) or +arguments+ (an Array of names) define
38
+ # the arguments provided to the task.
39
+ #
40
+ # The task, argument and dependency names may be either symbols or
41
+ # strings.
42
+ #
43
+ # A task with a single dependency:
44
+ #
45
+ # task clobber: %w[clean] do
46
+ # rm_rf "html"
47
+ # end
48
+ #
49
+ # A task with an argument and a dependency:
50
+ #
51
+ # task :package, [:version] => :test do |t, args|
52
+ # # ...
53
+ # end
54
+ #
55
+ # To invoke this task from the command line:
56
+ #
57
+ # $ rake package[1.2.3]
58
+ #
59
+ def task(*args, &block) # :doc:
60
+ Rake::Task.define_task(*args, &block)
61
+ end
62
+
63
+ # Declare a file task.
64
+ #
65
+ # Example:
66
+ # file "config.cfg" => ["config.template"] do
67
+ # open("config.cfg", "w") do |outfile|
68
+ # open("config.template") do |infile|
69
+ # while line = infile.gets
70
+ # outfile.puts line
71
+ # end
72
+ # end
73
+ # end
74
+ # end
75
+ #
76
+ def file(*args, &block) # :doc:
77
+ Rake::FileTask.define_task(*args, &block)
78
+ end
79
+
80
+ # Declare a file creation task.
81
+ # (Mainly used for the directory command).
82
+ def file_create(*args, &block)
83
+ Rake::FileCreationTask.define_task(*args, &block)
84
+ end
85
+
86
+ # Declare a set of files tasks to create the given directories on
87
+ # demand.
88
+ #
89
+ # Example:
90
+ # directory "testdata/doc"
91
+ #
92
+ def directory(*args, &block) # :doc:
93
+ result = file_create(*args, &block)
94
+ dir, _ = *Rake.application.resolve_args(args)
95
+ dir = Rake.from_pathname(dir)
96
+ Rake.each_dir_parent(dir) do |d|
97
+ file_create d do |t|
98
+ mkdir_p t.name unless File.exist?(t.name)
99
+ end
100
+ end
101
+ result
102
+ end
103
+
104
+ # Declare a task that performs its prerequisites in
105
+ # parallel. Multitasks does *not* guarantee that its prerequisites
106
+ # will execute in any given order (which is obvious when you think
107
+ # about it)
108
+ #
109
+ # Example:
110
+ # multitask deploy: %w[deploy_gem deploy_rdoc]
111
+ #
112
+ def multitask(*args, &block) # :doc:
113
+ Rake::MultiTask.define_task(*args, &block)
114
+ end
115
+
116
+ # Create a new rake namespace and use it for evaluating the given
117
+ # block. Returns a NameSpace object that can be used to lookup
118
+ # tasks defined in the namespace.
119
+ #
120
+ # Example:
121
+ #
122
+ # ns = namespace "nested" do
123
+ # # the "nested:run" task
124
+ # task :run
125
+ # end
126
+ # task_run = ns[:run] # find :run in the given namespace.
127
+ #
128
+ # Tasks can also be defined in a namespace by using a ":" in the task
129
+ # name:
130
+ #
131
+ # task "nested:test" do
132
+ # # ...
133
+ # end
134
+ #
135
+ def namespace(name=nil, &block) # :doc:
136
+ name = name.to_s if name.kind_of?(Symbol)
137
+ name = name.to_str if name.respond_to?(:to_str)
138
+ unless name.kind_of?(String) || name.nil?
139
+ raise ArgumentError, "Expected a String or Symbol for a namespace name"
140
+ end
141
+ Rake.application.in_namespace(name, &block)
142
+ end
143
+
144
+ # Declare a rule for auto-tasks.
145
+ #
146
+ # Example:
147
+ # rule '.o' => '.c' do |t|
148
+ # sh 'cc', '-o', t.name, t.source
149
+ # end
150
+ #
151
+ def rule(*args, &block) # :doc:
152
+ Rake::Task.create_rule(*args, &block)
153
+ end
154
+
155
+ # Describes the next rake task. Duplicate descriptions are discarded.
156
+ # Descriptions are shown with <code>rake -T</code> (up to the first
157
+ # sentence) and <code>rake -D</code> (the entire description).
158
+ #
159
+ # Example:
160
+ # desc "Run the Unit Tests"
161
+ # task test: [:build] do
162
+ # # ... run tests
163
+ # end
164
+ #
165
+ def desc(description) # :doc:
166
+ Rake.application.last_description = description
167
+ end
168
+
169
+ # Import the partial Rakefiles +fn+. Imported files are loaded
170
+ # _after_ the current file is completely loaded. This allows the
171
+ # import statement to appear anywhere in the importing file, and yet
172
+ # allowing the imported files to depend on objects defined in the
173
+ # importing file.
174
+ #
175
+ # A common use of the import statement is to include files
176
+ # containing dependency declarations.
177
+ #
178
+ # See also the --rakelibdir command line option.
179
+ #
180
+ # Example:
181
+ # import ".depend", "my_rules"
182
+ #
183
+ def import(*fns) # :doc:
184
+ fns.each do |fn|
185
+ Rake.application.add_import(fn)
186
+ end
187
+ end
188
+ end
189
+ extend FileUtilsExt
190
+ end
191
+
192
+ # Extend the main object with the DSL commands. This allows top-level
193
+ # calls to task, etc. to work from a Rakefile without polluting the
194
+ # object inheritance tree.
195
+ self.extend Rake::DSL
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ module Rake
3
+
4
+ # EarlyTime is a fake timestamp that occurs _before_ any other time value.
5
+ class EarlyTime
6
+ include Comparable
7
+ include Singleton
8
+
9
+ ##
10
+ # The EarlyTime always comes before +other+!
11
+
12
+ def <=>(other)
13
+ -1
14
+ end
15
+
16
+ def to_s # :nodoc:
17
+ "<EARLY TIME>"
18
+ end
19
+ end
20
+
21
+ EARLY = EarlyTime.instance
22
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+ class Module
3
+ # Check for an existing method in the current class before extending. If
4
+ # the method already exists, then a warning is printed and the extension is
5
+ # not added. Otherwise the block is yielded and any definitions in the
6
+ # block will take effect.
7
+ #
8
+ # Usage:
9
+ #
10
+ # class String
11
+ # rake_extension("xyz") do
12
+ # def xyz
13
+ # ...
14
+ # end
15
+ # end
16
+ # end
17
+ #
18
+ def rake_extension(method) # :nodoc:
19
+ if method_defined?(method)
20
+ $stderr.puts "WARNING: Possible conflict with Rake extension: " +
21
+ "#{self}##{method} already exists"
22
+ else
23
+ yield
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,176 @@
1
+ # frozen_string_literal: true
2
+ require "rake/ext/core"
3
+
4
+ class String
5
+
6
+ rake_extension("ext") do
7
+ # Replace the file extension with +newext+. If there is no extension on
8
+ # the string, append the new extension to the end. If the new extension
9
+ # is not given, or is the empty string, remove any existing extension.
10
+ #
11
+ # +ext+ is a user added method for the String class.
12
+ #
13
+ # This String extension comes from Rake
14
+ def ext(newext="")
15
+ return self.dup if [".", ".."].include? self
16
+ if newext != ""
17
+ newext = "." + newext unless newext =~ /^\./
18
+ end
19
+ self.chomp(File.extname(self)) << newext
20
+ end
21
+ end
22
+
23
+ rake_extension("pathmap") do
24
+ # Explode a path into individual components. Used by +pathmap+.
25
+ #
26
+ # This String extension comes from Rake
27
+ def pathmap_explode
28
+ head, tail = File.split(self)
29
+ return [self] if head == self
30
+ return [tail] if head == "." || tail == "/"
31
+ return [head, tail] if head == "/"
32
+ return head.pathmap_explode + [tail]
33
+ end
34
+ protected :pathmap_explode
35
+
36
+ # Extract a partial path from the path. Include +n+ directories from the
37
+ # front end (left hand side) if +n+ is positive. Include |+n+|
38
+ # directories from the back end (right hand side) if +n+ is negative.
39
+ #
40
+ # This String extension comes from Rake
41
+ def pathmap_partial(n)
42
+ dirs = File.dirname(self).pathmap_explode
43
+ partial_dirs =
44
+ if n > 0
45
+ dirs[0...n]
46
+ elsif n < 0
47
+ dirs.reverse[0...-n].reverse
48
+ else
49
+ "."
50
+ end
51
+ File.join(partial_dirs)
52
+ end
53
+ protected :pathmap_partial
54
+
55
+ # Perform the pathmap replacement operations on the given path. The
56
+ # patterns take the form 'pat1,rep1;pat2,rep2...'.
57
+ #
58
+ # This String extension comes from Rake
59
+ def pathmap_replace(patterns, &block)
60
+ result = self
61
+ patterns.split(";").each do |pair|
62
+ pattern, replacement = pair.split(",")
63
+ pattern = Regexp.new(pattern)
64
+ if replacement == "*" && block_given?
65
+ result = result.sub(pattern, &block)
66
+ elsif replacement
67
+ result = result.sub(pattern, replacement)
68
+ else
69
+ result = result.sub(pattern, "")
70
+ end
71
+ end
72
+ result
73
+ end
74
+ protected :pathmap_replace
75
+
76
+ # Map the path according to the given specification. The specification
77
+ # controls the details of the mapping. The following special patterns are
78
+ # recognized:
79
+ #
80
+ # <tt>%p</tt> :: The complete path.
81
+ # <tt>%f</tt> :: The base file name of the path, with its file extension,
82
+ # but without any directories.
83
+ # <tt>%n</tt> :: The file name of the path without its file extension.
84
+ # <tt>%d</tt> :: The directory list of the path.
85
+ # <tt>%x</tt> :: The file extension of the path. An empty string if there
86
+ # is no extension.
87
+ # <tt>%X</tt> :: Everything *but* the file extension.
88
+ # <tt>%s</tt> :: The alternate file separator if defined, otherwise use #
89
+ # the standard file separator.
90
+ # <tt>%%</tt> :: A percent sign.
91
+ #
92
+ # The <tt>%d</tt> specifier can also have a numeric prefix (e.g. '%2d').
93
+ # If the number is positive, only return (up to) +n+ directories in the
94
+ # path, starting from the left hand side. If +n+ is negative, return (up
95
+ # to) +n+ directories from the right hand side of the path.
96
+ #
97
+ # Examples:
98
+ #
99
+ # 'a/b/c/d/file.txt'.pathmap("%2d") => 'a/b'
100
+ # 'a/b/c/d/file.txt'.pathmap("%-2d") => 'c/d'
101
+ #
102
+ # Also the <tt>%d</tt>, <tt>%p</tt>, <tt>%f</tt>, <tt>%n</tt>,
103
+ # <tt>%x</tt>, and <tt>%X</tt> operators can take a pattern/replacement
104
+ # argument to perform simple string substitutions on a particular part of
105
+ # the path. The pattern and replacement are separated by a comma and are
106
+ # enclosed by curly braces. The replacement spec comes after the %
107
+ # character but before the operator letter. (e.g. "%{old,new}d").
108
+ # Multiple replacement specs should be separated by semi-colons (e.g.
109
+ # "%{old,new;src,bin}d").
110
+ #
111
+ # Regular expressions may be used for the pattern, and back refs may be
112
+ # used in the replacement text. Curly braces, commas and semi-colons are
113
+ # excluded from both the pattern and replacement text (let's keep parsing
114
+ # reasonable).
115
+ #
116
+ # For example:
117
+ #
118
+ # "src/org/onestepback/proj/A.java".pathmap("%{^src,class}X.class")
119
+ #
120
+ # returns:
121
+ #
122
+ # "class/org/onestepback/proj/A.class"
123
+ #
124
+ # If the replacement text is '*', then a block may be provided to perform
125
+ # some arbitrary calculation for the replacement.
126
+ #
127
+ # For example:
128
+ #
129
+ # "/path/to/file.TXT".pathmap("%X%{.*,*}x") { |ext|
130
+ # ext.downcase
131
+ # }
132
+ #
133
+ # Returns:
134
+ #
135
+ # "/path/to/file.txt"
136
+ #
137
+ # This String extension comes from Rake
138
+ def pathmap(spec=nil, &block)
139
+ return self if spec.nil?
140
+ result = "".dup
141
+ spec.scan(/%\{[^}]*\}-?\d*[sdpfnxX%]|%-?\d+d|%.|[^%]+/) do |frag|
142
+ case frag
143
+ when "%f"
144
+ result << File.basename(self)
145
+ when "%n"
146
+ result << File.basename(self).ext
147
+ when "%d"
148
+ result << File.dirname(self)
149
+ when "%x"
150
+ result << File.extname(self)
151
+ when "%X"
152
+ result << self.ext
153
+ when "%p"
154
+ result << self
155
+ when "%s"
156
+ result << (File::ALT_SEPARATOR || File::SEPARATOR)
157
+ when "%-"
158
+ # do nothing
159
+ when "%%"
160
+ result << "%"
161
+ when /%(-?\d+)d/
162
+ result << pathmap_partial($1.to_i)
163
+ when /^%\{([^}]*)\}(\d*[dpfnxX])/
164
+ patterns, operator = $1, $2
165
+ result << pathmap("%" + operator).pathmap_replace(patterns, &block)
166
+ when /^%/
167
+ fail ArgumentError, "Unknown pathmap specifier #{frag} in '#{spec}'"
168
+ else
169
+ result << frag
170
+ end
171
+ end
172
+ result
173
+ end
174
+ end
175
+
176
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ require "rake/file_task"
3
+ require "rake/early_time"
4
+
5
+ module Rake
6
+
7
+ # A FileCreationTask is a file task that when used as a dependency will be
8
+ # needed if and only if the file has not been created. Once created, it is
9
+ # not re-triggered if any of its dependencies are newer, nor does trigger
10
+ # any rebuilds of tasks that depend on it whenever it is updated.
11
+ #
12
+ class FileCreationTask < FileTask
13
+ # Is this file task needed? Yes if it doesn't exist.
14
+ def needed?
15
+ !File.exist?(name)
16
+ end
17
+
18
+ # Time stamp for file creation task. This time stamp is earlier
19
+ # than any other time stamp.
20
+ def timestamp
21
+ Rake::EARLY
22
+ end
23
+ end
24
+
25
+ end