ppp 0.1.6.alpha → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/ppp.rb CHANGED
@@ -17,6 +17,7 @@ module Ppp
17
17
  Generator.new key, opts
18
18
  end
19
19
 
20
+ # @param [String] str some string to create a SHA-256 digest of
20
21
  # @return a SHA-256 digest of the given string
21
22
  def key_from_string str
22
23
  Digest::SHA256.new.update( str ).to_s
@@ -27,8 +28,11 @@ module Ppp
27
28
  Cppp.random_key
28
29
  end
29
30
 
30
- def printer style, *args
31
- case style
31
+ # @param [Symbol] type the type of card to return
32
+ # @param [Array] args parameters to pass to the card's constructor
33
+ # @return a +Card+ of the given type
34
+ def card type, *args
35
+ case type
32
36
  when :html then return Card::Html.new *args
33
37
  when :xml then return Card::Xml.new *args
34
38
  when :plain then return Card::Plain.new *args
@@ -36,6 +40,7 @@ module Ppp
36
40
  raise ArgumentError.new( "%s is not a valid printer style." % style )
37
41
  end
38
42
 
43
+ # @return [Hash{Symbol => String}] the default alphabets
39
44
  def default_alphabets
40
45
  @@ALPHABETS
41
46
  end
@@ -2,6 +2,7 @@ require 'ppp/generator'
2
2
 
3
3
  module Ppp
4
4
  module Card
5
+ # @abstract Subclass and override {#to_s} to implement a custom Card class.
5
6
  class Base
6
7
  attr_reader :card_number, :row_count, :title
7
8
 
@@ -13,6 +14,11 @@ module Ppp
13
14
  @@ERROR_LONG_CODES = %[Passcodes longer than 16 characters are too long for printing]
14
15
  @@ERROR_WRONG_NUM_ARGS = %[Wrong number of arguments. Expected %s, got %d]
15
16
 
17
+ # @param [Generator] generator the generator this card will get passcodes from
18
+ # @param [Hash] opts options to create the card with
19
+ # @option opts [Fixnum] :row_count (10) the number of rows in the card
20
+ # @option opts [String] :card_title ('PPP Passcard') the title of the card
21
+ # @option opts [Fixnum] :first_card_number (1) the number of the first card to create
16
22
  def initialize generator, opts={}
17
23
  @generator = generator
18
24
  raise ArgumentError.new( @@ERROR_LONG_CODES ) if code_length > 16
@@ -26,23 +32,31 @@ module Ppp
26
32
  @card_number = options[ :first_card_number ]
27
33
  end
28
34
 
35
+ # @return [Fixnum] the number of characters in each passcode in the card
29
36
  def code_length
30
37
  @generator.length
31
38
  end
32
39
 
40
+ # @param [Fixnum] number the new card number. Must be +1+ or more. The card number determines which passcodes
41
+ # will be printed on the card. For example, if the card has 10 rows, and each row has five passcodes, then
42
+ # Card #1 will retrieve passcodes 0-49 from the generator. If +card_number == 2+, then passcodes 50-99 will
43
+ # be printed from the generator.
33
44
  def card_number= number
34
45
  raise ArgumentError.new( "card number must be a positive integer" ) if number < 1
35
46
  @card_number = number
36
47
  end
37
48
 
49
+ # @return [Fixnum] the number of passcodes to be printed on each line
38
50
  def passcodes_per_line
39
51
  @passcodes_per_line ||= ( (@@CHARS_PER_LINE+1) / (code_length + 1) ).to_i
40
52
  end
41
53
 
54
+ # @return [Fixnum] the number of passcodes to be printed on the card
42
55
  def passcodes_per_card
43
56
  passcodes_per_line * row_count
44
57
  end
45
58
 
59
+ # @return [Array(Array(String))] the passcodes on the current card
46
60
  def codes
47
61
  (1..row_count).collect do |row|
48
62
  offset = card_offset + ((row-1) * passcodes_per_line)
@@ -51,6 +65,13 @@ module Ppp
51
65
  end
52
66
  end
53
67
 
68
+ # @overload passcode(cell)
69
+ # @return [String] the passcode in the given cell
70
+ # @param [String] cell A cell ID. example: +10B+
71
+ # @overload passcode(row, column)
72
+ # @return [String] the passcode in the given row and column
73
+ # @param [Fixnum] row the row of the passcode to return
74
+ # @param [String] column the column of the passcode to return
54
75
  def passcode *args
55
76
  case args.size
56
77
  when 1
@@ -72,21 +93,37 @@ module Ppp
72
93
  @generator.passcode offset
73
94
  end
74
95
 
96
+ # @overload verify(cell, given_passcode)
97
+ # @return [Boolean] +true+ if the given passcode matches the passcode in the given cell
98
+ # @param [String] cell A cell ID. example: +10B+
99
+ # @param [String] given_passcode the passcode to verify
100
+ # @overload verify(row, column, given_passcode)
101
+ # @return [Boolean] +true+ if the given passcode matches the passcode in the given row and column
102
+ # @param [Fixnum] row the row of the passcode to return
103
+ # @param [String] column the column of the passcode to return
104
+ # @param [String] given_passcode the passcode to verify
75
105
  def verify *args
76
106
  given_code = args.pop
77
107
  given_code == passcode( *args )
78
108
  end
79
109
 
80
- def row_label row_number
81
- "#{row_number + 1}:"
110
+ def to_s
111
+ raise "unimplemented"
112
+ end
113
+
114
+ protected
115
+
116
+ def row_label row_index
117
+ "#{row_index + 1}:"
82
118
  end
83
119
 
84
120
  def column_label column_number
85
121
  (@@FIRST_COLUMN.ord + (column_number - 1)).chr
86
122
  end
87
-
88
- protected
89
-
123
+
124
+ # @return [Fixnum] the offset of passcodes to request from the generator for the given card. For example, if this
125
+ # card contains 50 passcodes, and we are currently on card 3, we want to request passcodes 100-149 from the
126
+ # generator.
90
127
  def card_offset
91
128
  (card_number-1) * passcodes_per_card
92
129
  end
@@ -15,35 +15,37 @@ class Ppp::Card::Plain < Ppp::Card::Base
15
15
  line( split_bar )
16
16
  end
17
17
 
18
- def card_number= number
19
- super
20
- end
21
-
22
18
  private
23
19
 
20
+ # @return [String] a horizontal rule
24
21
  def bar
25
22
  '-' * (width + 2)
26
23
  end
27
24
 
25
+ # @return [Fixnum] the width of the table
28
26
  def width
29
27
  return rows.first.join( ' ' ).size if rows.size >= 1
30
28
  header.size
31
29
  end
32
30
 
31
+ # @return [Array(Array(String))] The cells of the table, with the first column containing the row labels
33
32
  def rows
34
33
  codes.each_with_index.collect { |row, i| [ first_column( i ) ] + row }
35
34
  end
36
35
 
36
+ # @return [String] the column labels
37
37
  def header
38
38
  header_cells.join ' '
39
39
  end
40
40
 
41
+ # @return [Array(String)] a list of the column headers
41
42
  def header_cells
42
43
  cells = passcodes_per_line.times.collect { |i| column_label(i+1).center code_length }
43
44
 
44
45
  [' ' * first_column_width ] + cells
45
46
  end
46
47
 
48
+ # @return [String] a line containing the title and card number
47
49
  def title_str
48
50
  title = @title[0, width - card_label.size] # trim title if it's too long to fit
49
51
 
@@ -51,31 +53,40 @@ class Ppp::Card::Plain < Ppp::Card::Base
51
53
  title = title + (' ' * blank_space) + card_label
52
54
  end
53
55
 
56
+ # @return [String] a label containing the card number
54
57
  def card_label
55
58
  "[#{card_number}]"
56
59
  end
57
60
 
61
+ # @return [String] a horizontal rule with notches in it to deliniate the columns
58
62
  def split_bar
59
63
  parts = ['-' * first_column_width] + (1..passcodes_per_line).collect { '-' * code_length }
60
64
  "-#{parts.join '+'}-"
61
65
  end
62
66
 
67
+ # @return [Array(String)] a list of rows, each element containing the string of passcodes for that rows
63
68
  def row_lines
64
69
  rows.collect{ |r| line :pad, r.join( ' ' ) }
65
70
  end
66
71
 
72
+ # @return [String] a line with the table's left and right border
73
+ # @param [String] str the content of the line
74
+ # @param [Symbol] +:pad+ if borders should have a one-space padding
67
75
  def line pad=:nopad, str
68
76
  return "| #{str} |\n" if pad == :pad
69
77
 
70
78
  "|#{str}|\n"
71
79
  end
72
80
 
81
+ # @return [String] the content of the first cell of the given row. The row's label
82
+ # @param [Fixnum] The index of the given row.
73
83
  def first_column row_index
74
84
  label = row_label row_index
75
85
  padding = ' ' * (first_column_width - label.size)
76
86
  padding + label
77
87
  end
78
88
 
89
+ # @return [Fixnum] the required number of characters needed to fit the row label of each row
79
90
  def first_column_width
80
91
  @row_count.to_s.size + 1
81
92
  end
@@ -8,10 +8,10 @@ class Ppp::Generator
8
8
 
9
9
  # @param [String] sha256_key a 64 hex-digit string representation of a
10
10
  # SHA-256 hash. This hash will seed all the generated passcodes.
11
- # @param [Fixnum] length the number of characters in each generated passcode
12
- # @param [String] alphabet a string containing the characters passcodes will
13
- # be comprised of. Cannot contain null characters and duplicate characters
14
- # will be removed.
11
+ # @param [Hash] opts the options to create the generator with.
12
+ # @option opts [Fixnum] :length (4) the number of characters in each generated passcode
13
+ # @option opts [String] :alphabet (:conservative) a string containing the characters passcodes will
14
+ # be comprised of. Cannot contain null characters and duplicate characters will be removed.
15
15
  def initialize sha256_key, opts={}
16
16
  raise NotHexKey.new( sha256_key ) if @@HEX_PATTERN.match( sha256_key ).nil?
17
17
 
@@ -1,3 +1,3 @@
1
1
  module Ppp
2
- VERSION = '0.1.6.alpha'
2
+ VERSION = '1.0.0'
3
3
  end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ppp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6.alpha
5
- prerelease: 6
4
+ version: 1.0.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Jon Sangster
@@ -52,9 +52,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
52
52
  required_rubygems_version: !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
- - - ! '>'
55
+ - - ! '>='
56
56
  - !ruby/object:Gem::Version
57
- version: 1.3.1
57
+ version: '0'
58
58
  requirements: []
59
59
  rubyforge_project: ppp
60
60
  rubygems_version: 1.8.15
@@ -63,3 +63,4 @@ specification_version: 3
63
63
  summary: Ruby bindings for John Graham-Cumming's implementation of GRC's Perfect Paper
64
64
  Passwords
65
65
  test_files: []
66
+ has_rdoc: