nuggets 1.1.0 → 1.2.0

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
  SHA1:
3
- metadata.gz: 5770eebf6f2e382109a635d9f45c9855158c5a31
4
- data.tar.gz: 6894e3ab73e1b9c743b2af81e76f15003e6a5311
3
+ metadata.gz: b0b959bddb4e1b2d928bcb059f1ea972929212ba
4
+ data.tar.gz: 21aa2cb33d3d74c60fcc464c8be1daf8048b0d4b
5
5
  SHA512:
6
- metadata.gz: 1118fc142d9093d67e5e4269f7988abfbbae0d9404d120150d30b6836b6e208517f1361b55c9e44146530a54bd1cfcc57964ae6a2cc297e5f2480ce236956583
7
- data.tar.gz: 96225bab56c69d06f0701e787ae6d123d383aebd6564874d0ff8f5e094a28c83561acd759b74efb2cdee512e221e1cb5a953963026af728d2061b5755bd5fa06
6
+ metadata.gz: 8ecfb6dcc2afadaf74e24823fa679a54ce178a1312b3e16aad6d5149a5354ab6be1031e29683049667bf162d37b8bbe41e0ab83f79d80b4d10446b2dc3b5aa39
7
+ data.tar.gz: 2f24ba68b5046c446abdc1352170009ad2b15a55b116a3cdea96fb5b633d20bc41d6109f9606dc0f4b6276524d509709c1192163f30118c70bbd2d88bbc21f96
data/ChangeLog CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  = Revision history for nuggets
4
4
 
5
+ == 1.2.0 [2015-03-13]
6
+
7
+ * Extracted Nuggets::RubyMixin from Nuggets::Ruby.
8
+ * Added Net::SSH::Connection::Session#exec_sudo.
9
+ * Added Hash.deproc.
10
+
5
11
  == 1.1.0 [2014-11-26]
6
12
 
7
13
  * Nuggets::LogParser::Rails no longer <tt>eval</tt>s the params hash; set the
data/README CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  == VERSION
4
4
 
5
- This documentation refers to nuggets version 1.1.0.
5
+ This documentation refers to nuggets version 1.2.0.
6
6
 
7
7
 
8
8
  == DESCRIPTION
@@ -58,7 +58,7 @@ Travis CI:: https://travis-ci.org/blackwinter/nuggets
58
58
 
59
59
  == LICENSE AND COPYRIGHT
60
60
 
61
- Copyright (C) 2007-2014 Jens Wille
61
+ Copyright (C) 2007-2015 Jens Wille
62
62
 
63
63
  nuggets is free software: you can redistribute it and/or modify it
64
64
  under the terms of the GNU Affero General Public License as published by
data/Rakefile CHANGED
@@ -40,7 +40,7 @@ task 'spec:isolated' do
40
40
  }
41
41
  end
42
42
 
43
- if RUBY_PLATFORM == 'java'
43
+ if RUBY_ENGINE == 'jruby'
44
44
  task spec: :enable_objspace
45
45
 
46
46
  task :enable_objspace do
@@ -1,66 +1,5 @@
1
- #--
2
- ###############################################################################
3
- # #
4
- # nuggets -- Extending Ruby #
5
- # #
6
- # Copyright (C) 2007-2011 Jens Wille #
7
- # #
8
- # Authors: #
9
- # Jens Wille <jens.wille@gmail.com> #
10
- # #
11
- # nuggets is free software; you can redistribute it and/or modify it under #
12
- # the terms of the GNU Affero General Public License as published by the Free #
13
- # Software Foundation; either version 3 of the License, or (at your option) #
14
- # any later version. #
15
- # #
16
- # nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
17
- # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
18
- # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
19
- # more details. #
20
- # #
21
- # You should have received a copy of the GNU Affero General Public License #
22
- # along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
23
- # #
24
- ###############################################################################
25
- #++
1
+ require 'nuggets/enumerable/all_any_extended_mixin'
26
2
 
27
- module Enumerable
28
-
29
- alias_method :_nuggets_original_all?, :all?
30
- alias_method :_nuggets_original_any?, :any?
31
-
32
- # call-seq:
33
- # enum.all?(obj[, operator]) => +true+ or +false+
34
- # enum.all? { ... } => +true+ or +false+
35
- #
36
- # Adds the ability to pass an +object+ instead of a block, which will then
37
- # be tested against each item in _enum_ according to +operator+, defaulting
38
- # to <tt>:===</tt>.
39
- def all?(object = default = true, operator = :===, &block)
40
- _nuggets_original_all?(&_block_for_all_any_extended(object, default, operator, &block))
41
- end
42
-
43
- # call-seq:
44
- # enum.any?(obj[, operator]) => +true+ or +false+
45
- # enum.any? { ... } => +true+ or +false+
46
- #
47
- # Adds the ability to pass an +object+ instead of a block, which will then
48
- # be tested against each item in _enum_ according to +operator+, defaulting
49
- # to <tt>:===</tt>.
50
- def any?(object = default = true, operator = :===, &block)
51
- _nuggets_original_any?(&_block_for_all_any_extended(object, default, operator, &block))
52
- end
53
-
54
- private
55
-
56
- # Common argument processing for extended versions of #all? and #any?.
57
- def _block_for_all_any_extended(object, default, operator, &block)
58
- unless default
59
- raise ::ArgumentError, 'both block and object argument given', caller(1) if block
60
- lambda { |*a| object.send(operator, *a) }
61
- else
62
- block
63
- end
64
- end
65
-
66
- end
3
+ [Array, Hash, IO, Range].each { |klass|
4
+ klass.send klass.respond_to?(:prepend) ? :prepend : :include, Nuggets::Enumerable::AllAnyExtendedMixin
5
+ }
@@ -0,0 +1,65 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # nuggets -- Extending Ruby #
5
+ # #
6
+ # Copyright (C) 2007-2014 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # nuggets is free software; you can redistribute it and/or modify it under #
12
+ # the terms of the GNU Affero General Public License as published by the Free #
13
+ # Software Foundation; either version 3 of the License, or (at your option) #
14
+ # any later version. #
15
+ # #
16
+ # nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
17
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
18
+ # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
19
+ # more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ module Nuggets
28
+ module Enumerable
29
+ module AllAnyExtendedMixin
30
+
31
+ # call-seq:
32
+ # enum.all?(obj[, operator]) => +true+ or +false+
33
+ # enum.all? { ... } => +true+ or +false+
34
+ #
35
+ # Adds the ability to pass an +object+ instead of a block, which will then
36
+ # be tested against each item in _enum_ according to +operator+, defaulting
37
+ # to <tt>:===</tt>.
38
+ def all?(object = default = true, operator = :===, &block)
39
+ super(&_block_for_all_any_extended(object, default, operator, &block))
40
+ end
41
+
42
+ # call-seq:
43
+ # enum.any?(obj[, operator]) => +true+ or +false+
44
+ # enum.any? { ... } => +true+ or +false+
45
+ #
46
+ # Adds the ability to pass an +object+ instead of a block, which will then
47
+ # be tested against each item in _enum_ according to +operator+, defaulting
48
+ # to <tt>:===</tt>.
49
+ def any?(object = default = true, operator = :===, &block)
50
+ super(&_block_for_all_any_extended(object, default, operator, &block))
51
+ end
52
+
53
+ private
54
+
55
+ # Common argument processing for extended versions of #all? and #any?.
56
+ def _block_for_all_any_extended(object, default, operator, &block)
57
+ default ? block : begin
58
+ raise ::ArgumentError, 'both block and object argument given', caller(1) if block
59
+ lambda { |*a| object.send(operator, *a) }
60
+ end
61
+ end
62
+
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,5 @@
1
+ require 'nuggets/hash/deproc_mixin'
2
+
3
+ class Hash
4
+ include Nuggets::Hash::DeprocMixin
5
+ end
@@ -0,0 +1,79 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # nuggets -- Extending Ruby #
5
+ # #
6
+ # Copyright (C) 2007-2015 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # nuggets is free software; you can redistribute it and/or modify it under #
12
+ # the terms of the GNU Affero General Public License as published by the Free #
13
+ # Software Foundation; either version 3 of the License, or (at your option) #
14
+ # any later version. #
15
+ # #
16
+ # nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
17
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
18
+ # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
19
+ # more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ module Nuggets
28
+ class Hash
29
+ module DeprocMixin
30
+
31
+ # call-seq:
32
+ # hash.deproc -> aProc
33
+ # hash.deproc { |proc| ... } -> anObject
34
+ #
35
+ # Removes the default proc from _hash_. If a block is given, yields the proc
36
+ # to the block, restores the default proc afterwards and returns the block's
37
+ # return value. Otherwise, returns the proc.
38
+ #
39
+ # Example:
40
+ #
41
+ # h = Hash.new { |h, k| h[k] = [] }
42
+ # h.deproc { |_h| Marshal.dump(_h) } #=> ...dump data...
43
+ # h.default_proc #=> #<Proc:...>
44
+ #
45
+ # NOTE: Requires Ruby >= 2.0
46
+ def deproc
47
+ default_proc, self.default_proc = self.default_proc, nil
48
+ return default_proc unless block_given?
49
+
50
+ begin
51
+ yield self
52
+ ensure
53
+ self.default_proc = default_proc
54
+ end
55
+ end
56
+
57
+ # call-seq:
58
+ # hash.deproc! -> _hash_ or nil
59
+ #
60
+ # Removes the default proc from _hash_, if present, and returns _hash_.
61
+ # Otherwise, returns +nil+.
62
+ #
63
+ # Example:
64
+ #
65
+ # h = Hash.new { |h, k| h[k] = [] }
66
+ # Marshal.dump(h.deproc!) #=> ...dump data...
67
+ # h.default_proc #=> nil
68
+ #
69
+ # NOTE: Requires Ruby >= 2.0
70
+ def deproc!
71
+ return unless default_proc
72
+
73
+ self.default_proc = nil
74
+ self
75
+ end
76
+
77
+ end
78
+ end
79
+ end
@@ -3,7 +3,7 @@
3
3
  # #
4
4
  # nuggets -- Extending Ruby #
5
5
  # #
6
- # Copyright (C) 2007-2011 Jens Wille #
6
+ # Copyright (C) 2007-2014 Jens Wille #
7
7
  # #
8
8
  # Authors: #
9
9
  # Jens Wille <jens.wille@gmail.com> #
@@ -24,11 +24,13 @@
24
24
  ###############################################################################
25
25
  #++
26
26
 
27
+ require 'nuggets/ruby_mixin'
28
+
27
29
  module Nuggets
28
30
  class IO
29
31
  module NullMixin
30
32
 
31
- NULL = case ::RUBY_PLATFORM
33
+ NULL = case RubyMixin::RUBY_PLATFORM
32
34
  when /mswin|mingw/i then 'NUL'
33
35
  when /openvms/i then 'NL:'
34
36
  when /amiga/i then 'NIL:'
@@ -31,13 +31,11 @@ module Nuggets
31
31
  module LazyAttrMixin
32
32
 
33
33
  def lazy_accessor(name, options = {}, &block)
34
- attr_accessor(lazy_name(name, options))
35
- lazy_reader(name, options, &block)
34
+ attr_writer(attr = lazy_name(name, options))
35
+ lazy_reader(name, options, attr, &block)
36
36
  end
37
37
 
38
- def lazy_reader(name, options = {}, &block)
39
- attr = lazy_name(name, options)
40
-
38
+ def lazy_reader(name, options = {}, attr = lazy_name(name, options), &block)
41
39
  define_method(name) { lazy_attr(attr,
42
40
  options.fetch(:freeze, true), &block) }
43
41
  end
@@ -0,0 +1,45 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # nuggets -- Extending Ruby #
5
+ # #
6
+ # Copyright (C) 2007-2015 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # nuggets is free software; you can redistribute it and/or modify it under #
12
+ # the terms of the GNU Affero General Public License as published by the Free #
13
+ # Software Foundation; either version 3 of the License, or (at your option) #
14
+ # any later version. #
15
+ # #
16
+ # nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
17
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
18
+ # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
19
+ # more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ require 'net/ssh'
28
+
29
+ class Net::SSH::Connection::Session
30
+
31
+ def exec_sudo(command, prompt = /password/, &block)
32
+ block ||= lambda { |data| ask(data) { |q| q.echo = false } }
33
+
34
+ open_channel { |ch|
35
+ ch.request_pty
36
+
37
+ ch.exec("sudo #{command}") { ch.on_data { |_, data|
38
+ ch.send_data("#{block[data]}\n") if data =~ prompt
39
+ } }
40
+
41
+ ch.wait
42
+ }
43
+ end
44
+
45
+ end
data/lib/nuggets/ruby.rb CHANGED
@@ -24,199 +24,20 @@
24
24
  ###############################################################################
25
25
  #++
26
26
 
27
- require 'rbconfig'
27
+ require 'nuggets/ruby_mixin'
28
28
 
29
29
  module Nuggets
30
-
31
- # Originally based on Phusion Passenger's
32
- # {PlatformInfo}[https://github.com/FooBarWidget/passenger/blob/release-3.0.2/lib/phusion_passenger/platform_info/ruby.rb]
33
- # module.
34
- #
35
- #--
36
- # Phusion Passenger - http://www.modrails.com/
37
- # Copyright (c) 2010 Phusion
38
- #
39
- # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
40
- #
41
- # Permission is hereby granted, free of charge, to any person obtaining a
42
- # copy of this software and associated documentation files (the "Software"),
43
- # to deal in the Software without restriction, including without limitation
44
- # the rights to use, copy, modify, merge, publish, distribute, sublicense,
45
- # and/or sell copies of the Software, and to permit persons to whom the
46
- # Software is furnished to do so, subject to the following conditions:
47
- #
48
- # The above copyright notice and this permission notice shall be included in
49
- # all copies or substantial portions of the Software.
50
- #++
51
-
52
30
  module Ruby
53
31
 
32
+ include RubyMixin
54
33
  extend self
55
34
 
56
- CONFIG = ::RbConfig::CONFIG
57
-
58
- # Store original $GEM_HOME value so that even if the app customizes
59
- # $GEM_HOME we can still work with the original value.
60
- if gem_home = ::ENV['GEM_HOME']
61
- gem_home = gem_home.strip.freeze
62
- gem_home = nil if gem_home.empty?
63
- end
64
-
65
- GEM_HOME = gem_home
66
-
67
- RUBY_ENGINE = defined?(::RUBY_ENGINE) ? ::RUBY_ENGINE : 'ruby'
68
-
69
- OSX_RUBY_RE = %r{\A/System/Library/Frameworks/Ruby.framework/Versions/.*?/usr/bin/ruby\Z}
70
-
71
- # Returns correct command for invoking the current Ruby interpreter.
72
- def ruby_command
73
- defined?(@ruby_command) ? @ruby_command : @ruby_command = ruby_executable
74
- end
75
-
76
- attr_writer :ruby_command
77
-
78
- # Returns the full path to the current Ruby interpreter's executable file.
79
- # This might not be the actual correct command to use for invoking the Ruby
80
- # interpreter; use ruby_command instead.
81
- def ruby_executable
82
- @ruby_executable ||= begin
83
- dir, name, ext = CONFIG.values_at(*%w[bindir RUBY_INSTALL_NAME EXEEXT])
84
- ::File.join(dir, name + ext).sub(/.*\s.*/m, '"\&"')
85
- end
86
- end
87
-
88
- attr_writer :ruby_executable
89
-
90
- # Locates a Ruby tool command +name+, e.g. 'gem', 'rake', 'bundle', etc. Instead
91
- # of naively looking in $PATH, this function uses a variety of search heuristics
92
- # to find the command that's really associated with the current Ruby interpreter.
93
- # It should never locate a command that's actually associated with a different
94
- # Ruby interpreter.
95
- #
96
- # NOTE: The return value may not be the actual correct invocation for the tool.
97
- # Use command_for_ruby_tool for that.
98
- #
99
- # Returns +nil+ when nothing's found.
100
- def locate_ruby_tool(name, extensions = ['', CONFIG['EXEEXT']].compact.uniq)
101
- # Deduce Ruby's --program-prefix and --program-suffix from its install name
102
- # and transform the given input name accordingly.
103
- #
104
- # "rake" => "jrake", "rake1.8", etc.
105
- [name, CONFIG['RUBY_INSTALL_NAME'].sub('ruby', name)].uniq.each { |basename|
106
- extensions.each { |ext|
107
- result = locate_ruby_tool_by_basename(basename + ext) and return result
108
- }
109
- }
110
-
111
- nil
112
- end
113
-
114
- # Returns the correct command string for invoking the +name+ executable
115
- # that belongs to the current Ruby interpreter. Returns +nil+ if the
116
- # command is not found.
117
- #
118
- # If the command executable is a Ruby program, then we need to run it
119
- # in the correct Ruby interpreter just in case the command doesn't
120
- # have the correct shebang line; we don't want a totally different
121
- # Ruby than the current one to be invoked.
122
- def command_for_ruby_tool(name)
123
- filename = respond_to?(name) ? send(name) : locate_ruby_tool(name)
124
- shebang_command(filename) =~ /ruby/ ? "#{ruby_command} #{filename}" : filename
125
- end
126
-
127
- def self.define_ruby_tool(name)
128
- class_eval <<-EOT, __FILE__, __LINE__ + 1
129
- def #{name}
130
- @#{name} ||= locate_ruby_tool('#{name}')
131
- end
132
-
133
- attr_writer :#{name}
134
-
135
- def #{name}_command
136
- @#{name}_command ||= command_for_ruby_tool('#{name}')
137
- end
138
-
139
- attr_writer :#{name}_command
140
- EOT
141
- end
142
-
143
- %w[gem rake rspec].each { |name| define_ruby_tool(name) }
144
-
145
- def ruby_options_to_argv(args, ruby_command = ruby_command())
146
- argv = [ruby_command]
147
-
148
- ruby_options_from_hash(args.pop, argv) if args.last.is_a?(::Hash)
149
-
150
- argv.concat(args.map! { |arg| arg.to_s.strip })
151
- end
152
-
153
- def ruby_options_from_hash(hash, argv = [])
154
- hash.each { |key, val|
155
- opt = "-#{key.to_s[0, 1]}"
156
-
157
- if val.is_a?(::Array)
158
- val.each { |v| argv << opt << v.to_s }
159
- elsif opt == '-e'
160
- argv << opt << val.to_s
161
- elsif val != false
162
- argv << "#{opt}#{val unless val == true}"
163
- end
164
- }
165
-
166
- argv
167
- end
168
-
169
- private
170
-
171
- def locate_ruby_tool_by_basename(name)
172
- # On OS X we must look for Ruby binaries in /usr/bin.
173
- # RubyGems puts executables (e.g. 'rake') in there, not in
174
- # /System/Libraries/(...)/bin.
175
- dir = ::RUBY_PLATFORM =~ /darwin/ && ruby_command =~ OSX_RUBY_RE ?
176
- '/usr/bin' : ::File.dirname(ruby_command)
177
-
178
- filename = executable_filename(dir, name) and return filename
179
-
180
- # RubyGems might put binaries in a directory other
181
- # than Ruby's bindir. Debian packaged RubyGems and
182
- # DebGem packaged RubyGems are the prime examples.
183
- filename = executable_filename(::Gem.bindir, name) and return filename
184
-
185
- # Looks like it's not in the RubyGems bindir. Search in $PATH, but
186
- # be very careful about this because whatever we find might belong
187
- # to a different Ruby interpreter than the current one.
188
- ::ENV['PATH'].split(::File::PATH_SEPARATOR).each { |path|
189
- if filename = executable_filename(path, name)
190
- return filename if shebang_command(filename) == ruby_command
191
- end
192
- }
193
-
194
- nil
195
- end
196
-
197
- def executable_filename(dir, name)
198
- filename = ::File.join(dir, name)
199
- filename if ::File.file?(filename) && ::File.executable?(filename)
200
- end
201
-
202
- def shebang_command(filename)
203
- ::File.foreach(filename) { |line|
204
- return $1 if line =~ /\A#!\s*(\S*)/
205
-
206
- # Allow one extra line for magic comment.
207
- break if $. > 1
208
- }
209
-
210
- nil
211
- end
212
-
213
35
  end
214
-
215
36
  end
216
37
 
217
38
  def File.ruby; ::Nuggets::Ruby.ruby_command; end
218
39
 
219
- if RUBY_PLATFORM == 'java'
40
+ if RUBY_ENGINE == 'jruby'
220
41
  def Process.ruby(*args, &block)
221
42
  argv = ::Nuggets::Ruby.ruby_options_to_argv(args)
222
43
  ::IO.popen4(*argv, &block); $?
@@ -0,0 +1,215 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # nuggets -- Extending Ruby #
5
+ # #
6
+ # Copyright (C) 2007-2014 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # nuggets is free software; you can redistribute it and/or modify it under #
12
+ # the terms of the GNU Affero General Public License as published by the Free #
13
+ # Software Foundation; either version 3 of the License, or (at your option) #
14
+ # any later version. #
15
+ # #
16
+ # nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
17
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
18
+ # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
19
+ # more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ require 'rbconfig'
28
+
29
+ module Nuggets
30
+
31
+ # Originally based on Phusion Passenger's
32
+ # {PlatformInfo}[https://github.com/FooBarWidget/passenger/blob/release-3.0.2/lib/phusion_passenger/platform_info/ruby.rb]
33
+ # module.
34
+ #
35
+ #--
36
+ # Phusion Passenger - http://www.modrails.com/
37
+ # Copyright (c) 2010 Phusion
38
+ #
39
+ # "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
40
+ #
41
+ # Permission is hereby granted, free of charge, to any person obtaining a
42
+ # copy of this software and associated documentation files (the "Software"),
43
+ # to deal in the Software without restriction, including without limitation
44
+ # the rights to use, copy, modify, merge, publish, distribute, sublicense,
45
+ # and/or sell copies of the Software, and to permit persons to whom the
46
+ # Software is furnished to do so, subject to the following conditions:
47
+ #
48
+ # The above copyright notice and this permission notice shall be included in
49
+ # all copies or substantial portions of the Software.
50
+ #++
51
+
52
+ module RubyMixin
53
+
54
+ CONFIG = ::RbConfig::CONFIG
55
+
56
+ # Store original $GEM_HOME value so that even if the app customizes
57
+ # $GEM_HOME we can still work with the original value.
58
+ if gem_home = ::ENV['GEM_HOME']
59
+ gem_home = gem_home.strip.freeze
60
+ gem_home = nil if gem_home.empty?
61
+ end
62
+
63
+ GEM_HOME = gem_home
64
+
65
+ RUBY_ENGINE = defined?(::RUBY_ENGINE) ? ::RUBY_ENGINE : 'ruby'
66
+
67
+ RUBY_PLATFORM = ::RUBY_ENGINE == 'jruby' ? CONFIG['target_os'] : ::RUBY_PLATFORM
68
+
69
+ OSX_RUBY_RE = %r{\A/System/Library/Frameworks/Ruby.framework/Versions/.*?/usr/bin/ruby\Z}
70
+
71
+ # Returns correct command for invoking the current Ruby interpreter.
72
+ def ruby_command
73
+ defined?(@ruby_command) ? @ruby_command : @ruby_command = ruby_executable
74
+ end
75
+
76
+ attr_writer :ruby_command
77
+
78
+ # Returns the full path to the current Ruby interpreter's executable file.
79
+ # This might not be the actual correct command to use for invoking the Ruby
80
+ # interpreter; use ruby_command instead.
81
+ def ruby_executable
82
+ @ruby_executable ||= begin
83
+ dir, name, ext = CONFIG.values_at(*%w[bindir RUBY_INSTALL_NAME EXEEXT])
84
+ ::File.join(dir, name + ext).sub(/.*\s.*/m, '"\&"')
85
+ end
86
+ end
87
+
88
+ attr_writer :ruby_executable
89
+
90
+ # Locates a Ruby tool command +name+, e.g. 'gem', 'rake', 'bundle', etc. Instead
91
+ # of naively looking in $PATH, this function uses a variety of search heuristics
92
+ # to find the command that's really associated with the current Ruby interpreter.
93
+ # It should never locate a command that's actually associated with a different
94
+ # Ruby interpreter.
95
+ #
96
+ # NOTE: The return value may not be the actual correct invocation for the tool.
97
+ # Use command_for_ruby_tool for that.
98
+ #
99
+ # Returns +nil+ when nothing's found.
100
+ def locate_ruby_tool(name, extensions = ['', CONFIG['EXEEXT']].compact.uniq)
101
+ # Deduce Ruby's --program-prefix and --program-suffix from its install name
102
+ # and transform the given input name accordingly.
103
+ #
104
+ # "rake" => "jrake", "rake1.8", etc.
105
+ [name, CONFIG['RUBY_INSTALL_NAME'].sub('ruby', name)].uniq.each { |basename|
106
+ extensions.each { |ext|
107
+ result = locate_ruby_tool_by_basename(basename + ext) and return result
108
+ }
109
+ }
110
+
111
+ nil
112
+ end
113
+
114
+ # Returns the correct command string for invoking the +name+ executable
115
+ # that belongs to the current Ruby interpreter. Returns +nil+ if the
116
+ # command is not found.
117
+ #
118
+ # If the command executable is a Ruby program, then we need to run it
119
+ # in the correct Ruby interpreter just in case the command doesn't
120
+ # have the correct shebang line; we don't want a totally different
121
+ # Ruby than the current one to be invoked.
122
+ def command_for_ruby_tool(name)
123
+ filename = respond_to?(name) ? send(name) : locate_ruby_tool(name)
124
+ shebang_command(filename) =~ /ruby/ ? "#{ruby_command} #{filename}" : filename
125
+ end
126
+
127
+ def self.define_ruby_tool(name)
128
+ class_eval <<-EOT, __FILE__, __LINE__ + 1
129
+ def #{name}
130
+ @#{name} ||= locate_ruby_tool('#{name}')
131
+ end
132
+
133
+ attr_writer :#{name}
134
+
135
+ def #{name}_command
136
+ @#{name}_command ||= command_for_ruby_tool('#{name}')
137
+ end
138
+
139
+ attr_writer :#{name}_command
140
+ EOT
141
+ end
142
+
143
+ %w[gem rake rspec].each { |name| define_ruby_tool(name) }
144
+
145
+ def ruby_options_to_argv(args, ruby_command = ruby_command())
146
+ argv = [ruby_command]
147
+
148
+ ruby_options_from_hash(args.pop, argv) if args.last.is_a?(::Hash)
149
+
150
+ argv.concat(args.map! { |arg| arg.to_s.strip })
151
+ end
152
+
153
+ def ruby_options_from_hash(hash, argv = [])
154
+ hash.each { |key, val|
155
+ opt = "-#{key.to_s[0, 1]}"
156
+
157
+ if val.is_a?(::Array)
158
+ val.each { |v| argv << opt << v.to_s }
159
+ elsif opt == '-e'
160
+ argv << opt << val.to_s
161
+ elsif val != false
162
+ argv << "#{opt}#{val unless val == true}"
163
+ end
164
+ }
165
+
166
+ argv
167
+ end
168
+
169
+ private
170
+
171
+ def locate_ruby_tool_by_basename(name)
172
+ # On OS X we must look for Ruby binaries in /usr/bin.
173
+ # RubyGems puts executables (e.g. 'rake') in there, not in
174
+ # /System/Libraries/(...)/bin.
175
+ dir = ::RUBY_PLATFORM =~ /darwin/ && ruby_command =~ OSX_RUBY_RE ?
176
+ '/usr/bin' : ::File.dirname(ruby_command)
177
+
178
+ filename = executable_filename(dir, name) and return filename
179
+
180
+ # RubyGems might put binaries in a directory other
181
+ # than Ruby's bindir. Debian packaged RubyGems and
182
+ # DebGem packaged RubyGems are the prime examples.
183
+ filename = executable_filename(::Gem.bindir, name) and return filename
184
+
185
+ # Looks like it's not in the RubyGems bindir. Search in $PATH, but
186
+ # be very careful about this because whatever we find might belong
187
+ # to a different Ruby interpreter than the current one.
188
+ ::ENV['PATH'].split(::File::PATH_SEPARATOR).each { |path|
189
+ if filename = executable_filename(path, name)
190
+ return filename if shebang_command(filename) == ruby_command
191
+ end
192
+ }
193
+
194
+ nil
195
+ end
196
+
197
+ def executable_filename(dir, name)
198
+ filename = ::File.join(dir, name)
199
+ filename if ::File.file?(filename) && ::File.executable?(filename)
200
+ end
201
+
202
+ def shebang_command(filename)
203
+ ::File.foreach(filename) { |line|
204
+ return $1 if line =~ /\A#!\s*(\S*)/
205
+
206
+ # Allow one extra line for magic comment.
207
+ break if $. > 1
208
+ }
209
+
210
+ nil
211
+ end
212
+
213
+ end
214
+
215
+ end
@@ -3,7 +3,7 @@ module Nuggets
3
3
  module Version
4
4
 
5
5
  MAJOR = 1
6
- MINOR = 1
6
+ MINOR = 2
7
7
  TINY = 0
8
8
 
9
9
  class << self
@@ -25,7 +25,7 @@ describe_extended ENV, Nuggets::Env::UserHomeMixin, true do
25
25
  ENV.user_home.should == 'foo'
26
26
  end
27
27
 
28
- unless RUBY_PLATFORM == 'java'
28
+ unless RUBY_ENGINE == 'jruby'
29
29
 
30
30
  example do
31
31
  ENV.clear
@@ -3,7 +3,7 @@ require 'nuggets/object/singleton_class'
3
3
  describe_extended Object, Nuggets::Object::SingletonClassMixin do
4
4
 
5
5
  objects = [Class, Object.new, Class.new, 's', [1, 2], { :a => 'b' }]
6
- objects.unshift(Object) unless RUBY_PLATFORM == 'java' || RUBY_ENGINE == 'rbx'
6
+ objects.unshift(Object) unless %w[jruby rbx].include?(RUBY_ENGINE)
7
7
 
8
8
  objects.each { |o|
9
9
  example { o.should_not be_a_singleton_class }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nuggets
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jens Wille
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-26 00:00:00.000000000 Z
11
+ date: 2015-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mime-types
@@ -47,7 +47,7 @@ dependencies:
47
47
  version: '0.8'
48
48
  - - ">="
49
49
  - !ruby/object:Gem::Version
50
- version: 0.8.0
50
+ version: 0.8.1
51
51
  type: :development
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
@@ -57,7 +57,7 @@ dependencies:
57
57
  version: '0.8'
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
- version: 0.8.0
60
+ version: 0.8.1
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rake
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -152,6 +152,7 @@ files:
152
152
  - lib/nuggets/dotted_decimal.rb
153
153
  - lib/nuggets/enumerable/agrep.rb
154
154
  - lib/nuggets/enumerable/all_any_extended.rb
155
+ - lib/nuggets/enumerable/all_any_extended_mixin.rb
155
156
  - lib/nuggets/enumerable/minmax.rb
156
157
  - lib/nuggets/env/set.rb
157
158
  - lib/nuggets/env/set_mixin.rb
@@ -172,6 +173,8 @@ files:
172
173
  - lib/nuggets/hash/deep_fetch_mixin.rb
173
174
  - lib/nuggets/hash/deep_merge.rb
174
175
  - lib/nuggets/hash/deep_merge_mixin.rb
176
+ - lib/nuggets/hash/deproc.rb
177
+ - lib/nuggets/hash/deproc_mixin.rb
175
178
  - lib/nuggets/hash/idmap.rb
176
179
  - lib/nuggets/hash/idmap_mixin.rb
177
180
  - lib/nuggets/hash/in_order.rb
@@ -210,6 +213,7 @@ files:
210
213
  - lib/nuggets/module/lazy_attr_mixin.rb
211
214
  - lib/nuggets/module/query_attr.rb
212
215
  - lib/nuggets/module/query_attr_mixin.rb
216
+ - lib/nuggets/net/ssh.rb
213
217
  - lib/nuggets/net/success.rb
214
218
  - lib/nuggets/numeric/between.rb
215
219
  - lib/nuggets/numeric/duration.rb
@@ -241,6 +245,7 @@ files:
241
245
  - lib/nuggets/range/quantile.rb
242
246
  - lib/nuggets/range/quantile_mixin.rb
243
247
  - lib/nuggets/ruby.rb
248
+ - lib/nuggets/ruby_mixin.rb
244
249
  - lib/nuggets/statistics.rb
245
250
  - lib/nuggets/statistics_mixins.rb
246
251
  - lib/nuggets/string/camelscore.rb
@@ -344,17 +349,15 @@ licenses:
344
349
  metadata: {}
345
350
  post_install_message: |2+
346
351
 
347
- nuggets-1.1.0 [2014-11-26]:
352
+ nuggets-1.2.0 [2015-03-13]:
348
353
 
349
- * Nuggets::LogParser::Rails no longer <tt>eval</tt>s the params hash; set the
350
- environment variable +NUGGETS_LOG_PARSER_RAILS_EVAL_PARAMS+ to restore this
351
- behaviour.
352
- * Added Object#rescue_if and Object#rescue_unless.
353
- * Added JRuby variant of Process.ruby.
354
+ * Extracted Nuggets::RubyMixin from Nuggets::Ruby.
355
+ * Added Net::SSH::Connection::Session#exec_sudo.
356
+ * Added Hash.deproc.
354
357
 
355
358
  rdoc_options:
356
359
  - "--title"
357
- - nuggets Application documentation (v1.1.0)
360
+ - nuggets Application documentation (v1.2.0)
358
361
  - "--charset"
359
362
  - UTF-8
360
363
  - "--line-numbers"
@@ -375,7 +378,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
375
378
  version: '0'
376
379
  requirements: []
377
380
  rubyforge_project:
378
- rubygems_version: 2.4.4
381
+ rubygems_version: 2.4.6
379
382
  signing_key:
380
383
  specification_version: 4
381
384
  summary: Extending Ruby.