dionysus 1.0.2 → 2.0.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.
- 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
|