Skip to content

Instantly share code, notes, and snippets.

@caioertai
Last active July 9, 2018 23:44
Show Gist options
  • Save caioertai/3739edb59c423a94385429ba8ce10983 to your computer and use it in GitHub Desktop.
Save caioertai/3739edb59c423a94385429ba8ce10983 to your computer and use it in GitHub Desktop.
Monday, July 9th - Le Wagon Livecode - Batch #169
'01': Ain
'02': Aisne
'03': Allier
'04': Alpes-de-Haute-Provence
'05': Hautes-Alpes
'06': Alpes-Maritimes
'07': Ardèche
'08': Ardennes
'09': Ariège
'10': Aube
'11': Aude
'12': Aveyron
'13': Bouches-du-Rhône
'14': Calvados
'15': Cantal
'16': Charente
'17': Charente-Maritime
'18': Cher
'19': Corrèze
'2A': Corse-du-Sud
'2B': Haute-Corse
'21': Côte-d'Or
'22': Côtes-d'Armor
'23': Creuse
'24': Dordogne
'25': Doubs
'26': Drôme
'27': Eure
'28': Eure-et-Loir
'29': Finistère
'30': Gard
'31': Haute-Garonne
'32': Gers
'33': Gironde
'34': Hérault
'35': Ille-et-Vilaine
'36': Indre
'37': Indre-et-Loire
'38': Isère
'39': Jura
'40': Landes
'41': Loir-et-Cher
'42': Loire
'43': Haute-Loire
'44': Loire-Atlantique
'45': Loiret
'46': Lot
'47': Lot-et-Garonne
'48': Lozère
'49': Maine-et-Loire
'50': Manche
'51': Marne
'52': Haute-Marne
'53': Mayenne
'54': Meurthe-et-Moselle
'55': Meuse
'56': Morbihan
'57': Moselle
'58': Nièvre
'59': Nord
'60': Oise
'61': Orne
'62': Pas-de-Calais
'63': Puy-de-Dôme
'64': Pyrénées-Atlantiques
'65': Hautes-Pyrénées
'66': Pyrénées-Orientales
'67': Bas-Rhin
'68': Haut-Rhin
'69': Rhône
'70': Haute-Saône
'71': Saône-et-Loire
'72': Sarthe
'73': Savoie
'74': Haute-Savoie
'75': Paris
'76': Seine-Maritime
'77': Seine-et-Marne
'78': Yvelines
'79': Deux-Sèvres
'80': Somme
'81': Tarn
'82': Tarn-et-Garonne
'83': Var
'84': Vaucluse
'85': Vendée
'86': Vienne
'87': Haute-Vienne
'88': Vosges
'89': Yonne
'90': Territoire de Belfort
'91': Essonne
'92': Hauts-de-Seine
'93': Seine-Saint-Denis
'94': Val-de-Marne
'95': Val-d'Oise
require 'date'
require 'yaml'
PATTERN = /\A(?<gender>1|2)\s*(?<yob>\d\d)\s*(?<mob>0[1-9]|1[0-2])\s*(?<dept>0[1-9]|[1-9]\d)\s*\d{3}\s*\d{3}\s*(?<key>\d{2})\z/
def french_ssn_info(ssn)
# Checks for a match with our PATTERN
# tip: it will be nil if no match, and MatchData if it matches
match_ssn = ssn.match(PATTERN)
# Checks if the ssn both matches the regexp AND fulfills the key condition to be valid
if match_ssn && validate_ssn_key(match_ssn)
# Returns man or woman according to the first number of the SSN
gender = match_ssn[:gender] == "1" ? "man" : "woman"
# Converts the year of bith into the 4 digits format
yob = "19#{match_ssn[:yob]}"
# Uses ruby's Date library to convert numbers into month names
mob = Date::MONTHNAMES[match_ssn[:mob].to_i]
# Checks our #french_departments method for the name relative to the deparment
# number we got from the SSN
dept = french_departments[match_ssn[:dept]]
return "a #{gender}, born in #{mob}, #{yob} in #{dept}."
else
return "The number is invalid"
end
end
def validate_ssn_key(match_ssn)
# Grabs the whole matched string from the MatchData object
# and removes the spaces (/\s+/) with gsub
# tip: Whole matched string is always on position [0]
ssn = match_ssn[0].gsub(/\s+/, '')
# Returns the whole SSN except the last 2 characters (the ssn key)
# from the string and then convert it to an integer
# tip: in [0..-1] 0 would mean the first character and -1 the last one
# so [0..-3] means all except the last 2
ssn_without_key = ssn[0..-3].to_i
# Does the required operation over the ssn to match its key
((97 - ssn_without_key) % 97) == match_ssn[:key].to_i
end
def french_departments
# Creates a hash from a YAML file
YAML.load_file('data/french_departments.yml')
end
require_relative "../french_ssn"
describe "#french_ssn_info" do
it "should return a man, born in December, 1984 in Seine-Maritime when SSN is 1 84 12 76 451 089 46" do
actual = french_ssn_info("1 84 12 76 451 089 46")
expected = "a man, born in December, 1984 in Seine-Maritime."
expect(actual).to eq(expected)
end
it "should return The number is invalid when SSN is 123" do
actual = french_ssn_info("123")
expected = "The number is invalid"
expect(actual).to eq(expected)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment