comet 0.0.1

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: 29a39a8033839e24d0799a7ed0e8ef05ab1b6aec
4
+ data.tar.gz: c28253878dc3f2d2cef71e496fc808b390c2f25e
5
+ SHA512:
6
+ metadata.gz: 9113ef8c22817330545ec576b50cd2df077ff5163f4072edbde21ce4914352b8bee57e29ffdb9cfcd5e53f76695c67d7437ad58af967258ff017ef90e0e4b555
7
+ data.tar.gz: 97dc7dc5e468a8842556d80a99b82bfa7427379bf25b39e71f1ee29e2c270a937f7a5bf614a676987a85f146c3bf7b7c5ebc2c71dfb4f8f979bcb337f3f5f724
data/README.rdoc ADDED
@@ -0,0 +1,5 @@
1
+ = comet
2
+
3
+ Describe your project here
4
+
5
+ :include:comet.rdoc
data/bin/comet ADDED
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env ruby
2
+ require 'gli'
3
+ require 'yaml'
4
+ require 'comet'
5
+
6
+ include GLI::App
7
+
8
+ program_desc 'Test your Ruby skills! Download Ruby exercises and submit your solutions for grading.'
9
+
10
+ version Comet::VERSION
11
+
12
+ desc 'Initialize the current directory as a comet project directory'
13
+ skips_pre
14
+ command :init do |c|
15
+ c.action do |global_options, options, args|
16
+ answers = {}
17
+
18
+ print 'E-mail: '
19
+ answers['email'] = gets.chomp
20
+
21
+ print 'Token: '
22
+ answers['token'] = gets.chomp
23
+
24
+ print 'Server: '
25
+ answers['server'] = gets.chomp
26
+
27
+ Comet::Init.init_project_dir(Dir.pwd, answers)
28
+ end
29
+ end
30
+
31
+ desc 'List the available challenges'
32
+ command :list do |c|
33
+ c.action do |global_options,options,args|
34
+ challenges = Comet::Challenge.list(@config)
35
+
36
+ if challenges.empty?
37
+ puts "No challenges available."
38
+ else
39
+ challenges.each do |challenge|
40
+ puts "#{challenge[:id]}: #{challenge[:name]}"
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ desc 'Download a challenge'
47
+ command :fetch do |c|
48
+ c.action do |global_options, options, args|
49
+ challenge_id = args.first
50
+ challenge = Comet::Challenge.find(@config, challenge_id)
51
+ directory = challenge.download
52
+
53
+ info = { 'id' => challenge_id.to_i, 'file_name' => "#{challenge.slug}.rb" }
54
+ info_file = File.join(directory, '.challenge')
55
+ File.write(info_file, info.to_yaml)
56
+ end
57
+ end
58
+
59
+ desc 'Submit challenge'
60
+ command :submit do |c|
61
+ c.action do |global_options, options, args|
62
+ info_file = File.join(Dir.pwd, '.challenge')
63
+
64
+ if File.exists?(info_file)
65
+ info = YAML.load(File.read(info_file))
66
+
67
+ challenge_id = info['id']
68
+ solution_file = File.join(Dir.pwd, info['file_name'])
69
+
70
+ if File.exists?(solution_file)
71
+ Comet::API.submit(@config, challenge_id, solution_file)
72
+ else
73
+ puts "Missing solution file (#{solution_file})."
74
+ exit 1
75
+ end
76
+ else
77
+ puts "This is not a challenge directory."
78
+ exit 1
79
+ end
80
+ end
81
+ end
82
+
83
+ pre do |global,command,options,args|
84
+ @config = Comet::Init.find_config(Dir.pwd)
85
+ !@config.nil?
86
+ end
87
+
88
+ post do |global,command,options,args|
89
+ # Post logic here
90
+ # Use skips_post before a command to skip this
91
+ # block on that command only
92
+ end
93
+
94
+ on_error do |exception|
95
+ # Error logic here
96
+ # return false to skip default error handling
97
+ true
98
+ end
99
+
100
+ exit run(ARGV)
data/comet.rdoc ADDED
@@ -0,0 +1,5 @@
1
+ = comet
2
+
3
+ Generate this with
4
+ comet rdoc
5
+ After you have described your command line interface
data/lib/comet/api.rb ADDED
@@ -0,0 +1,74 @@
1
+ require 'net/http'
2
+ require 'json'
3
+
4
+ module Comet
5
+ class API
6
+ def self.get_challenges(config)
7
+ response = request_with_token("http://#{config['server']}/api/v1/challenges.json",
8
+ config['token'])
9
+
10
+ results = JSON.parse(response.body, symbolize_names: true)
11
+ results[:challenges]
12
+ end
13
+
14
+ def self.get_challenge(config, id)
15
+ response = request_with_token("http://#{config['server']}/api/v1/challenges/#{id}.json",
16
+ config['token'])
17
+
18
+ if response.code == '200'
19
+ results = JSON.parse(response.body, symbolize_names: true)
20
+ results[:challenge]
21
+ else
22
+ nil
23
+ end
24
+ end
25
+
26
+ def self.download_archive(download_link, dest)
27
+ uri = URI(download_link)
28
+
29
+ Net::HTTP.start(uri.host, uri.port) do |http|
30
+ resp = http.get(uri.path)
31
+
32
+ open(dest, 'wb') do |file|
33
+ file.write(resp.body)
34
+ end
35
+ end
36
+
37
+ dest
38
+ end
39
+
40
+ def self.submit(config, challenge_id, file_path)
41
+ uri = URI("http://#{config['server']}/api/v1/submissions.json")
42
+ req = Net::HTTP::Post.new(uri)
43
+
44
+ file_name = File.basename(file_path)
45
+ body = File.read(file_path)
46
+
47
+ req['Authorization'] = "Token #{config['token']}"
48
+
49
+ req.set_form_data({
50
+ 'submission[challenge_id]' => challenge_id,
51
+ 'submission[file_name]' => file_name,
52
+ 'submission[body]' => body
53
+ })
54
+
55
+ res = Net::HTTP.start(uri.hostname, uri.port) do |http|
56
+ http.request(req)
57
+ end
58
+ end
59
+
60
+ private
61
+
62
+ def self.request_with_token(url, token)
63
+ uri = URI(url)
64
+
65
+ request = Net::HTTP::Get.new(uri)
66
+ request['Authorization'] = "Token #{token}"
67
+ response = Net::HTTP.start(uri.hostname, uri.port) do |http|
68
+ http.request(request)
69
+ end
70
+
71
+ response
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,34 @@
1
+ class Comet::Challenge
2
+ attr_reader :id, :name, :slug, :download_link, :basedir
3
+
4
+ def initialize(params)
5
+ @id = params[:id]
6
+ @name = params[:name]
7
+ @slug = params[:slug]
8
+ @download_link = params[:download_link]
9
+ @basedir = params[:basedir]
10
+ end
11
+
12
+ def download
13
+ archive = Comet::API.download_archive(download_link, File.join(basedir, "#{slug}.tar.gz"))
14
+ `tar zxf #{archive} -C #{basedir}`
15
+ File.delete(archive)
16
+ File.join(basedir, slug)
17
+ end
18
+
19
+ class << self
20
+ def list(config)
21
+ Comet::API.get_challenges(config)
22
+ end
23
+
24
+ def find(config, id)
25
+ challenge_info = Comet::API.get_challenge(config, id)
26
+
27
+ if challenge_info.nil?
28
+ raise ArgumentError.new("Could not find challenge with id = #{id}")
29
+ else
30
+ Comet::Challenge.new(challenge_info.merge({ basedir: config['basedir'] }))
31
+ end
32
+ end
33
+ end
34
+ end
data/lib/comet/init.rb ADDED
@@ -0,0 +1,42 @@
1
+ require 'yaml'
2
+
3
+ module Comet
4
+ class Init
5
+ class << self
6
+ def find_config(dir)
7
+ config_file = File.join(dir, '.comet')
8
+
9
+ if File.exists?(config_file)
10
+ config = YAML.load(File.read(config_file))
11
+ config.merge({ 'basedir' => dir })
12
+ else
13
+ parent_dir = File.dirname(dir)
14
+
15
+ if parent_dir != '/' && parent_dir != '.'
16
+ find_config(parent_dir)
17
+ else
18
+ nil
19
+ end
20
+ end
21
+ end
22
+
23
+ def init_project_dir(dirname, user_answers)
24
+ config_file = File.join(dirname, '.comet')
25
+
26
+ unless File.exists?(config_file)
27
+ config = {
28
+ 'email' => user_answers['email'],
29
+ 'token' => user_answers['token'],
30
+ 'server' => user_answers['server']
31
+ }
32
+
33
+ File.write(config_file, config.to_yaml)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,3 @@
1
+ module Comet
2
+ VERSION = '0.0.1'
3
+ end
data/lib/comet.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'comet/api.rb'
2
+ require 'comet/challenge.rb'
3
+ require 'comet/version.rb'
4
+ require 'comet/init.rb'
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: comet
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Adam Sheehan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-11 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rdoc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: gli
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.8.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 2.8.1
69
+ description:
70
+ email: adam.sheehan@launchacademy.com
71
+ executables:
72
+ - comet
73
+ extensions: []
74
+ extra_rdoc_files:
75
+ - README.rdoc
76
+ - comet.rdoc
77
+ files:
78
+ - bin/comet
79
+ - lib/comet.rb
80
+ - lib/comet/api.rb
81
+ - lib/comet/challenge.rb
82
+ - lib/comet/init.rb
83
+ - lib/comet/version.rb
84
+ - README.rdoc
85
+ - comet.rdoc
86
+ homepage: http://launchacademy.com
87
+ licenses: []
88
+ metadata: {}
89
+ post_install_message:
90
+ rdoc_options:
91
+ - --title
92
+ - comet
93
+ - --main
94
+ - README.rdoc
95
+ - -ri
96
+ require_paths:
97
+ - lib
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ requirements: []
110
+ rubyforge_project:
111
+ rubygems_version: 2.1.11
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: Command-line interface for downloading and submitting code exercises.
115
+ test_files: []