nuggets 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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.