rubycut-babushka 0.10.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.
- data/Gemfile +8 -0
- data/Gemfile.lock +31 -0
- data/README.markdown +246 -0
- data/Rakefile +26 -0
- data/bin/babushka +11 -0
- data/deps/babushka.rb +101 -0
- data/deps/dev.rb +12 -0
- data/deps/fhs.rb +31 -0
- data/deps/git.rb +29 -0
- data/deps/homebrew.rb +30 -0
- data/deps/os_x.rb +33 -0
- data/deps/packages.rb +22 -0
- data/deps/pkg_managers.rb +110 -0
- data/deps/ruby.rb +23 -0
- data/deps/rubygems.rb +24 -0
- data/deps/system.rb +10 -0
- data/deps/templates/app.rb +68 -0
- data/deps/templates/external.rb +12 -0
- data/deps/templates/installer.rb +31 -0
- data/deps/templates/managed.rb +105 -0
- data/deps/templates/ppa.rb +24 -0
- data/deps/templates/src.rb +42 -0
- data/deps/templates/tmbundle.rb +15 -0
- data/lib/babushka.rb +28 -0
- data/lib/babushka/accepts_block_for.rb +72 -0
- data/lib/babushka/accepts_list_for.rb +49 -0
- data/lib/babushka/accepts_value_for.rb +24 -0
- data/lib/babushka/base.rb +78 -0
- data/lib/babushka/bug_reporter.rb +55 -0
- data/lib/babushka/cmdline.rb +133 -0
- data/lib/babushka/cmdline/handler.rb +41 -0
- data/lib/babushka/cmdline/helpers.rb +127 -0
- data/lib/babushka/cmdline/parser.rb +69 -0
- data/lib/babushka/colorizer.rb +59 -0
- data/lib/babushka/core_patches/array.rb +171 -0
- data/lib/babushka/core_patches/blank.rb +22 -0
- data/lib/babushka/core_patches/bytes.rb +52 -0
- data/lib/babushka/core_patches/hash.rb +107 -0
- data/lib/babushka/core_patches/hashish.rb +14 -0
- data/lib/babushka/core_patches/integer.rb +25 -0
- data/lib/babushka/core_patches/io.rb +8 -0
- data/lib/babushka/core_patches/numeric.rb +16 -0
- data/lib/babushka/core_patches/object.rb +27 -0
- data/lib/babushka/core_patches/string.rb +116 -0
- data/lib/babushka/core_patches/symbol.rb +12 -0
- data/lib/babushka/core_patches/try.rb +15 -0
- data/lib/babushka/core_patches/uri.rb +24 -0
- data/lib/babushka/dep.rb +470 -0
- data/lib/babushka/dep_context.rb +18 -0
- data/lib/babushka/dep_definer.rb +115 -0
- data/lib/babushka/dep_pool.rb +49 -0
- data/lib/babushka/dep_runner.rb +85 -0
- data/lib/babushka/dsl.rb +26 -0
- data/lib/babushka/git_repo.rb +185 -0
- data/lib/babushka/helpers/git_helpers.rb +32 -0
- data/lib/babushka/helpers/log_helpers.rb +176 -0
- data/lib/babushka/helpers/path_helpers.rb +34 -0
- data/lib/babushka/helpers/run_helpers.rb +145 -0
- data/lib/babushka/helpers/shell_helpers.rb +229 -0
- data/lib/babushka/helpers/suggest_helpers.rb +16 -0
- data/lib/babushka/helpers/uri_helpers.rb +36 -0
- data/lib/babushka/ip.rb +160 -0
- data/lib/babushka/lambda_chooser.rb +40 -0
- data/lib/babushka/levenshtein.rb +125 -0
- data/lib/babushka/meta_dep.rb +65 -0
- data/lib/babushka/meta_dep_context.rb +15 -0
- data/lib/babushka/parameter.rb +143 -0
- data/lib/babushka/pkg_helper.rb +81 -0
- data/lib/babushka/pkg_helpers/apt_helper.rb +61 -0
- data/lib/babushka/pkg_helpers/base_helper.rb +19 -0
- data/lib/babushka/pkg_helpers/binpkgsrc_helper.rb +48 -0
- data/lib/babushka/pkg_helpers/binports_helper.rb +34 -0
- data/lib/babushka/pkg_helpers/brew_helper.rb +110 -0
- data/lib/babushka/pkg_helpers/gem_helper.rb +120 -0
- data/lib/babushka/pkg_helpers/macports_helper.rb +22 -0
- data/lib/babushka/pkg_helpers/npm_helper.rb +45 -0
- data/lib/babushka/pkg_helpers/pacman_helper.rb +27 -0
- data/lib/babushka/pkg_helpers/pip_helper.rb +45 -0
- data/lib/babushka/pkg_helpers/src_helper.rb +16 -0
- data/lib/babushka/pkg_helpers/yum_helper.rb +25 -0
- data/lib/babushka/popen.rb +40 -0
- data/lib/babushka/prompt.rb +176 -0
- data/lib/babushka/renderable.rb +67 -0
- data/lib/babushka/resource.rb +215 -0
- data/lib/babushka/run_reporter.rb +60 -0
- data/lib/babushka/shell.rb +108 -0
- data/lib/babushka/source.rb +216 -0
- data/lib/babushka/source_pool.rb +146 -0
- data/lib/babushka/system_definitions.rb +97 -0
- data/lib/babushka/system_profile.rb +210 -0
- data/lib/babushka/task.rb +142 -0
- data/lib/babushka/vars.rb +108 -0
- data/lib/babushka/version_of.rb +65 -0
- data/lib/babushka/version_str.rb +57 -0
- data/lib/babushka/xml_string.rb +28 -0
- data/lib/components.rb +82 -0
- data/lib/fancypath/fancypath.rb +200 -0
- data/lib/inkan/inkan.rb +76 -0
- data/spec/acceptance/acceptance.rb +43 -0
- data/spec/acceptance_helper.rb +113 -0
- data/spec/archives/Blah.app.zip +0 -0
- data/spec/archives/archive.tar +0 -0
- data/spec/archives/archive.tar.bz2 +0 -0
- data/spec/archives/archive.tar.gz +0 -0
- data/spec/archives/archive.tbz2 +0 -0
- data/spec/archives/archive.tgz +0 -0
- data/spec/archives/archive.zip +0 -0
- data/spec/archives/content.txt +5 -0
- data/spec/archives/invalid_archive +5 -0
- data/spec/archives/nested archive/content.txt +5 -0
- data/spec/archives/nested_archive.tar +0 -0
- data/spec/archives/really_a_gzip.zip +0 -0
- data/spec/archives/test-0.3.1.tgz +0 -0
- data/spec/archives/tgz_archive +0 -0
- data/spec/archives/zip_without_extension +0 -0
- data/spec/babushka/accepts_for_spec.rb +174 -0
- data/spec/babushka/accepts_for_support.rb +72 -0
- data/spec/babushka/cmdline/console_spec.rb +11 -0
- data/spec/babushka/cmdline/help_spec.rb +61 -0
- data/spec/babushka/cmdline/version_spec.rb +10 -0
- data/spec/babushka/core_patches_spec.rb +171 -0
- data/spec/babushka/dep_context_spec.rb +58 -0
- data/spec/babushka/dep_definer_spec.rb +152 -0
- data/spec/babushka/dep_definer_support.rb +36 -0
- data/spec/babushka/dep_spec.rb +567 -0
- data/spec/babushka/dep_support.rb +29 -0
- data/spec/babushka/deps_spec.rb +113 -0
- data/spec/babushka/gem_helper_spec.rb +90 -0
- data/spec/babushka/git_repo_spec.rb +396 -0
- data/spec/babushka/ip_spec.rb +131 -0
- data/spec/babushka/lambda_chooser_spec.rb +115 -0
- data/spec/babushka/meta_dep_definer_spec.rb +127 -0
- data/spec/babushka/meta_dep_wrapper_spec.rb +32 -0
- data/spec/babushka/parameter_spec.rb +135 -0
- data/spec/babushka/path_helpers_spec.rb +102 -0
- data/spec/babushka/prompt_spec.rb +188 -0
- data/spec/babushka/renderable_spec.rb +100 -0
- data/spec/babushka/resource_spec.rb +141 -0
- data/spec/babushka/run_helpers_spec.rb +26 -0
- data/spec/babushka/shell_helpers_spec.rb +244 -0
- data/spec/babushka/shell_spec.rb +19 -0
- data/spec/babushka/source_pool_spec.rb +320 -0
- data/spec/babushka/source_pool_support.rb +31 -0
- data/spec/babushka/source_spec.rb +382 -0
- data/spec/babushka/source_support.rb +17 -0
- data/spec/babushka/system_profile_spec.rb +61 -0
- data/spec/babushka/task_spec.rb +141 -0
- data/spec/babushka/uri_spec.rb +13 -0
- data/spec/babushka/vars_spec.rb +59 -0
- data/spec/babushka/version_of_spec.rb +110 -0
- data/spec/babushka/version_str_spec.rb +130 -0
- data/spec/babushka/version_str_support.rb +37 -0
- data/spec/babushka/xml_string_spec.rb +98 -0
- data/spec/deps/bad/broken.rb +7 -0
- data/spec/deps/bad/working.rb +3 -0
- data/spec/deps/good/meta.rb +14 -0
- data/spec/deps/good/test.rb +11 -0
- data/spec/deps/outer/deps.rb +19 -0
- data/spec/deps/outer/more deps.rb +11 -0
- data/spec/deps/params/params.rb +10 -0
- data/spec/fancypath/fancypath_spec.rb +272 -0
- data/spec/fancypath_support.rb +10 -0
- data/spec/inkan/inkan_spec.rb +217 -0
- data/spec/renderable/different_example.conf.erb +4 -0
- data/spec/renderable/example.conf.erb +3 -0
- data/spec/renderable/example.sh +6 -0
- data/spec/renderable/with_binding.conf.erb +4 -0
- data/spec/renderable/xml_example.conf.erb +8 -0
- data/spec/repos/remote.git.tgz +0 -0
- data/spec/spec_helper.rb +87 -0
- metadata +238 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module Babushka
|
|
2
|
+
class VersionOf
|
|
3
|
+
module Helpers
|
|
4
|
+
module_function
|
|
5
|
+
|
|
6
|
+
def VersionOf first, *rest
|
|
7
|
+
# Convert the arguments into a VersionOf. If a single string argument is
|
|
8
|
+
# passed, try splitting it on space to separate name and version. Otherwise,
|
|
9
|
+
# pass the arguments as-is, splatting if required.
|
|
10
|
+
if rest.any?
|
|
11
|
+
Babushka::VersionOf.new(*[first].concat(rest))
|
|
12
|
+
elsif first.is_a?(String)
|
|
13
|
+
Babushka::VersionOf.new(*first.split(' ', 2))
|
|
14
|
+
elsif first.is_a?(Array)
|
|
15
|
+
Babushka::VersionOf.new(*first)
|
|
16
|
+
else
|
|
17
|
+
Babushka::VersionOf.new(first)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
attr_accessor :name, :version
|
|
23
|
+
|
|
24
|
+
def initialize name, version = nil
|
|
25
|
+
@name = name.respond_to?(:name) ? name.name : name
|
|
26
|
+
@version = if version.nil?
|
|
27
|
+
name.version if name.respond_to?(:version)
|
|
28
|
+
elsif version.is_a? VersionStr
|
|
29
|
+
version
|
|
30
|
+
else
|
|
31
|
+
version.to_version
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def == other
|
|
36
|
+
if other.is_a? VersionOf
|
|
37
|
+
name == other.name &&
|
|
38
|
+
version == other.version
|
|
39
|
+
else
|
|
40
|
+
to_s == other.to_s
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def <=> other
|
|
45
|
+
raise ArgumentError, "You can't compare the versions of two different things (#{name}, #{other.name})." unless name == other.name
|
|
46
|
+
version <=> other.version
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def matches? other
|
|
50
|
+
if other.is_a? VersionStr
|
|
51
|
+
version.nil? || other.send(version.operator, version)
|
|
52
|
+
else
|
|
53
|
+
matches? other.to_version
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def to_s joinery = '-'
|
|
58
|
+
[name, version].compact * joinery
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def inspect
|
|
62
|
+
"#<VersionOf #{name}#{", v#{version}" unless version.nil?}>"
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module Babushka
|
|
2
|
+
class VersionStrError < StandardError; end
|
|
3
|
+
class InvalidVersionOperator < VersionStrError; end
|
|
4
|
+
class InvalidVersionStr < VersionStrError; end
|
|
5
|
+
|
|
6
|
+
class VersionStr
|
|
7
|
+
include Comparable
|
|
8
|
+
attr_reader :pieces, :operator, :version
|
|
9
|
+
GemVersionOperators = %w[= == != > < >= <= ~>].freeze
|
|
10
|
+
|
|
11
|
+
def <=> other
|
|
12
|
+
other = other.to_version unless other.is_a? VersionStr
|
|
13
|
+
max_length = [pieces.length, other.pieces.length].max
|
|
14
|
+
(0...max_length).to_a.pick {|index|
|
|
15
|
+
result = compare_pieces pieces[index], other.pieces[index]
|
|
16
|
+
result unless result == 0
|
|
17
|
+
} || 0
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def initialize str
|
|
21
|
+
@operator, @version = str.strip.scan(/^([^\s\w\-\.]+)?\s*v?([\w\-\.]+)$/i).first
|
|
22
|
+
|
|
23
|
+
if !(@operator.nil? || GemVersionOperators.include?(@operator))
|
|
24
|
+
raise InvalidVersionOperator, "VersionStr.new('#{str}'): invalid operator '#{@operator}'."
|
|
25
|
+
elsif @version.nil?
|
|
26
|
+
raise InvalidVersionStr, "VersionStr.new('#{str}'): couldn't parse a version number."
|
|
27
|
+
else
|
|
28
|
+
@pieces = @version.strip.scan(/\d+|[a-zA-Z]+|\w+/).map {|piece|
|
|
29
|
+
piece[/^\d+$/] ? piece.to_i : piece
|
|
30
|
+
}
|
|
31
|
+
@operator = '==' if @operator.nil? || @operator == '='
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def to_s
|
|
36
|
+
@operator == '==' ? @version : "#{@operator} #{@version}"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
define_method "!=" do |other|
|
|
40
|
+
!(self == other)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
define_method "~>" do |other|
|
|
44
|
+
(self >= other) && pieces.starts_with?(other.pieces[0..-2])
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def compare_pieces this, that
|
|
50
|
+
if this.is_a?(String) ^ that.is_a?(String)
|
|
51
|
+
this.is_a?(String) ? -1 : 1
|
|
52
|
+
else
|
|
53
|
+
(this || 0) <=> (that || 0)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Babushka
|
|
2
|
+
class XMLString < String
|
|
3
|
+
# This extracts values from XML, like that found in .plist files. For example,
|
|
4
|
+
#
|
|
5
|
+
# %Q{
|
|
6
|
+
# <key>SVNPath</key>
|
|
7
|
+
# <string>/trunk/src</string>
|
|
8
|
+
# <key>SVNRevision</key>
|
|
9
|
+
# <string>37609</string>
|
|
10
|
+
# }.val_for('SVNRevision') #=> "37609"
|
|
11
|
+
#
|
|
12
|
+
# It doesn't work for arrays, and probably doesn't work for boolean values.
|
|
13
|
+
# Patches welcome :)
|
|
14
|
+
def val_for key
|
|
15
|
+
split(/<\/[^>]+>\n\s*<key>/m).select {|i|
|
|
16
|
+
i[/#{Regexp.escape(key)}<\/key>/]
|
|
17
|
+
}.map {|i|
|
|
18
|
+
i.scan(/<[^\/>]+>(.*)$/m)
|
|
19
|
+
}.flatten.first
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class String
|
|
25
|
+
def xml_val_for key
|
|
26
|
+
Babushka::XMLString.new(self).val_for(key)
|
|
27
|
+
end
|
|
28
|
+
end
|
data/lib/components.rb
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
require 'singleton'
|
|
2
|
+
|
|
3
|
+
module Babushka
|
|
4
|
+
ExternalComponents = %w[
|
|
5
|
+
fancypath/fancypath
|
|
6
|
+
inkan/inkan
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
Components = %w[
|
|
10
|
+
core_patches/blank
|
|
11
|
+
core_patches/try
|
|
12
|
+
core_patches/array
|
|
13
|
+
core_patches/hash
|
|
14
|
+
core_patches/hashish
|
|
15
|
+
core_patches/integer
|
|
16
|
+
core_patches/io
|
|
17
|
+
core_patches/numeric
|
|
18
|
+
core_patches/bytes
|
|
19
|
+
core_patches/object
|
|
20
|
+
core_patches/string
|
|
21
|
+
core_patches/symbol
|
|
22
|
+
core_patches/uri
|
|
23
|
+
xml_string
|
|
24
|
+
helpers/log_helpers
|
|
25
|
+
helpers/shell_helpers
|
|
26
|
+
helpers/path_helpers
|
|
27
|
+
helpers/run_helpers
|
|
28
|
+
helpers/suggest_helpers
|
|
29
|
+
helpers/git_helpers
|
|
30
|
+
helpers/uri_helpers
|
|
31
|
+
popen
|
|
32
|
+
shell
|
|
33
|
+
git_repo
|
|
34
|
+
resource
|
|
35
|
+
prompt
|
|
36
|
+
lambda_chooser
|
|
37
|
+
ip
|
|
38
|
+
version_str
|
|
39
|
+
version_of
|
|
40
|
+
accepts_list_for
|
|
41
|
+
accepts_value_for
|
|
42
|
+
accepts_block_for
|
|
43
|
+
colorizer
|
|
44
|
+
levenshtein
|
|
45
|
+
cmdline/parser
|
|
46
|
+
cmdline/handler
|
|
47
|
+
cmdline/helpers
|
|
48
|
+
cmdline
|
|
49
|
+
base
|
|
50
|
+
renderable
|
|
51
|
+
system_definitions
|
|
52
|
+
system_profile
|
|
53
|
+
run_reporter
|
|
54
|
+
bug_reporter
|
|
55
|
+
pkg_helper
|
|
56
|
+
pkg_helpers/base_helper
|
|
57
|
+
pkg_helpers/apt_helper
|
|
58
|
+
pkg_helpers/yum_helper
|
|
59
|
+
pkg_helpers/brew_helper
|
|
60
|
+
pkg_helpers/gem_helper
|
|
61
|
+
pkg_helpers/macports_helper
|
|
62
|
+
pkg_helpers/src_helper
|
|
63
|
+
pkg_helpers/pip_helper
|
|
64
|
+
pkg_helpers/binpkgsrc_helper
|
|
65
|
+
pkg_helpers/binports_helper
|
|
66
|
+
pkg_helpers/npm_helper
|
|
67
|
+
pkg_helpers/pacman_helper
|
|
68
|
+
dsl
|
|
69
|
+
dep
|
|
70
|
+
dep_pool
|
|
71
|
+
task
|
|
72
|
+
source
|
|
73
|
+
source_pool
|
|
74
|
+
vars
|
|
75
|
+
parameter
|
|
76
|
+
dep_runner
|
|
77
|
+
dep_definer
|
|
78
|
+
dep_context
|
|
79
|
+
meta_dep
|
|
80
|
+
meta_dep_context
|
|
81
|
+
]
|
|
82
|
+
end
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
require 'pathname'
|
|
2
|
+
|
|
3
|
+
class Fancypath < Pathname
|
|
4
|
+
module Helpers
|
|
5
|
+
require 'etc'
|
|
6
|
+
def to_fancypath
|
|
7
|
+
Fancypath.new to_tilde_expanded_path
|
|
8
|
+
end
|
|
9
|
+
def to_expanded_fancypath
|
|
10
|
+
Fancypath.new File.expand_path(to_tilde_expanded_path)
|
|
11
|
+
end
|
|
12
|
+
def to_tilde_expanded_path
|
|
13
|
+
sub(/^\~\/|^\~$/) {|_| Etc.getpwuid(Process.euid).dir.end_with('/') }
|
|
14
|
+
end
|
|
15
|
+
alias :p :to_expanded_fancypath
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# methods are chainable and do what you think they do
|
|
19
|
+
|
|
20
|
+
alias_method :to_str, :to_s unless method_defined? :to_str
|
|
21
|
+
|
|
22
|
+
alias_method :dir, :dirname
|
|
23
|
+
alias_method :directory, :dirname
|
|
24
|
+
|
|
25
|
+
alias_method :dir?, :directory?
|
|
26
|
+
|
|
27
|
+
alias_method :expand, :expand_path
|
|
28
|
+
alias_method :abs, :expand_path
|
|
29
|
+
alias_method :absolute, :expand_path
|
|
30
|
+
|
|
31
|
+
alias_method :exists?, :exist?
|
|
32
|
+
alias_method :rename_to, :rename
|
|
33
|
+
|
|
34
|
+
def == other
|
|
35
|
+
if other.is_a? String
|
|
36
|
+
to_s == other
|
|
37
|
+
else
|
|
38
|
+
super
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def length
|
|
43
|
+
to_s.length
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def join(path)
|
|
47
|
+
path_str = path.to_s
|
|
48
|
+
super(path_str[0..0] == '/' ? path_str[1..-1] : path_str).p
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
alias_method :/, :join
|
|
52
|
+
|
|
53
|
+
# This method returns true if the path is writable (i.e. and already
|
|
54
|
+
# exists), or if the current user would be able to create it (i.e. if
|
|
55
|
+
# its closest existing parent is writable).
|
|
56
|
+
def hypothetically_writable?
|
|
57
|
+
writable? || (!exists? && !root? && parent.hypothetically_writable?)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# make file
|
|
61
|
+
def touch
|
|
62
|
+
`touch '#{self}'`
|
|
63
|
+
self
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def create_dir
|
|
67
|
+
mkpath unless exist?
|
|
68
|
+
self
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
alias_method :create, :create_dir
|
|
72
|
+
|
|
73
|
+
def copy(dest)
|
|
74
|
+
`cp -pPR '#{self}' '#{dest}'`
|
|
75
|
+
self
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
alias_method :cp, :copy
|
|
79
|
+
|
|
80
|
+
# file or dir
|
|
81
|
+
def remove
|
|
82
|
+
directory? ? rmtree : delete if exist?
|
|
83
|
+
self
|
|
84
|
+
end
|
|
85
|
+
alias_method :rm, :remove
|
|
86
|
+
|
|
87
|
+
def read
|
|
88
|
+
super.chomp if exists?
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def readlink
|
|
92
|
+
if !symlink?
|
|
93
|
+
self
|
|
94
|
+
elsif
|
|
95
|
+
target = super
|
|
96
|
+
target.absolute? ? target : (dir / target)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def mkdir
|
|
101
|
+
`mkdir -p '#{self}'`
|
|
102
|
+
self
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def glob expr = nil, flags = File::FNM_CASEFOLD, &block
|
|
106
|
+
Dir.glob((expr.nil? ? self : (self / expr)).to_s, flags, &block)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def write(contents, mode='wb')
|
|
110
|
+
dirname.create
|
|
111
|
+
open(mode) { |f| f.write contents }
|
|
112
|
+
self
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def append(contents)
|
|
116
|
+
write(contents,'a+')
|
|
117
|
+
self
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def move(dest)
|
|
121
|
+
self.rename(dest)
|
|
122
|
+
dest.p
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def tail(bytes)
|
|
126
|
+
return self.read if self.size < bytes
|
|
127
|
+
open('r') do |f|
|
|
128
|
+
f.seek(-bytes, IO::SEEK_END)
|
|
129
|
+
f.read
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
alias_method :mv, :move
|
|
134
|
+
|
|
135
|
+
def set_extension(ext)
|
|
136
|
+
"#{without_extension}.#{ext}".p
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
alias_method :change_extension, :set_extension
|
|
140
|
+
|
|
141
|
+
def without_extension
|
|
142
|
+
to_s[/^ (.+?) (\. ([^\.]+))? $/x, 1].p
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def has_extension?(ext)
|
|
146
|
+
!!(self.to_s =~ /\.#{ext}$/)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def parent
|
|
150
|
+
super.p
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
alias_method :all_children, :children
|
|
154
|
+
|
|
155
|
+
def children
|
|
156
|
+
super.reject { |c| c.basename.to_s =~ /^\./ }
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# only takes sym atm
|
|
160
|
+
def select(*args)
|
|
161
|
+
return args.map { |arg| select(arg) }.flatten.uniq if args.size > 1
|
|
162
|
+
|
|
163
|
+
case arg = args.first
|
|
164
|
+
when Symbol
|
|
165
|
+
Dir["#{self}/*.#{arg}"].map { |p| self.class.new(p) }
|
|
166
|
+
when Regexp
|
|
167
|
+
children.select { |child| child.to_s =~ arg }
|
|
168
|
+
else
|
|
169
|
+
Dir["#{self}/#{arg}"].map { |p| self.class.new(p) }
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def empty?
|
|
174
|
+
directory? ? children.size == 0 : self.size == 0
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def owner
|
|
178
|
+
Etc.getpwuid(File.stat(to_s).uid).name
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def group
|
|
182
|
+
Etc.getgrgid(File.stat(to_s).gid).name
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def inspect
|
|
186
|
+
super.sub('Pathname','Fancypath')
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def to_fancypath
|
|
190
|
+
self
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
class Pathname
|
|
196
|
+
include Fancypath::Helpers
|
|
197
|
+
end
|
|
198
|
+
class String
|
|
199
|
+
include Fancypath::Helpers
|
|
200
|
+
end
|
data/lib/inkan/inkan.rb
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
class Inkan
|
|
2
|
+
attr_accessor :credit, :comment, :comment_suffix
|
|
3
|
+
|
|
4
|
+
def self.legitimate?(filename)
|
|
5
|
+
File.open(filename) do |file|
|
|
6
|
+
file_content = file.read
|
|
7
|
+
seal, content = if file_content[/\A#!/]
|
|
8
|
+
hashbang, seal, remaining_content = file_content.split("\n", 3)
|
|
9
|
+
[seal, "#{hashbang}\n#{remaining_content}"]
|
|
10
|
+
else
|
|
11
|
+
file_content.split("\n", 2)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
!seal[/\s#{sha(content || '')}\s*$/].nil?
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.seal(file)
|
|
19
|
+
new(file).tap {|inkan| yield inkan }.seal
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.render
|
|
23
|
+
new(nil).tap {|inkan| yield inkan }.render
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.sha(content)
|
|
27
|
+
require 'digest/sha1'
|
|
28
|
+
Digest::SHA1.hexdigest(content)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def initialize(file)
|
|
32
|
+
@file = file
|
|
33
|
+
|
|
34
|
+
# Set Defaults
|
|
35
|
+
@credit = 'Generated by Inkan'
|
|
36
|
+
@comment = '#'
|
|
37
|
+
@comment_suffix = ''
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def print(string)
|
|
41
|
+
file_content << string
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def puts(string)
|
|
45
|
+
file_content << string << "\n"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def seal
|
|
49
|
+
File.open(@file, 'w') do |f|
|
|
50
|
+
f.print render
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def render
|
|
55
|
+
if file_content[/\A#!/]
|
|
56
|
+
hashbang, remaining_content = file_content.split("\n", 2)
|
|
57
|
+
"#{hashbang}\n#{render_seal}\n#{remaining_content}"
|
|
58
|
+
else
|
|
59
|
+
"#{render_seal}\n#{file_content}"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
|
|
65
|
+
def render_seal
|
|
66
|
+
"#{comment} #{credit}. #{sha} #{comment_suffix}"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def sha
|
|
70
|
+
self.class.sha(file_content)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def file_content
|
|
74
|
+
@file_content ||= ''
|
|
75
|
+
end
|
|
76
|
+
end
|