password_characters 0.1.2 → 1.0.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: acdef392daa31b915b00cc6fe7ffeed0a6fbe2f6
4
- data.tar.gz: a489523ad89d71258b72f3c4d6c8086f4ab40782
3
+ metadata.gz: 5ed3c346e67225b17346a58797191032b239a205
4
+ data.tar.gz: 876e3acd646486aafcce6a0d44273ea5a4164668
5
5
  SHA512:
6
- metadata.gz: 5b35229af138d337c100016db16dea999b9c4a35653aabbfc03042542181f3cb9e9f06e18430371d7bfb9a086ade0bf75e0dbd2d26de0f1492844d93f09d499a
7
- data.tar.gz: b0648368919bfa8da669d3b86948eb5385ddd47f0e5fdf6490b7c3b574e4c471f5ad60739b0a9bd0c7a997411765c8a8487fa9f84c213332591a231b7d57db30
6
+ metadata.gz: c650a5a4f95870ab1b14a8dd8ec5adc1bef30c0eacc9aaa04f601fe41312b811f4feeb18286b47551d8745874ef614bd34f4a71e64063bd5bb1246ead46ef238
7
+ data.tar.gz: 5b1fd2b96dae733e55656300cab0a5b400bafa5c3292caa3b1910acb9d9eabdeb52e915c214127cdfbe1904ee55f6283510ff124e6580fc32eb9d6484ef99e8f
@@ -1,29 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- require_relative '../lib/password_and_ordinals'
2
+ require 'password_characters/cli'
3
+ require 'password_characters'
3
4
 
4
- require 'active_support'
5
- require 'active_support/core_ext/string'
6
-
7
- password = if ARGV.any?
8
- ARGV[0]
9
- else
10
- puts 'Enter password:'
11
- gets
12
- end
13
-
14
- character_ordinals = if ARGV.any?
15
- ARGV[1]
16
- else
17
- puts 'Enter indices:'
18
- gets
19
- end
20
-
21
- def character_ordinals_to_integer_array(character_ordinals)
22
- character_ordinals.split(',').map(&:to_i)
23
- end
24
-
25
- begin
26
- puts PasswordAndOrdinals.new(password.squish, character_ordinals_to_integer_array(character_ordinals.squish)).characters.join ' '
27
- rescue Exception => e
28
- abort e.message
29
- end
5
+ PasswordCharacters::CLI.start
@@ -1,6 +1,83 @@
1
1
  require "password_characters/version"
2
2
 
3
+ require 'set'
4
+
5
+ require 'active_support'
6
+ require 'active_support/core_ext/object'
7
+
3
8
  module PasswordCharacters
4
- require 'password_and_ordinals'
5
- require 'ordinal_parser'
9
+ class PasswordAndOrdinals
10
+ def initialize(password, ordinals)
11
+ raise(ArgumentError, "#{ordinals} does not ask for any characters") if ordinals.empty?
12
+ raise(ArgumentError, "#{ordinals} only asks for one character") if ordinals.one?
13
+
14
+ raise(ArgumentError, "#{ordinals} does not only ask for integers") unless ordinals.all? { |o| o.is_a? Fixnum }
15
+
16
+ raise(ArgumentError, "#{ordinals} is not in ascending order") unless sorted?(ordinals)
17
+
18
+ raise(ArgumentError, "#{ordinals.uniq.to_sentence} duplicated in #{ordinals}") unless uniq?(ordinals)
19
+ raise(ArgumentError, "#{ordinals} would reveal entire password") unless ordinals.size < password.size # needs to come after checking duplicates
20
+
21
+ raise(ArgumentError, "#{ordinals_out_of_bounds(password, ordinals).to_sentence} out of bounds") unless ordinals.all? { |i| i.in? ordinal_range(password) }
22
+
23
+ @password_array = password.chars
24
+ @indices = indices ordinals
25
+ end
26
+
27
+ def characters
28
+ @indices.map { |i| @password_array.at i }
29
+ end
30
+
31
+ private
32
+
33
+ def sorted?(a)
34
+ a.sort == a
35
+ end
36
+
37
+ def uniq?(a)
38
+ a.uniq == a
39
+ end
40
+
41
+ def ordinals_out_of_bounds(password, ordinals)
42
+ ordinals.reject { |i| i.in? ordinal_range(password) }
43
+ end
44
+
45
+ def ordinal_range(password)
46
+ 1..password.length
47
+ end
48
+
49
+ def indices(ordinals)
50
+ ordinals.map { |n| n - 1 }
51
+ end
52
+ end
53
+
54
+ class OrdinalParser
55
+ def initialize(string, password=nil)
56
+ @input = string
57
+ @password = password
58
+ end
59
+
60
+ def ordinal
61
+ case @input
62
+ when /the last/
63
+ @password.length
64
+ when /second (from|to) last/
65
+ @password.length - 1
66
+ when /third from last/
67
+ @password.length - 2
68
+ when /fourth from last/
69
+ @password.length - 3
70
+ when /first/
71
+ 1
72
+ when /second/
73
+ 2
74
+ when /third/
75
+ 3
76
+ when /fourth/
77
+ 4
78
+ else
79
+ @input[/\d+/].to_i
80
+ end
81
+ end
82
+ end
6
83
  end
@@ -0,0 +1,19 @@
1
+ require 'thor'
2
+ require 'active_support'
3
+ require 'active_support/core_ext/string'
4
+
5
+ module PasswordCharacters
6
+ class CLI < Thor
7
+ desc 'inline', 'allows input of the password and indices during invocation'
8
+ options password: :required, indices: :required
9
+ def inline
10
+ puts PasswordCharacters::PasswordAndOrdinals.new(options[:password], character_ordinals_to_integer_array(options[:indices])).characters.join ' '
11
+ end
12
+
13
+ no_commands do
14
+ def character_ordinals_to_integer_array(character_ordinals)
15
+ character_ordinals.split(',').map(&:to_i)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module PasswordCharacters
2
- VERSION = "0.1.2"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -20,8 +20,9 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ["lib"]
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.12"
23
- spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency 'aruba', '0.14.1'
25
- spec.add_development_dependency 'rspec', '3.4.0'
26
- spec.add_runtime_dependency 'activesupport', '4.2.6'
23
+ spec.add_development_dependency "rake", "~> 11.2.2"
24
+ spec.add_development_dependency 'aruba', '~> 0.14.1'
25
+ spec.add_development_dependency 'rspec', '~> 3.5.0'
26
+ spec.add_runtime_dependency 'activesupport', '~> 5.0.0.1'
27
+ spec.add_dependency 'thor'
27
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: password_characters
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nigel Lowry
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-21 00:00:00.000000000 Z
11
+ date: 2016-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,56 +30,70 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 11.2.2
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 11.2.2
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: aruba
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '='
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: 0.14.1
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '='
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.14.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '='
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 3.4.0
61
+ version: 3.5.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '='
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 3.4.0
68
+ version: 3.5.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: activesupport
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '='
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 5.0.0.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 5.0.0.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: thor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: 4.2.6
89
+ version: '0'
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - '='
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: 4.2.6
96
+ version: '0'
83
97
  description: Can be used to log in to Web sites which ask for specific characters
84
98
  from your password
85
99
  email:
@@ -101,9 +115,8 @@ files:
101
115
  - bin/console
102
116
  - bin/password_characters
103
117
  - bin/setup
104
- - lib/ordinal_parser.rb
105
- - lib/password_and_ordinals.rb
106
118
  - lib/password_characters.rb
119
+ - lib/password_characters/cli.rb
107
120
  - lib/password_characters/version.rb
108
121
  - password_characters.gemspec
109
122
  homepage: https://github.com/nigel-lowry/password_characters
@@ -1,29 +0,0 @@
1
- class OrdinalParser
2
- def initialize(string, password=nil)
3
- @input = string
4
- @password = password
5
- end
6
-
7
- def ordinal
8
- case @input
9
- when /the last/
10
- @password.length
11
- when /second (from|to) last/
12
- @password.length - 1
13
- when /third from last/
14
- @password.length - 2
15
- when /fourth from last/
16
- @password.length - 3
17
- when /first/
18
- 1
19
- when /second/
20
- 2
21
- when /third/
22
- 3
23
- when /fourth/
24
- 4
25
- else
26
- @input[/\d+/].to_i
27
- end
28
- end
29
- end
@@ -1,47 +0,0 @@
1
- require 'set'
2
-
3
- require 'active_support'
4
- require 'active_support/core_ext/object'
5
-
6
- class PasswordAndOrdinals
7
- def initialize(password, ordinals)
8
- raise(ArgumentError, "#{ordinals} does not ask for any characters") if ordinals.empty?
9
- raise(ArgumentError, "#{ordinals} only asks for one character") if ordinals.one?
10
-
11
- raise(ArgumentError, "#{ordinals} is not in ascending order") unless sorted?(ordinals)
12
-
13
- raise(ArgumentError, "#{ordinals.uniq.to_sentence} duplicated in #{ordinals}") unless uniq?(ordinals)
14
- raise(ArgumentError, "#{ordinals} would reveal entire password") unless ordinals.size < password.size # needs to come after checking duplicates
15
-
16
- raise(ArgumentError, "#{ordinals_out_of_bounds(password, ordinals).to_sentence} out of bounds") unless ordinals.all? { |i| i.in? ordinal_range(password) }
17
-
18
- @password_array = password.chars
19
- @indices = indices ordinals
20
- end
21
-
22
- def characters
23
- @indices.map { |i| @password_array.at i }
24
- end
25
-
26
- private
27
-
28
- def sorted?(a)
29
- a.sort == a
30
- end
31
-
32
- def uniq?(a)
33
- a.uniq == a
34
- end
35
-
36
- def ordinals_out_of_bounds(password, ordinals)
37
- ordinals.reject { |i| i.in? ordinal_range(password) }
38
- end
39
-
40
- def ordinal_range(password)
41
- 1..password.length
42
- end
43
-
44
- def indices(ordinals)
45
- ordinals.map { |n| n - 1 }
46
- end
47
- end