dionysus 1.0.2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +16 -9
- data/README.md +31 -34
- data/Rakefile +16 -79
- data/description.md +1 -0
- data/lib/dionysus.rb +3 -22
- data/lib/dionysus/configuration_callbacks.rb +93 -0
- data/lib/dionysus/redcarpet/includes.rb +41 -0
- data/lib/dionysus/string/version_match.rb +8 -0
- data/lib/dionysus/travisci/gemfile_generator.rb +67 -0
- data/lib/dionysus/version.rb +3 -0
- data/spec/lib/dionysus_spec.rb +18 -0
- data/spec/lib/string/version_match_spec.rb +17 -0
- data/spec/spec_helper.rb +17 -6
- metadata +54 -307
- data/.document +0 -5
- data/.gitignore +0 -22
- data/.rspec +0 -1
- data/Gemfile.lock +0 -41
- data/VERSION +0 -1
- data/dionysus.gemspec +0 -121
- data/lib/dionysus/configuration.rb +0 -200
- data/lib/dionysus/digest.rb +0 -135
- data/lib/dionysus/rdoc/markdown.rb +0 -64
- data/lib/dionysus/rdoc/no_markup.rb +0 -56
- data/lib/dionysus/security.rb +0 -3
- data/lib/dionysus/security/password_salt.rb +0 -138
- data/lib/dionysus/security/string.rb +0 -126
- data/lib/dionysus/string.rb +0 -48
- data/lib/dionysus/version_string.rb +0 -96
- data/spec/configuration_spec.rb +0 -176
- data/spec/digest_spec.rb +0 -183
- data/spec/dionysus_spec.rb +0 -8
- data/spec/password_salt_spec.rb +0 -169
- data/spec/string_security_spec.rb +0 -204
- data/spec/string_spec.rb +0 -46
- data/spec/version_string_spec.rb +0 -83
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'active_support/concern'
|
2
|
-
begin
|
3
|
-
Markdown
|
4
|
-
rescue NameError
|
5
|
-
require 'rdiscount'
|
6
|
-
end
|
7
|
-
|
8
|
-
module RDoc # :nodoc:
|
9
|
-
##
|
10
|
-
# Extend RDoc to support Markdown files. It will automatically use Markdown
|
11
|
-
# for any files with the `.md` or `.markdown` extension. You may also specify
|
12
|
-
# files with `RDoc::Markdown.files`
|
13
|
-
#
|
14
|
-
# After RDoc is loaded:
|
15
|
-
#
|
16
|
-
# require 'dionysus/rdoc/markdown'
|
17
|
-
# RDoc::Markdown.files.include('README')
|
18
|
-
module Markdown
|
19
|
-
FILE_NAMES = Rake::FileList.new
|
20
|
-
|
21
|
-
def self.files() FILE_NAMES; end
|
22
|
-
|
23
|
-
def self.markdown_for_file?(file_name)
|
24
|
-
%w(.md .markdown).include?(File.extname(file_name)) or
|
25
|
-
self.files.resolve.to_a.include?(file_name)
|
26
|
-
end
|
27
|
-
|
28
|
-
module Parser # :nodoc:
|
29
|
-
extend ActiveSupport::Concern
|
30
|
-
|
31
|
-
included do
|
32
|
-
class << self
|
33
|
-
alias_method :can_parse_without_markdown, :can_parse
|
34
|
-
alias_method :can_parse, :can_parse_with_markdown
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
module ClassMethods # :nodoc:
|
39
|
-
def can_parse_with_markdown(file_name)
|
40
|
-
result = can_parse_without_markdown(file_name)
|
41
|
-
if result.nil? and Markdown.markdown_for_file?(file_name)
|
42
|
-
::RDoc::Parser::Simple
|
43
|
-
else
|
44
|
-
result
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
module TopLevel # :nodoc:
|
51
|
-
extend ActiveSupport::Concern
|
52
|
-
|
53
|
-
module InstanceMethods # :nodoc:
|
54
|
-
def description
|
55
|
-
return super unless Markdown.markdown_for_file?(full_name)
|
56
|
-
::Markdown.new(File.read(::RDoc::RDoc.current.generator.basedir + full_name)).to_html
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
RDoc::TopLevel.send(:include, RDoc::Markdown::TopLevel)
|
64
|
-
RDoc::Parser.send(:include, RDoc::Markdown::Parser)
|
@@ -1,56 +0,0 @@
|
|
1
|
-
require 'active_support/concern'
|
2
|
-
|
3
|
-
module RDoc # :nodoc:
|
4
|
-
##
|
5
|
-
# Extend RDoc to support plaintext files that will be displayed inside a <pre> block.
|
6
|
-
#
|
7
|
-
# After RDoc is loaded:
|
8
|
-
#
|
9
|
-
# require 'dionysus/rdoc/no_markup'
|
10
|
-
# RDoc::NoMarkup.files.include('LICENSE','VERSION')
|
11
|
-
module NoMarkup
|
12
|
-
FILE_NAMES = Rake::FileList.new
|
13
|
-
|
14
|
-
def self.files() FILE_NAMES; end
|
15
|
-
|
16
|
-
def self.no_markup_for_file?(file_name)
|
17
|
-
self.files.resolve.to_a.include?(file_name)
|
18
|
-
end
|
19
|
-
|
20
|
-
module Parser # :nodoc:
|
21
|
-
extend ActiveSupport::Concern
|
22
|
-
|
23
|
-
included do
|
24
|
-
class << self
|
25
|
-
alias_method :can_parse_with_markup, :can_parse
|
26
|
-
alias_method :can_parse, :can_parse_without_markup
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
module ClassMethods # :nodoc:
|
31
|
-
def can_parse_without_markup(file_name)
|
32
|
-
if NoMarkup.no_markup_for_file?(file_name)
|
33
|
-
::RDoc::Parser::Simple
|
34
|
-
else
|
35
|
-
can_parse_with_markup(file_name)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
module TopLevel # :nodoc:
|
42
|
-
extend ActiveSupport::Concern
|
43
|
-
|
44
|
-
module InstanceMethods # :nodoc:
|
45
|
-
def description
|
46
|
-
return super unless NoMarkup.no_markup_for_file?(full_name)
|
47
|
-
txt = File.read(::RDoc::RDoc.current.generator.basedir + full_name)
|
48
|
-
%(<pre>#{txt}</pre>)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
RDoc::TopLevel.send(:include, RDoc::NoMarkup::TopLevel)
|
56
|
-
RDoc::Parser.send(:include, RDoc::NoMarkup::Parser)
|
data/lib/dionysus/security.rb
DELETED
@@ -1,138 +0,0 @@
|
|
1
|
-
require 'dionysus'
|
2
|
-
require 'active_support/secure_random'
|
3
|
-
|
4
|
-
##
|
5
|
-
# Encapsulates a password salt. This is usually not required specifically,
|
6
|
-
# instead it's required as a part of the security module:
|
7
|
-
#
|
8
|
-
# require 'dionysus/security'
|
9
|
-
#
|
10
|
-
# However, you may require it specifically:
|
11
|
-
#
|
12
|
-
# require 'dionysus/security/password_salt'
|
13
|
-
#
|
14
|
-
# Examples
|
15
|
-
#
|
16
|
-
# salt = PasswordSalt.new
|
17
|
-
# #=> generates random salt of 8 characters
|
18
|
-
# salt.salt_password('foobar') #=> 'foobar0PD0oKAj'
|
19
|
-
#
|
20
|
-
# salt = PasswordSalt.new(:length => 20)
|
21
|
-
# #=> generates random salt of 20 characters
|
22
|
-
# salt.salt_password('foobar') #=> 'foobar7qvFpfi+3jGVFaA5TaE7'
|
23
|
-
#
|
24
|
-
# salt = PasswordSalt.new('ABCDEFG', :beginning)
|
25
|
-
# #=> generates salt 'abcdef' with beginning placement
|
26
|
-
# salt.salt_password('foobar')
|
27
|
-
# #=> 'ABCDEFGfoobar'
|
28
|
-
#
|
29
|
-
# salt = PasswordSalt.new(:split, :length => 10)
|
30
|
-
# #=> generates random salt of 10 characters with split placement
|
31
|
-
# salt.salt_password('foobar')
|
32
|
-
# #=> 'WyVjpfoobarjGYXJ'
|
33
|
-
class PasswordSalt
|
34
|
-
PLACEMENTS = [:before, :after, :split]
|
35
|
-
DEFAULT_LENGTH = 8
|
36
|
-
DEFAULT_PLACEMENT = :after
|
37
|
-
|
38
|
-
@@secure_random = SecureRandom
|
39
|
-
cattr_accessor :secure_random
|
40
|
-
|
41
|
-
attr_accessor :string
|
42
|
-
attr_reader :placement
|
43
|
-
|
44
|
-
##
|
45
|
-
# Generate a salt string of the given length (Default: 8) with the base64
|
46
|
-
# character set. Optionally, you may pass the format as <tt>:binary</tt> to generate
|
47
|
-
# a binary salt.
|
48
|
-
def self.generate( length = DEFAULT_LENGTH, format = :base64 )
|
49
|
-
if length < 0
|
50
|
-
raise ArgumentError, "Invalid length: #{length}"
|
51
|
-
end
|
52
|
-
|
53
|
-
case format.to_sym
|
54
|
-
when :base64
|
55
|
-
self.secure_random.base64(length)[0...length]
|
56
|
-
when :binary
|
57
|
-
self.secure_random.random_bytes(length)
|
58
|
-
else
|
59
|
-
raise ArgumentError, "Invalid format: #{format}"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
##
|
64
|
-
# Initialize a new PasswordSalt
|
65
|
-
#
|
66
|
-
# If you pass the first argument as a string, the string will be set as
|
67
|
-
# the salt:
|
68
|
-
# PasswordSalt.new('ABCDEFG')
|
69
|
-
#
|
70
|
-
# If the first argument is <tt>:new</tt> or is an option hash, a random salt
|
71
|
-
# will be generated:
|
72
|
-
# PasswordSalt.new(:new)
|
73
|
-
# PasswordSalt.new(:length => 20)
|
74
|
-
# PasswordSalt.new
|
75
|
-
#
|
76
|
-
# If the first or second argument is a Symbol (other than <tt>:new</tt>), it
|
77
|
-
# will be interpreted as the placement:
|
78
|
-
# PasswordSalt.new(:before)
|
79
|
-
# PasswordSalt.new(:new, :before)
|
80
|
-
# PasswordSalt.new('ABCDEFG', :before)
|
81
|
-
#
|
82
|
-
# You may always pass in an options hash as the last argument.
|
83
|
-
# [length] Length of salt to be generated.
|
84
|
-
# Default: 8
|
85
|
-
def initialize( *args )
|
86
|
-
options = args.extract_options!
|
87
|
-
|
88
|
-
self.string = args.detect { |val| val.is_a?(String) or val == :new }
|
89
|
-
self.placement = args.detect { |val| PLACEMENTS.include?(val) } || DEFAULT_PLACEMENT
|
90
|
-
|
91
|
-
if self.string == :new or self.string.nil?
|
92
|
-
self.string = self.class.generate(options[:length] || DEFAULT_LENGTH)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
##
|
97
|
-
# Returns the given password, but salted.
|
98
|
-
def salt_password( password )
|
99
|
-
case self.placement
|
100
|
-
when :after
|
101
|
-
password.to_s + string
|
102
|
-
when :before
|
103
|
-
string + password.to_s
|
104
|
-
when :split
|
105
|
-
string[0...(string.length/2).floor] +
|
106
|
-
password.to_s +
|
107
|
-
string[(string.length/2).floor...string.length]
|
108
|
-
else
|
109
|
-
raise "Invalid salt placement: #{self.placement}"
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
##
|
114
|
-
# Set the salt's placement
|
115
|
-
#
|
116
|
-
# [after] Place the salt after the password.
|
117
|
-
# [before] Place the salt before the password.
|
118
|
-
# [split] Place half of the salt before and half after the password. For
|
119
|
-
# salts of odd length, the shorter half will be in front.
|
120
|
-
def placement=( sym )
|
121
|
-
unless PLACEMENTS.include?(sym.to_sym)
|
122
|
-
raise ArgumentError, "Invalid salt placement: #{sym}"
|
123
|
-
end
|
124
|
-
@placement = sym.to_sym
|
125
|
-
end
|
126
|
-
|
127
|
-
##
|
128
|
-
# Returns the salt string.
|
129
|
-
def to_s
|
130
|
-
self.string
|
131
|
-
end
|
132
|
-
|
133
|
-
##
|
134
|
-
# Returns +true+ if the given salt is equivilent to this salt, +false+ otherwise
|
135
|
-
def eql?( salt )
|
136
|
-
self.to_s.eql?(salt.to_s) && self.placement.eql?(salt.placement)
|
137
|
-
end
|
138
|
-
end
|
@@ -1,126 +0,0 @@
|
|
1
|
-
require 'dionysus'
|
2
|
-
require 'dionysus/digest'
|
3
|
-
require 'dionysus/string'
|
4
|
-
require 'dionysus/security/password_salt'
|
5
|
-
require 'dionysus/version_string'
|
6
|
-
|
7
|
-
##
|
8
|
-
# Adds String hashing and salting convenience methods.
|
9
|
-
#
|
10
|
-
# require 'dionysus/security/string'
|
11
|
-
#
|
12
|
-
# The hash methods may be accessed by the <tt>digest</tt> method or by the
|
13
|
-
# dynamic convenience methods.
|
14
|
-
#
|
15
|
-
# Examples:
|
16
|
-
#
|
17
|
-
# 'my password'.digest(:sha1)
|
18
|
-
# 'my password'.sha1
|
19
|
-
class String
|
20
|
-
##
|
21
|
-
# Generate a random, binary salt with the given length (default 16)
|
22
|
-
def self.salt( length = 16 )
|
23
|
-
PasswordSalt.generate(length, :binary).to_s
|
24
|
-
end
|
25
|
-
|
26
|
-
##
|
27
|
-
# Sanitize the String from memory. This is non-reversible. Runs 7 passes
|
28
|
-
# by default.
|
29
|
-
#
|
30
|
-
# NOTE: In Ruby 1.9, this uses the String#setbyte(index, int) method. In Ruby < 1.9, this
|
31
|
-
# uses String#[]=(int)
|
32
|
-
#
|
33
|
-
def sanitize( passes = 7 )
|
34
|
-
if RUBY_VERSION.satisfies?('< 1.9')
|
35
|
-
passes.times do
|
36
|
-
(0...self.length).each { |i| self[i] = rand(256) }
|
37
|
-
end
|
38
|
-
(0...self.length).each { |i| self[i] = 0 }
|
39
|
-
self.delete!("\000")
|
40
|
-
elsif RUBY_VERSION.satisfies?('>= 1.9')
|
41
|
-
passes.times do
|
42
|
-
(0...self.length).each { |i| self.setbyte(i, rand(256)) }
|
43
|
-
end
|
44
|
-
(0...self.length).each { |i| self.setbyte(i, 0) }
|
45
|
-
self.clear
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
##
|
50
|
-
# Generate the given digest hash.
|
51
|
-
#
|
52
|
-
# Options:
|
53
|
-
# [salt] Salt to append to the string. (This may be a String or a
|
54
|
-
# PasswordSalt object) Default: ''
|
55
|
-
# [encoding] Encoding for the hash: <tt>:binary</tt>, <tt>:hex</tt>,
|
56
|
-
# <tt>:hexidecimal</tt>, <tt>:base64</tt>
|
57
|
-
# Default: <tt>:base64</tt>
|
58
|
-
def digest( klass, options = {} )
|
59
|
-
digest = Digest.digest(klass, _salted(options[:salt]))
|
60
|
-
_encode(digest, options[:encoding] || :base64)
|
61
|
-
end
|
62
|
-
|
63
|
-
##
|
64
|
-
# Call the appropriate digest method.
|
65
|
-
def method_missing( method, *args )
|
66
|
-
super if block_given?
|
67
|
-
|
68
|
-
if Digest.available_digests.include?(method)
|
69
|
-
self.digest(method, *args)
|
70
|
-
else
|
71
|
-
super
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
##
|
76
|
-
# Detect the digest of the string. Returns nil if the digest cannot be
|
77
|
-
# determined.
|
78
|
-
#
|
79
|
-
# Example:
|
80
|
-
# "wxeCFXPVXePFcpwuFDjonyn1G/w=".detect_digest(:base64) #=> :sha1
|
81
|
-
# "foobar".detect_digest(:hex) #=> nil
|
82
|
-
def detect_digest( encoding )
|
83
|
-
Digest.detect_digest(self, encoding)
|
84
|
-
end
|
85
|
-
|
86
|
-
##
|
87
|
-
# Detect the digest of the string. Raises "Unknown digest" if the digest
|
88
|
-
# cannot be determined.
|
89
|
-
#
|
90
|
-
# Example:
|
91
|
-
# "wxeCFXPVXePFcpwuFDjonyn1G/w=".detect_digest!(:base64) #=> :sha1
|
92
|
-
# "foobar".detect_digest!(:hex) #=> RuntimeError
|
93
|
-
def detect_digest!( encoding )
|
94
|
-
Digest.detect_digest!(self, encoding)
|
95
|
-
end
|
96
|
-
|
97
|
-
private
|
98
|
-
|
99
|
-
##
|
100
|
-
# Salt the string by appending it to the end or utilizing the
|
101
|
-
# PasswordSalt's salt_password method
|
102
|
-
def _salted( salt )
|
103
|
-
return self if salt.blank?
|
104
|
-
|
105
|
-
unless salt.is_a?(PasswordSalt)
|
106
|
-
salt = PasswordSalt.new(salt)
|
107
|
-
end
|
108
|
-
|
109
|
-
salt.salt_password(self)
|
110
|
-
end
|
111
|
-
|
112
|
-
##
|
113
|
-
# Encode the value to the given encoding
|
114
|
-
def _encode( value, encoding )
|
115
|
-
case encoding
|
116
|
-
when :binary
|
117
|
-
value
|
118
|
-
when :base64
|
119
|
-
value.encode64s
|
120
|
-
when :hex, :hexidecimal
|
121
|
-
value.encode_hex
|
122
|
-
else
|
123
|
-
raise ArgumentError, "Invalid encoding: #{encoding}"
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
data/lib/dionysus/string.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'dionysus'
|
2
|
-
require 'active_support/base64'
|
3
|
-
|
4
|
-
##
|
5
|
-
# Adds string encoding convenience methods.
|
6
|
-
#
|
7
|
-
# require 'dionysus/string'
|
8
|
-
class String
|
9
|
-
HEX_REGEXP = /^[a-f0-9]+$/
|
10
|
-
BASE64_REGEXP = /^[A-Za-z0-9\+\/\=]+$/
|
11
|
-
ENCODING_BITS_PER_CHAR = {:binary => 8, :base64 => 6, :hex => 4, :hexidecimal => 4}
|
12
|
-
|
13
|
-
##
|
14
|
-
# Encode the Base64 (without newlines)
|
15
|
-
def encode64s() Base64.encode64s(self); end
|
16
|
-
|
17
|
-
##
|
18
|
-
# Encode to Base 64
|
19
|
-
def encode64() Base64.encode64(self); end
|
20
|
-
|
21
|
-
##
|
22
|
-
# Decode from Base 64
|
23
|
-
def decode64() Base64.decode64(self); end
|
24
|
-
|
25
|
-
##
|
26
|
-
# Encode to hexidecimal
|
27
|
-
def encode_hexidecimal() self.unpack('H*').first; end
|
28
|
-
alias_method :encode_hex, :encode_hexidecimal
|
29
|
-
|
30
|
-
##
|
31
|
-
# Decode from hexidecimal
|
32
|
-
def decode_hexidecimal() [self].pack('H*'); end
|
33
|
-
alias_method :decode_hex, :decode_hexidecimal
|
34
|
-
|
35
|
-
##
|
36
|
-
# Detect the encoding of the string
|
37
|
-
def detect_encoding
|
38
|
-
return nil if blank?
|
39
|
-
|
40
|
-
if match(HEX_REGEXP)
|
41
|
-
:hex
|
42
|
-
elsif match(BASE64_REGEXP)
|
43
|
-
:base64
|
44
|
-
else
|
45
|
-
:binary
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,96 +0,0 @@
|
|
1
|
-
require 'dionysus'
|
2
|
-
require 'active_support/core_ext/kernel/reporting'
|
3
|
-
require 'active_support/core_ext/module/delegation'
|
4
|
-
|
5
|
-
module Dionysus
|
6
|
-
##
|
7
|
-
# = VersonString
|
8
|
-
#
|
9
|
-
# require 'dionysus/version_string'
|
10
|
-
#
|
11
|
-
# VersionString is a proxy to Gem::Version that modifies the comparable
|
12
|
-
# interface on String to compare based on the Gem::Version comparator.
|
13
|
-
# It also adds a +satisfies?+ method to check for a Gem::Requirement.
|
14
|
-
#
|
15
|
-
# In addition, requiring VersionString changes the +RUBY_VERSION+ constant
|
16
|
-
# into a VersionString. Because VersionString "is a" String, there should be
|
17
|
-
# no ill-effects with this change since only the Comparable interface is
|
18
|
-
# overriden and this does not change the original operation of the == method.
|
19
|
-
#
|
20
|
-
# The comparator works by converting strings into Gem::Version objects, so
|
21
|
-
# this still works as you would expect:
|
22
|
-
#
|
23
|
-
# RUBY_VERSION < '1.9'
|
24
|
-
class VersionString < String
|
25
|
-
include Comparable
|
26
|
-
|
27
|
-
##
|
28
|
-
# Initializes a VersionString and freezes itself.
|
29
|
-
def initialize(*args)
|
30
|
-
super(*args)
|
31
|
-
to_rubygem_version
|
32
|
-
freeze
|
33
|
-
end
|
34
|
-
|
35
|
-
##
|
36
|
-
# Compares this VersionString to another String, VersionString, or
|
37
|
-
# Gem::Version.
|
38
|
-
#
|
39
|
-
# Examples:
|
40
|
-
#
|
41
|
-
# Dionysus::VersionString.new('1.0') > '1.0' => false
|
42
|
-
# Dionysus::VersionString.new('1.0') == Gem::Version('1.0') => true
|
43
|
-
# Dionysus::VersionString.new('1.0') <=> Dionysus::VersionString.new('1.0') => 0
|
44
|
-
#
|
45
|
-
# See http://rubygems.rubyforge.org/rubygems-update/Gem/Version.html
|
46
|
-
def <=>( obj )
|
47
|
-
obj = obj.dup
|
48
|
-
if obj.is_a?(String) or obj.is_a?(Gem::Version)
|
49
|
-
obj = Gem::Version.create(obj)
|
50
|
-
else
|
51
|
-
raise ArgumentError, "Can only compare to a Dionysus::VersionString/String or Gem::Version"
|
52
|
-
end
|
53
|
-
|
54
|
-
self.to_rubygem_version <=> obj
|
55
|
-
end
|
56
|
-
alias_method :"eql?", :"=="
|
57
|
-
|
58
|
-
##
|
59
|
-
# Determines if the given requirement String or Gem::Requirement is
|
60
|
-
# satisfied by this version.
|
61
|
-
#
|
62
|
-
# Examples:
|
63
|
-
#
|
64
|
-
# Dionysus::VersionString.new('1.6.7').satisfies? '~> 1.6.0' => true
|
65
|
-
# Dionysus::VersionString.new('1.6.7').satisfies? Gem::Requirement('< 1.6') => false
|
66
|
-
#
|
67
|
-
# See http://rubygems.rubyforge.org/rubygems-update/Gem/Requirement.html
|
68
|
-
def satisfies?( requirement )
|
69
|
-
requirement = requirement.dup
|
70
|
-
if requirement.is_a?(String) or requirement.is_a?(Gem::Requirement)
|
71
|
-
requirement = Gem::Requirement.create(requirement)
|
72
|
-
else
|
73
|
-
raise ArgumentError, "Can only compare to a String or Gem::Requirement"
|
74
|
-
end
|
75
|
-
|
76
|
-
requirement.satisfied_by?(to_rubygem_version)
|
77
|
-
end
|
78
|
-
|
79
|
-
##
|
80
|
-
# Converts this VersionString into a Gem::Version
|
81
|
-
def to_rubygem_version
|
82
|
-
@rubygem_version ||= Gem::Version.create(self)
|
83
|
-
end
|
84
|
-
alias_method :to_gem_version, :to_rubygem_version
|
85
|
-
|
86
|
-
##
|
87
|
-
# Indicates whether this VersionString is a prerelease.
|
88
|
-
#
|
89
|
-
# See http://rubygems.rubyforge.org/rubygems-update/Gem/Version.html#method-i-prerelease%3F
|
90
|
-
def prerelease?() to_rubygem_version.prerelease?; end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
silence_warnings do
|
95
|
-
RUBY_VERSION = Dionysus::VersionString.new(RUBY_VERSION)
|
96
|
-
end
|