to_pass 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ .*.swp
2
+ vendor/*.rb
3
+ doc/rdoc/*
4
+ tmp/*
5
+ pkg/*
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009-2010 Matthias Viehweger
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,48 @@
1
+ = to_pass
2
+
3
+ == Transformation of a String to a Password.
4
+
5
+ Passwords should be easy to remember and hard to guess. One technique is to
6
+ have a sentence which can be easily remembered transformed to a password.
7
+
8
+ This library encapsulates that and satisfies different usage scenarios.
9
+ Currently, only two algorithms are provided. But they are YAML-Files, so it's
10
+ extensible.
11
+
12
+ == Usage
13
+
14
+ === IRB
15
+
16
+ ToPass::Integration provides a to_pass Method which transforms a sentence to a
17
+ password.
18
+
19
+ irb> require 'lib/to_pass'
20
+ irb> String.send(:include, ToPass::Integration)
21
+ irb> "Da steht ein Pferd auf dem Flur".to_pass
22
+ # => "Ds1P@dF"
23
+
24
+ === CLI
25
+
26
+ $ to_pass "test" # => t35t
27
+ $ to_pass "there is one problem for us, too" -a basic_en # => ti1p4u2
28
+
29
+ === CLI with Pipes
30
+
31
+ This example is Mac OSX-centric, but you should get the point.
32
+
33
+ $ echo "test" | to_pass | pbcopy
34
+
35
+ == Note on Patches/Pull Requests
36
+
37
+ * Fork the project.
38
+ * Make your feature addition or bug fix.
39
+ * Add tests for it. This is important so I don't break it in a
40
+ future version unintentionally.
41
+ * Commit, do not mess with rakefile, version, or history.
42
+ (if you want to have your own version, that is fine but bump version in a
43
+ commit by itself I can ignore when I pull)
44
+ * Send me a pull request. Bonus points for topic branches.
45
+
46
+ == Copyright
47
+
48
+ Copyright (c) 2010 Matthias Viehweger. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*-
2
+ # vim:ft=ruby:enc=utf-8
3
+
4
+ # # enable trace to get better error output
5
+ # Rake.application.options.trace = true
6
+
7
+ # jeweler task
8
+ begin
9
+ require 'jeweler'
10
+ Jeweler::Tasks.new do |gem|
11
+ gem.name = "to_pass"
12
+ gem.summary = "generate password from words or sentences"
13
+ gem.description = %Q{Passwords should be easy to remember and hard to guess.
14
+ One technique is to have a sentence which can be easily remembered transformed to a password.}
15
+ gem.email = "kronn@kronn.de"
16
+ gem.homepage = "http://github.com/kronn/to_pass"
17
+ gem.authors = ["Matthias Viehweger"]
18
+
19
+ gem.add_development_dependency 'mocha'
20
+ gem.add_development_dependency 'sdoc'
21
+ end
22
+ Jeweler::GemcutterTasks.new
23
+ rescue LoadError
24
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
25
+ end
26
+
27
+ %w[ rake/rdoctask sdoc ].each { |lib| require lib }
28
+ Rake::RDocTask.new do |rdoc|
29
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
30
+
31
+ rdoc.rdoc_dir = 'doc/rdoc'
32
+ rdoc.title = "to_pass #{version}"
33
+ rdoc.options << '--fmt' << 'shtml'
34
+ rdoc.template = 'direct'
35
+ rdoc.rdoc_files.include('README*')
36
+ rdoc.rdoc_files.include('lib/**/*.rb')
37
+ end
38
+
39
+ desc "run tests"
40
+ task :test, :needs => [:check_dependencies] do
41
+ # optional libraries
42
+ %w[ redgreen ].each do |lib|
43
+ begin
44
+ require lib
45
+ rescue LoadError
46
+ end
47
+ end
48
+ ( ['test/unit', 'test/helper'] + Dir['test/test_*.rb'] ).each do |file|
49
+ require file
50
+ end
51
+ end
52
+
53
+ task :default => :test
data/TODO ADDED
@@ -0,0 +1,9 @@
1
+ UP NEXT
2
+ ============================================================================
3
+ - test and enble class methods of Converter-class
4
+
5
+ SOMEDAY
6
+ ============================================================================
7
+ - move decision wether a string is a word or not into algorithm definition.
8
+ - make conversion-functions more pluggable
9
+ - test on windows
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.2
data/bin/to_pass ADDED
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ # vim:ft=ruby:enc=utf-8
4
+
5
+ base_path = ( File.expand_path(File.dirname(__FILE__)+'/..') )
6
+ $LOAD_PATH << base_path unless $LOAD_PATH.include?(base_path)
7
+
8
+ require 'optparse'
9
+ require 'lib/to_pass'
10
+
11
+ # parse options
12
+ options = {
13
+ :pipe_usage => ARGV[0].nil?,
14
+ :algorithm => 'basic_de'
15
+ }
16
+
17
+ OptionParser.new do |opts|
18
+ opts.banner = "Usage: #{__FILE__} [options] passphrase"
19
+ opts.separator ""
20
+
21
+ opts.on('-a', '--algorithm ALGORITM', "use specified algorithm for transformation") do |value|
22
+ options[:algorithm] = value
23
+ end
24
+
25
+ opts.separator ""
26
+
27
+ opts.on_tail("-h", "--help", "Show this message") do
28
+ puts opts
29
+ exit
30
+ end
31
+ end.parse!
32
+
33
+ # get input string
34
+ string= unless options[:pipe_usage]
35
+ ARGV[0]
36
+ else
37
+ $stdin.read.chomp
38
+ end
39
+
40
+ # perform "heavy" work
41
+ password = ToPass::Base.new( string, options[:algorithm] ).to_s
42
+
43
+ if options[:pipe_usage]
44
+ $stdout << password
45
+ else
46
+ puts password
47
+ end
@@ -0,0 +1,30 @@
1
+ desc: Basic Algorithm with a german usage in mind
2
+ name: Basic (german)
3
+ sentence:
4
+ - table: words
5
+ - first_chars
6
+ - table: symbols
7
+ - collapse_chars
8
+ word:
9
+ - table: chars
10
+ - table: symbols
11
+ tables:
12
+ words:
13
+ ein: 1
14
+ eine: 1
15
+ zwei: 2
16
+ drei: 3
17
+ vier: 4
18
+ fuenf: 5
19
+ sechs: 6
20
+ sieben: 7
21
+ acht: 8
22
+ neun: 9
23
+ symbols:
24
+ a: '@'
25
+ chars:
26
+ a: 4
27
+ e: 3
28
+ i: 1
29
+ o: 0
30
+ s: 5
@@ -0,0 +1,32 @@
1
+ desc: Basic Algorithm with a english usage in mind
2
+ name: Basic (english)
3
+ sentence:
4
+ - table: words
5
+ - first_chars
6
+ - table: symbols
7
+ - collapse_chars
8
+ word:
9
+ - table: chars
10
+ - table: symbols
11
+ tables:
12
+ words:
13
+ one: 1
14
+ single: 1
15
+ two: 2
16
+ too: 2
17
+ three: 3
18
+ four: 4
19
+ for: 4
20
+ five: 5
21
+ six: 6
22
+ seven: 7
23
+ eight: 8
24
+ nine: 9
25
+ symbols:
26
+ a: '@'
27
+ chars:
28
+ a: 4
29
+ e: 3
30
+ i: 1
31
+ o: 0
32
+ s: 5
@@ -0,0 +1,47 @@
1
+ require 'pathname'
2
+ require 'yaml'
3
+
4
+ # The AlgorithmReader's primary API is the load the rules from a YAML-file
5
+ # into a Hash.
6
+ #
7
+ # Algorithms are searched in the following locations
8
+ #
9
+ # 1. ~/.to_pass/algorithms
10
+ # 2. bundled algorithms of gem
11
+ #
12
+ class ToPass::AlgorithmReader
13
+ attr_reader :load_path
14
+
15
+ def initialize(algorithm) # :nodoc:
16
+ @algorithm = algorithm
17
+ @load_path = []
18
+ [
19
+ '~/.to_pass/algorithms',
20
+ "#{File.dirname(__FILE__)}/../algorithms"
21
+ ].each do |dir|
22
+ dir = Pathname.new(dir)
23
+ @load_path << dir.expand_path if dir.exist?
24
+ end
25
+ end
26
+
27
+ class << self
28
+ # load an algorithm with a given identifier
29
+ def load(algorithm)
30
+ new(algorithm).load_from_file
31
+ end
32
+ end
33
+
34
+ def load_from_file # :nodoc:
35
+ fn = load_path.map do |dir|
36
+ file = Pathname.new("#{dir}/#{@algorithm}.yml")
37
+
38
+ if file.exist?
39
+ file
40
+ else
41
+ nil
42
+ end
43
+ end.compact.first
44
+
45
+ YAML.load_file(fn.expand_path)
46
+ end
47
+ end
@@ -0,0 +1,20 @@
1
+ module ToPass
2
+ # ToPass::Base is mostly a facade for the library.
3
+ #
4
+ # Given a string and a algorithm identifier, the right rules
5
+ # are loaded and applied to the string. With a simple "to_s",
6
+ # you can get the final password
7
+ class Base
8
+ # transform a string according to a certain algorithm
9
+ def initialize( string, algorithm )
10
+ rules = AlgorithmReader.load(algorithm)
11
+ converter = Converter.new( rules )
12
+ @password = converter.convert(string)
13
+ end
14
+
15
+ # return the generated password
16
+ def to_s
17
+ @password
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,62 @@
1
+ module ToPass
2
+ # converts a given string into a password-like word
3
+ #
4
+ # the string can be a word or a sentence. everthing which
5
+ # contains whitespace is considered a sentence
6
+ #
7
+ # a more complete description of the algorithm capabilities
8
+ # is still pending.
9
+ class Converter
10
+ # create a new converter, based on a set of conversion-rules
11
+ def initialize( rules )
12
+ @rules = rules
13
+ end
14
+
15
+ # convert a string into a password
16
+ def convert( string )
17
+ process(string, rules_for(string))
18
+ end
19
+
20
+ # class << self
21
+ # # convenience method to apply conversion rules to a string
22
+ # def apply(rules, string)
23
+ # new(rules).convert(string)
24
+ # end
25
+ # # convenience method to convert a string based on rules
26
+ # def convert(string, rules)
27
+ # new(rules).convert(string)
28
+ # end
29
+ # end
30
+
31
+ protected
32
+
33
+ include StringConversions
34
+
35
+ private
36
+
37
+ # return the applicable rules for a given string.
38
+ #
39
+ # everything which contains whitespace is considered a sentence,
40
+ # otherwise it is most likely a word.
41
+ def rules_for( string )
42
+ if string.include? ' ' or /\s/.match(string)
43
+ @rules['sentence']
44
+ else
45
+ @rules['word']
46
+ end
47
+ end
48
+
49
+ # process the string, rule by rule
50
+ def process(string, rules)
51
+ rules.inject(string) do |pwd, rule|
52
+ if rule.is_a?(String) and respond_to?(rule.to_sym)
53
+ send(rule.to_sym, pwd)
54
+ elsif rule.is_a?(Hash) and rule.has_key?('table')
55
+ replace(pwd, @rules['tables'][rule.fetch('table')])
56
+ else
57
+ pwd
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,13 @@
1
+ # Any Object can be a password, as long as it has a string representation.
2
+ #
3
+ # This Module provides a shortcut to the password-conversion.
4
+ #
5
+ # String.send(:include, ToPass::Integration)
6
+ # puts "Da steht ein Pferd auf dem Flur".to_pass => 'Ds1P@dF'
7
+ #
8
+ module ToPass::Integration
9
+ # simplified password-creation
10
+ def to_pass( algorithm = 'basic_de' )
11
+ ToPass::Base.new(self.to_s, algorithm).to_s
12
+ end
13
+ end
@@ -0,0 +1,51 @@
1
+ module ToPass
2
+ # The StringConversions-Module is a collection of available
3
+ # Transformations. Every method is given a string as single argument
4
+ # and is expected to return a transformed string. The only exception
5
+ # from this is general rule is the replace method which also takes a
6
+ # replacement table.
7
+ #
8
+ # This enables chaining and eases extending the capabilities.
9
+ module StringConversions
10
+ # all the blanks are removed.
11
+ #
12
+ # this is useful if you convert a sentence into a password.
13
+ def collapse_chars(string)
14
+ string = string.split(' ').join('')
15
+ end
16
+
17
+ # reduces every word to its first character, preserving case
18
+ def first_chars(string)
19
+ string.split(' ').map do |word|
20
+ word[0].chr
21
+ end.join(' ')
22
+ end
23
+
24
+ # alternate case of letter (not numbers)
25
+ def swapcase(string)
26
+ pwd = ""
27
+ last_upcase = true
28
+
29
+ string.each_char do |char|
30
+ char = if char.between?("0", "9")
31
+ char
32
+ elsif last_upcase
33
+ last_upcase = false
34
+ char.downcase
35
+ else
36
+ last_upcase = true
37
+ char.upcase
38
+ end
39
+ pwd << char
40
+ end
41
+ pwd
42
+ end
43
+
44
+ # perform replacements on a string, based on a replacment table
45
+ def replace(string, table)
46
+ table.inject(string) do |pwd, map|
47
+ pwd = pwd.gsub(/#{map[0].to_s}/, map[1].to_s)
48
+ end
49
+ end
50
+ end
51
+ end
data/lib/to_pass.rb ADDED
@@ -0,0 +1,14 @@
1
+ # Library to convert a String into a Password
2
+ module ToPass
3
+ # version of gem, read directly from the VERSION-File
4
+ VERSION = File.read(File.join(File.dirname(__FILE__), '../VERSION')).strip
5
+
6
+ # name of gem
7
+ APP_NAME = 'to_pass'
8
+
9
+ autoload :Converter, 'lib/to_pass/converter'
10
+ autoload :StringConversions, 'lib/to_pass/string_conversions'
11
+ autoload :Base, 'lib/to_pass/base'
12
+ autoload :Integration, 'lib/to_pass/integration'
13
+ autoload :AlgorithmReader, 'lib/to_pass/algorithm_reader'
14
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,26 @@
1
+ require 'test/unit/testcase'
2
+ require 'test/unit' unless defined?(Test::Unit)
3
+ require 'mocha'
4
+
5
+ base_path = ( File.expand_path(File.dirname(__FILE__)+'/..') )
6
+ $LOAD_PATH << base_path unless $LOAD_PATH.include?(base_path)
7
+
8
+ Test::Unit::TestCase.class_eval do
9
+ def assert_class_defined(klass)
10
+ assert defined?(klass), "#{klass} should be defined"
11
+ assert_kind_of Class, klass, "#{klass} should be a class"
12
+ end
13
+
14
+ def assert_module_defined(modul)
15
+ assert defined?(modul), "#{modul} should be defined"
16
+ assert_kind_of Module, modul, "#{modul} should be a module"
17
+ end
18
+
19
+ def self.test_presence(klass)
20
+ define_method "test_presence" do
21
+ assert_class_defined klass
22
+ end
23
+ end
24
+ end
25
+
26
+ require 'lib/to_pass'
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__)+'/helper'
2
+
3
+ class TestAlgorithmReader < Test::Unit::TestCase
4
+ test_presence ToPass::AlgorithmReader
5
+
6
+ def test_initialize
7
+ assert_nothing_raised do
8
+ klass.new( :basic_de )
9
+ end
10
+ end
11
+
12
+ def test_load
13
+ assert_respond_to klass, :load
14
+ assert_kind_of Hash, klass.load(:basic_de)
15
+ end
16
+
17
+ def test_has_load_path
18
+ assert_respond_to reader, :load_path
19
+ assert_kind_of Array, reader.load_path
20
+ end
21
+
22
+ def test_load_path_contains_standard_dirs
23
+ dirs = [
24
+ '~/.to_pass/algorithms' ,
25
+ "#{File.dirname(__FILE__)}/../lib/algorithms"
26
+ ]
27
+
28
+ Pathname.any_instance.expects(:exist?).times(dirs.size).returns(true)
29
+
30
+ dirs.each do |reldir|
31
+ dir = Pathname.new(reldir).expand_path
32
+ assert( reader.load_path.include?(dir), "#{reader.load_path.inspect} should include #{dir.inspect}" )
33
+ end
34
+ end
35
+
36
+ protected
37
+
38
+ def klass
39
+ ToPass::AlgorithmReader
40
+ end
41
+ def reader(algorithm = :basic_de)
42
+ @reader ||= klass.new(algorithm)
43
+ end
44
+ end
data/test/test_base.rb ADDED
@@ -0,0 +1,20 @@
1
+ require File.dirname(__FILE__)+'/helper'
2
+
3
+ class TestBase < Test::Unit::TestCase
4
+ test_presence ToPass::Base
5
+
6
+ def test_usage
7
+ assert_nothing_raised do
8
+ pwd = ToPass::Base.new("Da steht ein Pferd auf dem Flur", 'basic_de').to_s
9
+ assert_equal "Ds1P@dF", pwd
10
+ end
11
+ end
12
+
13
+ def test_version
14
+ assert_equal Pathname.new("#{File.dirname(__FILE__)}/../VERSION").expand_path.read.chomp, ToPass::VERSION
15
+ end
16
+
17
+ def test_appname
18
+ assert_equal "to_pass", ToPass::APP_NAME
19
+ end
20
+ end
@@ -0,0 +1,93 @@
1
+ require File.dirname(__FILE__)+'/helper'
2
+
3
+ class TestConverter < Test::Unit::TestCase
4
+ def teardown
5
+ @converter = nil
6
+ end
7
+
8
+ # basic presence and api-testing
9
+ test_presence ToPass::Converter
10
+ def test_instantiation
11
+ assert_nothing_raised do
12
+ ToPass::Converter.new({})
13
+ end
14
+ end
15
+ def test_convert
16
+ assert_respond_to converter, :convert
17
+ assert_nothing_raised do
18
+ converter.convert( "test" )
19
+ end
20
+ end
21
+
22
+ # mock-tests to ensure presence and calling of protected methods
23
+ def test_replace
24
+ assert_respond_to converter, :replace
25
+ converter.expects(:replace).once
26
+
27
+ converter.convert("test")
28
+ end
29
+ def test_swapcase
30
+ converter({'word' => ['swapcase']})
31
+ assert_respond_to converter, :swapcase
32
+ converter.expects(:swapcase).once
33
+ converter.convert("test")
34
+ end
35
+ def test_first_chars
36
+ converter({'sentence' => ['first_chars']})
37
+ assert_respond_to converter, :first_chars
38
+ converter.expects(:first_chars).once
39
+ converter.convert("test test")
40
+ end
41
+ def test_collapse_chars
42
+ converter({'sentence' => ['collapse_chars']})
43
+ assert_respond_to converter, :collapse_chars
44
+ converter.expects(:collapse_chars).once
45
+ converter.convert("test test")
46
+ end
47
+
48
+ # more complex/real-life setups
49
+ def test_multiple_rules
50
+ converter(basic_rules.merge({
51
+ 'word' => [{'table' => 'special'}, 'swapcase']
52
+ }))
53
+
54
+ assert_equal( "t35T", converter.convert('test'))
55
+ end
56
+ def test_sentence
57
+ converter(complex_rules)
58
+ assert_equal( "Ds1P@dF", converter.convert("Da steht ein Pferd auf dem Flur"))
59
+ end
60
+ def test_sentence_with_whitespace
61
+ converter(complex_rules)
62
+ assert_equal( "Ds1P@dF", converter.convert("Da steht ein
63
+
64
+ Pferd auf dem Flur"))
65
+ end
66
+
67
+ protected
68
+
69
+ def converter(rules = basic_rules)
70
+ @converter ||= ToPass::Converter.new(rules)
71
+ end
72
+
73
+ def basic_rules
74
+ {
75
+ 'word' => [{ 'table' => 'special' }],
76
+ 'tables' => {
77
+ 'special' => {
78
+ 'e' => '3',
79
+ 's' => '5'
80
+ }
81
+ }
82
+ }
83
+ end
84
+ def complex_rules
85
+ {
86
+ 'sentence' => [{'table'=>'words'},'first_chars','collapse_chars',{'table'=>'symbols'}],
87
+ 'tables' => {
88
+ 'words' => { 'ein' => '1' },
89
+ 'symbols' => { 'a' => '@' }
90
+ }
91
+ }
92
+ end
93
+ end
@@ -0,0 +1,30 @@
1
+ require File.dirname(__FILE__)+'/helper'
2
+
3
+ class TestIntegration < Test::Unit::TestCase
4
+ def test_cli_usage_without_algorithm
5
+ assert_nothing_raised do
6
+ assert_equal "t35t", `bin/to_pass test`.chomp
7
+ end
8
+ end
9
+
10
+ def test_cli_usage_with_algorithm
11
+ assert_nothing_raised do
12
+ assert_equal "ti1p4u2", `bin/to_pass 'there is one problem for us, too' -a basic_en`.chomp
13
+ end
14
+ end
15
+
16
+ def test_cli_usage_with_pipes
17
+ assert_nothing_raised do
18
+ assert_equal 't35t', `echo "test" | bin/to_pass`
19
+ end
20
+ end
21
+
22
+ def test_module_integration
23
+ assert_nothing_raised do
24
+ str = "test"
25
+ str.instance_eval "class << self; include ToPass::Integration; end"
26
+
27
+ assert_equal 't35t', str.to_pass
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,37 @@
1
+ require File.dirname(__FILE__)+'/helper'
2
+
3
+ class TestStringConversion < Test::Unit::TestCase
4
+ def test_replacement
5
+ result = converter.replace("test", {
6
+ :e => 3,
7
+ :s => 5
8
+ })
9
+ assert_equal "t35t", result
10
+ end
11
+
12
+ def test_case_swapping
13
+ assert_equal "tEsT", converter.swapcase("test")
14
+ end
15
+
16
+ def test_case_swapping_ignores_numbers
17
+ assert_equal "tEsT4fUn", converter.swapcase("test4fun")
18
+
19
+ assert_equal "fUn4TeSt", converter.swapcase("fun4test")
20
+ end
21
+
22
+ def test_char_collapsing
23
+ assert_equal "abc", converter.collapse_chars("a b c")
24
+ end
25
+
26
+ def test_select_first_chars
27
+ assert_equal "t a t f t", converter.first_chars('test all the fucking time')
28
+ end
29
+
30
+ protected
31
+
32
+ def converter
33
+ klass = Class.new
34
+ klass.send(:extend, ToPass::StringConversions)
35
+ klass
36
+ end
37
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: to_pass
3
+ version: !ruby/object:Gem::Version
4
+ hash: 19
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 2
10
+ version: 0.2.2
11
+ platform: ruby
12
+ authors:
13
+ - Matthias Viehweger
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-06-13 00:00:00 +02:00
19
+ default_executable: to_pass
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: mocha
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: sdoc
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :development
48
+ version_requirements: *id002
49
+ description: |-
50
+ Passwords should be easy to remember and hard to guess.
51
+ One technique is to have a sentence which can be easily remembered transformed to a password.
52
+ email: kronn@kronn.de
53
+ executables:
54
+ - to_pass
55
+ extensions: []
56
+
57
+ extra_rdoc_files:
58
+ - LICENSE
59
+ - README.rdoc
60
+ - TODO
61
+ files:
62
+ - .gitignore
63
+ - LICENSE
64
+ - README.rdoc
65
+ - Rakefile
66
+ - TODO
67
+ - VERSION
68
+ - bin/to_pass
69
+ - lib/algorithms/basic_de.yml
70
+ - lib/algorithms/basic_en.yml
71
+ - lib/to_pass.rb
72
+ - lib/to_pass/algorithm_reader.rb
73
+ - lib/to_pass/base.rb
74
+ - lib/to_pass/converter.rb
75
+ - lib/to_pass/integration.rb
76
+ - lib/to_pass/string_conversions.rb
77
+ - test/helper.rb
78
+ - test/test_algorithm_reader.rb
79
+ - test/test_base.rb
80
+ - test/test_converter.rb
81
+ - test/test_integration.rb
82
+ - test/test_string_conversions.rb
83
+ has_rdoc: true
84
+ homepage: http://github.com/kronn/to_pass
85
+ licenses: []
86
+
87
+ post_install_message:
88
+ rdoc_options:
89
+ - --charset=UTF-8
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ hash: 3
98
+ segments:
99
+ - 0
100
+ version: "0"
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ none: false
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ hash: 3
107
+ segments:
108
+ - 0
109
+ version: "0"
110
+ requirements: []
111
+
112
+ rubyforge_project:
113
+ rubygems_version: 1.3.7
114
+ signing_key:
115
+ specification_version: 3
116
+ summary: generate password from words or sentences
117
+ test_files:
118
+ - test/helper.rb
119
+ - test/test_algorithm_reader.rb
120
+ - test/test_base.rb
121
+ - test/test_converter.rb
122
+ - test/test_integration.rb
123
+ - test/test_string_conversions.rb