codebadges 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +7 -0
- data/README.md +24 -0
- data/Rakefile +8 -0
- data/bin/codebadges +14 -0
- data/codebadges.gemspec +23 -0
- data/lib/codebadges/badges.rb +44 -0
- data/lib/codebadges/version.rb +4 -0
- data/lib/codebadges.rb +1 -0
- data/spec/badges_test.rb +36 -0
- data/spec/badges_test_000.rb +53 -0
- metadata +116 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 41f4fabbea75edce70d7269d962a0efb385d9dc8
|
4
|
+
data.tar.gz: fa6cff513a7a7788667defedb1c16b73cd4dd66b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a0aabde0dd53666f092a1e37e3a18710d045c1608d2eaf5c1eee7e5249fc27da5a8b69d7981e1b3bf43e4a34c8952091b01e6ec56d17d15c5afe3ffeece3d826
|
7
|
+
data.tar.gz: 55e16b2cb8f15e7a9ab55dea145d1f4a365d387f5d09fbe5299c85215715d657ff382f547741b5ac710e3521de6308f677253492add10ca6a41226cee2533b3f
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
*.gem
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
CodeBadges
|
2
|
+
===============
|
3
|
+
|
4
|
+
CodeBadges. It tries to grabs some information on the Codecademy. What it grab? Badges!
|
5
|
+
|
6
|
+
## About
|
7
|
+
|
8
|
+
Once you done a section of course on the Codecademy(The online programming tutorial), you will get a badges.
|
9
|
+
The gem is to understand that what course and the level the user take on the Codecademy.
|
10
|
+
|
11
|
+
## Usage
|
12
|
+
|
13
|
+
Install it with the following command:
|
14
|
+
````ruby
|
15
|
+
gem install codebadges
|
16
|
+
````
|
17
|
+
|
18
|
+
Then in your file:
|
19
|
+
````ruby
|
20
|
+
require "codebadges"
|
21
|
+
CodecademyBadges.get_badges(username)
|
22
|
+
````
|
23
|
+
The argument username is the user's account who you want to check it out!
|
24
|
+
````
|
data/Rakefile
ADDED
data/bin/codebadges
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require '../lib/codebadges'
|
4
|
+
|
5
|
+
fail ArgumentError, "Usage: badges [username]\n" if ARGV.count == 0
|
6
|
+
user_name = ARGV[0]
|
7
|
+
|
8
|
+
badges_found = CodecademyBadges.get_badges(user_name)
|
9
|
+
|
10
|
+
puts "#{user_name} has collected #{badges_found.size} badges."
|
11
|
+
|
12
|
+
badges_found.each do |title, date|
|
13
|
+
puts "Earned '#{title}' on #{date}."
|
14
|
+
end
|
data/codebadges.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
require 'codebadges/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = 'codebadges'
|
6
|
+
s.version = CodeBadges::VERSION
|
7
|
+
s.executables << 'codebadges'
|
8
|
+
|
9
|
+
s.date = '2014-09-03'
|
10
|
+
s.summary = 'Grab the badges information from the Codecademy'
|
11
|
+
s.description = 'Use username as an input, automatically give you the badges the user has.'
|
12
|
+
s.authors = ['Lee Chen', 'Soumya Ray']
|
13
|
+
s.email = 'chung1350@hotmail.com'
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.homepage = 'https://github.com/ISS-SOA/Codecademy-Ruby'
|
17
|
+
s.license = 'MIT'
|
18
|
+
|
19
|
+
s.add_development_dependency 'minitest'
|
20
|
+
s.add_development_dependency 'minitest-rg'
|
21
|
+
s.add_runtime_dependency 'nokogiri', '>= 1.6.2' # v.1.6.2 has documented problems
|
22
|
+
s.add_runtime_dependency 'open-uri'
|
23
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'date'
|
4
|
+
# Author: Lee Chen (mailto: chung1350@hotmail.com)
|
5
|
+
# License: MIT
|
6
|
+
module CodeBadges
|
7
|
+
# This class get the user account as an input
|
8
|
+
# return a hash of user's badges information
|
9
|
+
class CodecademyBadges
|
10
|
+
TITLE_XPATH = "//div[@class = 'grid-row']//h5[@class = 'margin-top--1']"
|
11
|
+
DATE_XPATH = "//small[@class = 'text--ellipsis']"
|
12
|
+
USERS_URL = 'http://www.codecademy.com/users'
|
13
|
+
ACHIEVEMENTS_DIR = 'achievements'
|
14
|
+
|
15
|
+
def self.get_badges(username)
|
16
|
+
doc = get_html(username)
|
17
|
+
titles = get_titles(doc)
|
18
|
+
dates = get_dates(doc)
|
19
|
+
integrate(titles, dates)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.get_html(username)
|
23
|
+
url = "#{USERS_URL}/#{username}/#{ACHIEVEMENTS_DIR}"
|
24
|
+
Nokogiri::HTML(open(url))
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.get_titles(document)
|
28
|
+
titles = document.xpath(TITLE_XPATH)
|
29
|
+
titles.map { |t| t.text }
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.get_dates(document)
|
33
|
+
dates = document.xpath(DATE_XPATH)
|
34
|
+
dates.map { |d| Date.parse(d) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.integrate(titles, dates)
|
38
|
+
badge_array = titles.each_with_index.map do |_, index|
|
39
|
+
[titles[index], dates[index]]
|
40
|
+
end
|
41
|
+
Hash[badge_array]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/codebadges.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'codebadges/badges.rb'
|
data/spec/badges_test.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/rg'
|
3
|
+
require './lib/codebadges.rb'
|
4
|
+
|
5
|
+
badge = {
|
6
|
+
'Sorting Your Friends' => 'May 18, 2014',
|
7
|
+
'100 Exercises' => 'May 18, 2014',
|
8
|
+
'Max Streak Count of 3' => 'May 11, 2014',
|
9
|
+
'Design a Button for Your Website' => 'May 9, 2014',
|
10
|
+
'CSS: An Overview' => 'May 9, 2014',
|
11
|
+
'Build Your Own Webpage' => 'May 9, 2014',
|
12
|
+
'50 Exercises' => 'May 9, 2014',
|
13
|
+
'Clickable Photo Page' => 'May 9, 2014',
|
14
|
+
'HTML Basics III' => 'May 9, 2014',
|
15
|
+
'25 points earned in one day' => 'May 9, 2014',
|
16
|
+
'HTML Basics' => 'May 9, 2014',
|
17
|
+
'25 Exercises' => 'May 9, 2014',
|
18
|
+
'10 Exercises' => 'Dec 12, 2012',
|
19
|
+
'Max Streak Count of 1' => 'Dec 12, 2012',
|
20
|
+
'First Lesson' => 'Jun 20, 2012'
|
21
|
+
}
|
22
|
+
|
23
|
+
badges_found = CodeBadges::CodecademyBadges.get_badges('soumya.ray')
|
24
|
+
|
25
|
+
describe 'Get all the badges' do
|
26
|
+
|
27
|
+
it 'has the right number of badges' do
|
28
|
+
badges_found.size.must_equal badge.size
|
29
|
+
end
|
30
|
+
|
31
|
+
badge.map do |b_name, b_date|
|
32
|
+
it "finds '#{b_name}' badge" do
|
33
|
+
badges_found[b_name].must_equal Date.parse(b_date)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# NOTE: incomplete -- This style of testing is too slow and takes too long!
|
2
|
+
# look at badges_test.rb for more optimzed version
|
3
|
+
|
4
|
+
require 'minitest/autorun'
|
5
|
+
require 'minitest/rg'
|
6
|
+
require './badges.rb'
|
7
|
+
|
8
|
+
badge = {
|
9
|
+
'Sorting Your Friends' => 'May 18, 2014',
|
10
|
+
'100 Exercises' => 'May 18, 2014',
|
11
|
+
'Max Streak Count of 3' => 'May 11, 2014',
|
12
|
+
'Design a Button for Your Website' => 'May 9, 2014',
|
13
|
+
'CSS: An Overview' => 'May 9, 2014',
|
14
|
+
'Build Your Own Webpage' => 'May 9, 2014',
|
15
|
+
'50 Exercises' => 'May 9, 2014',
|
16
|
+
'Clickable Photo Page' => 'May 9, 2014',
|
17
|
+
'HTML Basics III' => 'May 9, 2014',
|
18
|
+
'25 points earned in one day' => 'May 9, 2014',
|
19
|
+
'HTML Basics' => 'May 9, 2014',
|
20
|
+
'25 Exercises' => 'May 9, 2014',
|
21
|
+
'10 Exercises' => 'Dec 12, 2012',
|
22
|
+
'Max Streak Count of 1' => 'Dec 12, 2012',
|
23
|
+
'First Lesson' => 'Jun 20, 2012'
|
24
|
+
}
|
25
|
+
|
26
|
+
describe "Get all the badges" do
|
27
|
+
|
28
|
+
before do
|
29
|
+
@badges_found = CodecademyBadges.get_badges('soumya.ray')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'has the right number of badges' do
|
33
|
+
@badges_found.size.must_equal badge.size
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'finds "Sorting Your Friends" badge' do
|
37
|
+
@badges_found['Sorting Your Friends'].must_equal badge['Sorting Your Friends']
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'finds "100 Exercises" badge' do
|
41
|
+
@badges_found['100 Exercises'].must_equal badge['100 Exercises']
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'finds "Max Streak Count of 3" badge' do
|
45
|
+
@badges_found['Max Streak Count of 3'].must_equal badge['Max Streak Count of 3']
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'finds "Design a Button for Your Website" badge' do
|
49
|
+
@badges_found['Design a Button for Your Website'].must_equal badge['Design a Button for Your Website']
|
50
|
+
end
|
51
|
+
|
52
|
+
# TODO: make writing these tests easier and running these tests faster!
|
53
|
+
end
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: codebadges
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Lee Chen
|
8
|
+
- Soumya Ray
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-09-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: minitest
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: minitest-rg
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: nokogiri
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 1.6.2
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.6.2
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: open-uri
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
description: Use username as an input, automatically give you the badges the user
|
71
|
+
has.
|
72
|
+
email: chung1350@hotmail.com
|
73
|
+
executables:
|
74
|
+
- codebadges
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- ".gitignore"
|
79
|
+
- Gemfile
|
80
|
+
- README.md
|
81
|
+
- Rakefile
|
82
|
+
- bin/codebadges
|
83
|
+
- codebadges.gemspec
|
84
|
+
- lib/codebadges.rb
|
85
|
+
- lib/codebadges/badges.rb
|
86
|
+
- lib/codebadges/version.rb
|
87
|
+
- spec/badges_test.rb
|
88
|
+
- spec/badges_test_000.rb
|
89
|
+
homepage: https://github.com/ISS-SOA/Codecademy-Ruby
|
90
|
+
licenses:
|
91
|
+
- MIT
|
92
|
+
metadata: {}
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
requirements: []
|
108
|
+
rubyforge_project:
|
109
|
+
rubygems_version: 2.2.2
|
110
|
+
signing_key:
|
111
|
+
specification_version: 4
|
112
|
+
summary: Grab the badges information from the Codecademy
|
113
|
+
test_files:
|
114
|
+
- spec/badges_test.rb
|
115
|
+
- spec/badges_test_000.rb
|
116
|
+
has_rdoc:
|