Class: CodeBadges::CademySite

Inherits:
Object
  • Object
show all
Defined in:
lib/codebadges/site.rb

Overview

CodeCademy web automation and scraper

Constant Summary collapse

MAIN_URL =
'https://www.codecademy.com'.freeze
USERS_URL =
"#{MAIN_URL}/users".freeze
ACHIEVEMENTS_DIR =
'achievements'.freeze
LOGIN_URL =
"#{MAIN_URL}/login".freeze
USERNAME_TEXTFIELD_ID =
'user_login'.freeze
PASSWORD_TEXTFIELD_ID =
'user_password'.freeze
LOGIN_BUTTON_ID =
'user_submit'.freeze
ACHIEVEMENT_XPATH =
"//div[contains(@class,'achievement-card')]".freeze
ACH_TITLE_XPATH =
'h5'.freeze
ACH_DATE_XPATH =
'small/small'.freeze
COURSES_XPATH =
"//div[h5/strong/text()='Learn To Code']/div/div/ul/li/a".freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize {|_self| ... } ⇒ CademySite

Returns a new instance of CademySite.

Yields:

  • (_self)

Yield Parameters:



22
23
24
25
26
27
28
# File 'lib/codebadges/site.rb', line 22

def initialize
  @browser = Mechanize.new do |agent|
    agent.user_agent_alias = 'Linux Firefox'
  end

  yield self if block_given?
end

Class Method Details

.cadet_achievements_url(cadet) ⇒ Object



30
31
32
# File 'lib/codebadges/site.rb', line 30

def self.cadet_achievements_url(cadet)
  "#{USERS_URL}/#{cadet}/#{ACHIEVEMENTS_DIR}"
end

Instance Method Details

#extract_achievementsObject



46
47
48
49
50
51
52
# File 'lib/codebadges/site.rb', line 46

def extract_achievements
  @browser.page.xpath(ACHIEVEMENT_XPATH).map do |achievement|
    title = achievement.xpath(ACH_TITLE_XPATH).text
    date = Date.parse(achievement.xpath(ACH_DATE_XPATH).text)
    [title, date]
  end.to_h
end

#extract_main_coursesObject



54
55
56
57
58
# File 'lib/codebadges/site.rb', line 54

def extract_main_courses
  @browser.page.xpath(COURSES_XPATH).map do |course|
    [course.text, URI.join(MAIN_URL, course.attribute('href').value)]
  end.to_h
end

#goto(url) ⇒ Object



34
35
36
# File 'lib/codebadges/site.rb', line 34

def goto(url)
  @browser.get(url)
end

#login(username, password) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/codebadges/site.rb', line 38

def (username, password)
  @browser.page.form do |form|
    form.field(id: USERNAME_TEXTFIELD_ID).value = username
    form.field(id: PASSWORD_TEXTFIELD_ID).value = password
    form.submit
  end
end