mario 0.0.5 → 0.0.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/.gitignore CHANGED
@@ -22,4 +22,7 @@ pkg
22
22
  vendor
23
23
  Gemfile
24
24
  Gemfile.lock
25
- .bundle
25
+ .bundle
26
+ *.gem
27
+ doc
28
+ .yardoc
@@ -1,16 +1,14 @@
1
1
  = mario
2
2
 
3
- Description goes here.
3
+ Mario provides some very simple tools for figuring out which platform you're on and, depending on your needs, some for helping you adapt.
4
4
 
5
5
  == Note on Patches/Pull Requests
6
-
6
+
7
7
  * Fork the project.
8
+ * `bundle install`
9
+ * `bundle lock`
10
+ * `rake test`
8
11
  * Make your feature addition or bug fix.
9
- * Add tests for it. This is important so I don't break it in a
10
- future version unintentionally.
11
- * Commit, do not mess with rakefile, version, or history.
12
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
- * Send me a pull request. Bonus points for topic branches.
14
12
 
15
13
  == Copyright
16
14
 
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.6
@@ -2,5 +2,5 @@
2
2
  require 'rbconfig'
3
3
  require 'logger'
4
4
  lib = File.dirname(__FILE__)
5
- %w{ mario/platform mario/toolbelt }.each { |file| require File.expand_path(file, lib) }
5
+ %w{ mario/hats/nix mario/hats/windows mario/platform }.each { |file| require File.expand_path(file, lib) }
6
6
 
@@ -0,0 +1,18 @@
1
+ # Posix?
2
+ module Mario
3
+ module Hats
4
+ module Nix
5
+
6
+ # Escapes paths for use in execute statements
7
+ #
8
+ # @param [String]
9
+ # @return [String]
10
+ def shell_escape_path(str)
11
+ # Taken from ruby mailing list, seems to work, probably needs lots of testing :(
12
+ str.to_s.gsub(/(?=[^a-zA-Z0-9_.\/\-\x7F-\xFF\n])/n, '\\').
13
+ gsub(/\n/, "'\n'").
14
+ sub(/^$/, "''")
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Mario
2
+ module Hats
3
+ module Windows
4
+ # Escapes a file paths for use in system calls and execute statements
5
+ # @param [String]
6
+ # @return [String]
7
+ def shell_escape_path(str)
8
+ #Wrap windows paths with white space in quotes
9
+ str =~ /\s/ ? "\"#{str}\"" : str
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,91 +1,215 @@
1
1
  module Mario
2
2
  class Platform
3
3
  @@forced = nil
4
+ @@logger = nil
5
+ @@current = nil
4
6
 
5
7
  class << self
8
+
9
+ # A list of unix like operating system classes
10
+ #
11
+ # @return [Array[Class]]
6
12
  def nix_group
7
- { :cygwin => 'cygwin',
8
- :linux => 'linux',
9
- :osx => 'darwin',
10
- :solaris => 'solaris',
11
- :bsd => 'bsd'}
13
+ [Cygwin, Linux, BSD, Solaris, Darwin]
12
14
  end
13
15
 
16
+ # A list of windows operating system classes
17
+ #
18
+ # @return [Array[Class]]
14
19
  def windows_group
15
- { :winnt => 'mswin',
16
- :win7 => 'mingw' }
20
+ [Windows7, WindowsNT]
17
21
  end
18
22
 
23
+ # The union of the {nix_group} and {windows_group} operating system class sets
24
+ #
25
+ # @return [Array[Class]]
19
26
  def targets
20
- nix_group.merge(windows_group)
27
+ nix_group | windows_group
21
28
  end
22
29
 
30
+ # Checks if the current platform is linux
31
+ #
32
+ # @return [true, false]
23
33
  def linux?
24
- check_os :linux
34
+ check Linux
25
35
  end
26
36
 
27
- def osx?
28
- check_os :osx
37
+ # Checks if the current platform is osx
38
+ #
39
+ # @return [true, false]
40
+ def darwin?
41
+ check Darwin
29
42
  end
30
43
 
44
+ # Checks if the current platform is solaris
45
+ #
46
+ # @return [true, false]
31
47
  def solaris?
32
- check_os :solaris
48
+ check Solaris
33
49
  end
34
-
50
+
51
+ # Checks if the current platform is bsd
52
+ #
53
+ # @return [true, false]
35
54
  def bsd?
36
- check_os :bsd
55
+ check BSD
37
56
  end
38
57
 
58
+ # Checks if the current platform is cygwin
59
+ #
60
+ # @return [true, false]
39
61
  def cygwin?
40
- check_os :cygwin
62
+ check Cygwin
41
63
  end
42
64
 
43
- def win7?
44
- check_os :win7
65
+ # Checks if the current platform is windows 7
66
+ #
67
+ # @return [true, false]
68
+ def windows7?
69
+ check Windows7
45
70
  end
46
71
 
47
- def winnt?
48
- check_os :winnt
72
+ # Checks if the current platform is windows nt
73
+ #
74
+ # @return [true, false]
75
+ def windowsnt?
76
+ check WindowsNT
49
77
  end
50
78
 
79
+ # Checks if the current platform is part of the {nix_group} and returns that class
80
+ #
81
+ # @return [Class]
51
82
  def nix?
52
83
  check_group nix_group
53
84
  end
54
85
 
86
+ # Checks if the current platform is part of the {windows_group} and returns that class
87
+ #
88
+ # @return [Class]
55
89
  def windows?
56
90
  check_group windows_group
57
91
  end
58
92
 
93
+ # Checks a list of possible operating system classes to see if their target os strings match the {target_os} value
94
+ #
95
+ # @return [Class]
59
96
  def check_group(group)
60
- group.each do |key, value|
61
- return true if check_os key
97
+ group.each do |klass|
98
+ return klass if check klass
62
99
  end
63
100
  false
64
101
  end
65
102
 
66
- alias_method :darwin?, :osx?
103
+ alias_method :osx?, :darwin?
67
104
 
68
- def os
69
- @@forced || Config::CONFIG['target_os']
105
+ # Uses the forced class target os string if provided otherwise uses the target_os rbconfig hash element
106
+ #
107
+ # @return [String]
108
+ def target_os
109
+ @@forced ? @@forced.target : Config::CONFIG['target_os']
70
110
  end
71
111
 
72
- def check_os(key)
73
- os.downcase.include?(targets[key])
112
+ # Checks an os class against {target_os}
113
+ #
114
+ # @return [true, false]
115
+ def check(klass)
116
+ target_os.downcase.include?(klass.target)
74
117
  end
75
118
 
76
- def forced=(val)
77
- logger.warn("Mario::Platform.os will now report as #{val}")
78
- @@forced=val
119
+ # Allows the user to force Mario to report the operating system as one of the provided operatin system classes
120
+ #
121
+ def forced=(klass)
122
+ @@current=nil
123
+ @@forced=klass
124
+ logger.warn(<<-msg)
125
+ Mario::Platform.target_os will now report as '#{target_os}' and #{klass} will be used for all functionality including operating system checks and hat based functionality (See Mario::Hats for more information)
126
+ msg
79
127
  end
80
128
 
129
+ # Returns the value of the currently forced operating system class if any
130
+ #
131
+ # @return [Class]
81
132
  def forced
82
133
  @@forced
83
134
  end
84
135
 
136
+ # Allows the setting of a logging mechanism, defaults to STDOUT
137
+ #
138
+ # @return [Logger]
85
139
  def logger(out=STDOUT)
86
- @@logger ||= Logger.new(STDOUT)
140
+ @@logger ||= Logger.new(out)
87
141
  @@logger
88
142
  end
143
+
144
+ # Returns an instance of the current operating system class as determined by {check_group} against all operating
145
+ # system classes provided by {targets}
146
+ #
147
+ # @return [OperatingSystem]
148
+ def current
149
+ # Search for the current target os
150
+ current_target_klass = check_group(targets)
151
+ @@current ||= current_target_klass.new
152
+ @@current
153
+ end
154
+ end
155
+
156
+ # Any additional fucniontality and they should be moved to a lib/platforms/<OS>.rb
157
+ class Cygwin
158
+ include Hats::Nix
159
+
160
+ def self.target
161
+ 'cygwin'
162
+ end
163
+
164
+ end
165
+
166
+ class Darwin
167
+ include Hats::Nix
168
+
169
+ def self.target
170
+ 'darwin'
171
+ end
172
+ end
173
+
174
+ class Linux
175
+ include Hats::Nix
176
+
177
+ def self.target
178
+ 'linux'
179
+ end
180
+ end
181
+
182
+ class BSD
183
+ include Hats::Nix
184
+
185
+ def self.target
186
+ 'bsd'
187
+ end
188
+ end
189
+
190
+ class Solaris
191
+ include Hats::Nix
192
+
193
+ def self.target
194
+ 'solaris'
195
+ end
196
+ end
197
+
198
+
199
+ class Windows7
200
+ include Hats::Windows
201
+
202
+ def self.target
203
+ 'mingw'
204
+ end
205
+ end
206
+
207
+ class WindowsNT
208
+ include Hats::Windows
209
+
210
+ def self.target
211
+ 'mswin'
212
+ end
89
213
  end
90
214
  end
91
215
  end
@@ -0,0 +1,64 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{mario}
8
+ s.version = "0.0.6"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["John Bender"]
12
+ s.date = %q{2010-03-20}
13
+ s.description = %q{Mario is a collection of utilities for dealing with platform specific issues}
14
+ s.email = %q{john.m.bender@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/mario.rb",
27
+ "lib/mario/hats/nix.rb",
28
+ "lib/mario/hats/windows.rb",
29
+ "lib/mario/platform.rb",
30
+ "mario.gemspec",
31
+ "test/helper.rb",
32
+ "test/mario/hats/test_nix.rb",
33
+ "test/mario/hats/test_windows.rb",
34
+ "test/mario/test_plaform.rb"
35
+ ]
36
+ s.homepage = %q{http://github.com/johnbender/mario}
37
+ s.rdoc_options = ["--charset=UTF-8"]
38
+ s.require_paths = ["lib"]
39
+ s.rubygems_version = %q{1.3.5}
40
+ s.summary = %q{Mario is a collection of utilities for dealing with platform specific issues}
41
+ s.test_files = [
42
+ "test/helper.rb",
43
+ "test/mario/hats/test_nix.rb",
44
+ "test/mario/hats/test_windows.rb",
45
+ "test/mario/test_plaform.rb"
46
+ ]
47
+
48
+ if s.respond_to? :specification_version then
49
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
50
+ s.specification_version = 3
51
+
52
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
53
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
54
+ s.add_development_dependency(%q<mocha>, [">= 0"])
55
+ else
56
+ s.add_dependency(%q<shoulda>, [">= 0"])
57
+ s.add_dependency(%q<mocha>, [">= 0"])
58
+ end
59
+ else
60
+ s.add_dependency(%q<shoulda>, [">= 0"])
61
+ s.add_dependency(%q<mocha>, [">= 0"])
62
+ end
63
+ end
64
+
@@ -0,0 +1,15 @@
1
+ require 'helper'
2
+
3
+ class TestNixHat < Test::Unit::TestCase
4
+ context "Mario's Nix Hat" do
5
+ setup do
6
+ Mario::Platform.forced = Mario::Platform::Linux
7
+ end
8
+
9
+ should "escape weird characters in paths meant for a shell command " do
10
+ %w( $ @ % ^ & * ).each do |char|
11
+ assert Mario::Platform.current.shell_escape_path(char).include?('\\')
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,18 @@
1
+ require 'helper'
2
+
3
+ class TestWindowsHat < Test::Unit::TestCase
4
+ context "Mario's windows hat" do
5
+ setup do
6
+ Mario::Platform.forced = Mario::Platform::Windows7
7
+ end
8
+
9
+ should "wrap file paths with white space in double quotes" do
10
+ result = Mario::Platform.current.shell_escape_path(' something serious ')
11
+ assert result =~ /^".+"$/
12
+ end
13
+
14
+ should "not have spaces escaped" do
15
+ assert !Mario::Platform.current.shell_escape_path( 'a b' ).include?('\\')
16
+ end
17
+ end
18
+ end
@@ -1,53 +1,64 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestPlatform < Test::Unit::TestCase
4
- context "Mario's jumping platforms" do
5
-
4
+ context "Mario platforms" do
5
+ context 'on any platform' do
6
+ setup do
7
+ Mario::Platform.forced = nil
8
+ end
9
+
10
+ should "find at least one os representing a class" do
11
+ assert Mario::Platform.check_group(Mario::Platform.targets)
12
+ end
13
+ end
14
+
6
15
  context 'when testing for *nix' do
7
16
  should 'return true for all known variants' do
8
- Mario::Platform::nix_group.each do |key, value|
9
- assert check_nix(key)
17
+ Mario::Platform::nix_group.each do |klass|
18
+ assert check_nix(klass)
10
19
  end
11
20
  end
12
21
 
13
22
  should 'return false for all other' do
14
23
  # TODO use relative complement of nix_group in targets
15
- Mario::Platform::windows_group.each do |key, value|
16
- assert !check_nix(key)
24
+ Mario::Platform::windows_group.each do |klass|
25
+ assert !check_nix(klass)
17
26
  end
18
27
  end
19
28
  end
20
29
 
21
30
  context 'when testing for windows' do
22
- should 'only return true for all known variants' do
23
- Mario::Platform.windows_group.each do |key, value|
24
- assert check_win(key)
31
+ should 'return true for all known variants' do
32
+ Mario::Platform.windows_group.each do |klass|
33
+ assert check_win(klass)
25
34
  end
26
35
  end
27
36
 
28
37
  should 'return false for others' do
29
38
  # TODO use relative complement of windows_group in targets
30
- Mario::Platform.nix_group.each do |key, value|
31
- assert !check_win(key)
39
+ Mario::Platform.nix_group.each do |klass|
40
+ assert !check_win(klass)
32
41
  end
33
42
  end
34
43
  end
35
44
 
36
45
  context 'when checking any os with abnormal target strings' do
37
46
  should 'handle extranious characters' do
38
- assert check_nix('12%&linux%#$')
47
+ Mario::Platform.expects(:target_os).twice.returns("12%#{first_os_klass.target}&%$")
48
+ assert check_nix first_os_klass
39
49
  end
40
50
 
41
51
  should 'handle capitals' do
42
- assert check_nix('LINUX')
52
+ Mario::Platform.expects(:target_os).twice.returns(first_os_klass.target.upcase)
53
+ assert check_nix first_os_klass
43
54
  end
44
55
  end
45
56
 
46
57
  context 'when checking an os' do
47
58
  should 'respond positively to each os listed in targets' do
48
- Mario::Platform.targets.each do |key, value|
49
- Mario::Platform.forced = value
50
- assert Mario::Platform.send(key.to_s + '?')
59
+ Mario::Platform.targets.each do |klass|
60
+ Mario::Platform.forced = klass
61
+ assert Mario::Platform.send(klass.to_s.split('::').last.downcase + '?')
51
62
  end
52
63
  end
53
64
  end
@@ -56,19 +67,58 @@ class TestPlatform < Test::Unit::TestCase
56
67
  should 'log at a warning level' do
57
68
  logger = mock('logger')
58
69
  Mario::Platform.expects(:logger).returns(logger)
59
- logger.expects(:warn).with { |string| string =~ /foo/ }
60
- Mario::Platform.forced = 'foo'
70
+ logger.expects(:warn).with do |string|
71
+ string =~ /#{first_os_klass.target}/ && string =~ /#{first_os_klass}/
72
+ end
73
+ Mario::Platform.forced = first_os_klass
74
+ end
75
+
76
+ should 'reset the current os' do
77
+ mock_klass = mock('platform klass')
78
+ Mario::Platform.forced = first_os_klass
79
+ Mario::Platform.expects(:check_group).with(Mario::Platform.targets).returns(mock_klass)
80
+ mock_klass.expects(:new).returns(nil)
81
+ assert !Mario::Platform.current
82
+ end
83
+ end
84
+
85
+ context 'checking a group' do
86
+ setup do
87
+ @forced = mock_os_klass('force')
88
+ Mario::Platform.forced = @forced
89
+ end
90
+
91
+ should "return the os class itself when found" do
92
+ assert Mario::Platform.check_group([mock_os_klass, @forced, mock_os_klass]) == @forced
93
+ end
94
+
95
+ should "return once if one is found in a group of classes that respond to target" do
96
+ assert Mario::Platform.check_group([mock_os_klass, @forced, mock_os_klass])
97
+ end
98
+
99
+ should "return not return one if non are found" do
100
+ assert !Mario::Platform.check_group([mock_os_klass, mock_os_klass])
61
101
  end
62
102
  end
63
103
  end
64
104
 
65
105
  def check_nix(force)
66
- Mario::Platform.forced = Mario::Platform.targets[force]
106
+ Mario::Platform.forced = force
67
107
  Mario::Platform.nix?
68
108
  end
69
109
 
70
110
  def check_win(force)
71
- Mario::Platform.forced = Mario::Platform::targets[force]
111
+ Mario::Platform.forced = force
72
112
  Mario::Platform.windows?
73
113
  end
114
+
115
+ def first_os_klass
116
+ Mario::Platform.targets.first
117
+ end
118
+
119
+ def mock_os_klass(str='foo')
120
+ mock = mock('os klass')
121
+ mock.stubs(:target).returns(str)
122
+ mock
123
+ end
74
124
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mario
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Bender
@@ -47,12 +47,16 @@ files:
47
47
  - LICENSE
48
48
  - README.rdoc
49
49
  - Rakefile
50
+ - VERSION
50
51
  - lib/mario.rb
52
+ - lib/mario/hats/nix.rb
53
+ - lib/mario/hats/windows.rb
51
54
  - lib/mario/platform.rb
52
- - lib/mario/toolbelt.rb
55
+ - mario.gemspec
53
56
  - test/helper.rb
57
+ - test/mario/hats/test_nix.rb
58
+ - test/mario/hats/test_windows.rb
54
59
  - test/mario/test_plaform.rb
55
- - test/mario/test_toolbelt.rb
56
60
  has_rdoc: true
57
61
  homepage: http://github.com/johnbender/mario
58
62
  licenses: []
@@ -83,5 +87,6 @@ specification_version: 3
83
87
  summary: Mario is a collection of utilities for dealing with platform specific issues
84
88
  test_files:
85
89
  - test/helper.rb
90
+ - test/mario/hats/test_nix.rb
91
+ - test/mario/hats/test_windows.rb
86
92
  - test/mario/test_plaform.rb
87
- - test/mario/test_toolbelt.rb
@@ -1,24 +0,0 @@
1
- module Mario
2
- class Toolbelt
3
- class << self
4
-
5
- # Stolen shamelessly from Mitchell Hashimoto's Virtualbox gem!
6
- # TODO more research
7
- def shell_escape_path(str)
8
- if Platform.windows?
9
- #Wrap windows paths with white space in quotes
10
- str = "\"#{str}\"" if str =~ /\s/
11
- return str
12
- end
13
-
14
- str.to_s.gsub(/(?=[^a-zA-Z0-9_.\/\-\x7F-\xFF\n])/n, '\\').
15
- gsub(/\n/, "'\n'").
16
- sub(/^$/, "''")
17
- end
18
-
19
- # Mario would just jumpt to escape a shell's path
20
- alias_method :jump, :shell_escape_path
21
-
22
- end
23
- end
24
- end
@@ -1,25 +0,0 @@
1
- require 'helper'
2
-
3
- class TestPlatform < Test::Unit::TestCase
4
- context "Mario's toolbelt" do
5
- context "on all platforms" do
6
- should "escape weird characters in paths meant for a shell command " do
7
- %w( $ @ % ^ & * ).each do |char|
8
- assert Mario::Toolbelt.shell_escape_path(char).include?('\\')
9
- end
10
- end
11
- end
12
-
13
- context "on windows" do
14
- setup do
15
- Mario::Platform.forced = Mario::Platform.targets[:win7]
16
- end
17
-
18
- should "wrap file paths with white space in double quotes" do
19
- result = Mario::Toolbelt.shell_escape_path(' something serious ')
20
- assert result =~ /^"/
21
- assert result =~ /"$/
22
- end
23
- end
24
- end
25
- end