codebadges 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'rake'
7
+ end
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
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ task :default => [:spec]
4
+
5
+ desc 'Run specs'
6
+ task :spec do
7
+ sh 'ruby -I lib spec/badges_test.rb'
8
+ end
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
@@ -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
@@ -0,0 +1,4 @@
1
+ # Versioning
2
+ module CodeBadges
3
+ VERSION = '0.1.0'
4
+ end
data/lib/codebadges.rb ADDED
@@ -0,0 +1 @@
1
+ require 'codebadges/badges.rb'
@@ -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: