Class: UsernameSuggester::Suggester

Inherits:
Object
  • Object
show all
Defined in:
lib/username_suggester/suggester.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(first_name, last_name, options = {}) ⇒ Suggester

Creates a UsernameSuggester to suggest usernames

Parameters

  • :first_name - Required.

  • :last_name - Required.

  • :options - There is one option – :validate. You can pass in a Proc object and the suggestion will be returned if involving the Proc with the suggestion returns true



17
18
19
20
21
# File 'lib/username_suggester/suggester.rb', line 17

def initialize(first_name, last_name, options = {})
  @first_name = (first_name || "").downcase
  @last_name = (last_name || "").downcase
  @options = options
end

Instance Attribute Details

#first_nameObject (readonly)

Returns the value of attribute first_name.



5
6
7
# File 'lib/username_suggester/suggester.rb', line 5

def first_name
  @first_name
end

#last_nameObject (readonly)

Returns the value of attribute last_name.



6
7
8
# File 'lib/username_suggester/suggester.rb', line 6

def last_name
  @last_name
end

Instance Method Details

#name_combinationsObject

Generates the combinations without the knowledge of what names are available



24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/username_suggester/suggester.rb', line 24

def name_combinations
  @name_combinations ||= [
    "#{@first_name}",
    "#{@last_name}",
    "#{@first_name.first}#{@last_name}",
    "#{@first_name}#{@last_name.first}",
    "#{@first_name}#{@last_name}",
    "#{@last_name.first}#{@first_name}",
    "#{@last_name}#{@first_name.first}",
    "#{@last_name}#{@first_name}"
  ].uniq.reject { |s| s.blank? }
end

#suggest(max_num_suggestion, unavailable_suggestions = []) ⇒ Object

Generates suggestions and making sure they are not in unavailable_suggestions



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/username_suggester/suggester.rb', line 38

def suggest(max_num_suggestion, unavailable_suggestions = [])
  unavailable_set = unavailable_suggestions.to_set
  results = []
  candidates = name_combinations.clone
  while results.size < max_num_suggestion and !candidates.blank?
    candidate = candidates.shift
    if @options[:validate] and !@options[:validate].call(candidate)
      # Don't add the candidate to result
    elsif unavailable_set.include? candidate
      candidates << find_extended_candidate(candidate, unavailable_set)
    else
      results << candidate
    end
  end
  results
end