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 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: