codebadges 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|