tmc-client 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  .DS_Store
2
2
  .DS_Store?
3
- *.gem
3
+ *.gem
4
+ Gemfile.lock
data/.travis.yml CHANGED
@@ -1,8 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 1.8.7
3
4
  - 1.9.3
4
5
  - 2.0.0
5
6
  script: bundle exec rspec specs
6
7
  notifications:
7
- irc: "irc.cc.hut.fi#tmcee"
8
- email: false
8
+ irc: "irc.jippii.fi#tmcee"
9
+ email: false
data/Gemfile CHANGED
@@ -1,9 +1,3 @@
1
1
  source 'https://rubygems.org'
2
- gem 'json'
3
- gem 'faraday'
4
- gem 'pry'
5
- gem 'fileutils'
6
- gem 'mocha'
7
- gem 'highline' # brew install imagemagick
8
- gem 'rake'
9
- gem 'rspec'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,31 @@
1
+ TMC-Client
2
+ ==========
3
+
4
+ [![Build Status](https://travis-ci.org/TMCee/tmc-client.png)](https://travis-ci.org/TMCee/tmc-client)
5
+ [![Code Climate](https://codeclimate.com/github/TMCee/tmc-client.png)](https://codeclimate.com/github/TMCee/tmc-client)
6
+
7
+ TMC-Client is a command line interface for operating with the [TMC-server](http://github.com/testmycode/tmc-server). This client can be used to submit, download, and update exercises.
8
+
9
+ Installation
10
+ ------------
11
+ You may install tmc-client using rubygems `gem install tmc-client`
12
+
13
+
14
+ Commands
15
+ --------
16
+ * `tmc list`, short for `tmc list courses`, lists all available courses for the configured TMC-server
17
+ * `tmc init <coursename>` will initialize a folder for your course to your working directory
18
+ * `tmc list exercises` lists all available exercises for the current working course (working dir)
19
+ * `tmc download <exercisename>` will download all files of the specified exercise to the current course directory
20
+ * `tmc download all` will download all exercises to the working course directory
21
+ * `tmc submit` or `tmc submit <path-of-the-exercise>` will submit the specified exercise or the current working exercise to the server, and the client will wait for a response from the server. If you do not wish to wait for the response, provide the additional argument `--silent` or `-s` or `--quiet` or `-q`.
22
+ * `tmc status` or `tmc status <path-of-the-exercise>` will inquire the server about the status of the exercise, and display a short result summary.
23
+ * `tmc update` or `tmc update <path-of-the-exercise>` will download updates to the specified or working exercise. This will not replace any source files without asking the user first.
24
+ * `tmc solution` or `tmc solution <path-of-the-exercise>` will download model solutions to the specified or working exercise if they are available. Again, the user will be asked for permission per file before replacement.
25
+ * `tmc auth` can be used to manually trigger authentication
26
+ * `tmc get url` displays the server url in use
27
+ * `tmc set url <url>` configures a new server url for TMC-Client, which is persisted for later use.
28
+
29
+ Configuration
30
+ -------------
31
+ All configuration is done via commandline interface. If no server url is given it's asked on startup.
@@ -1,13 +1,13 @@
1
1
  require 'rubygems'
2
2
  require 'highline/import'
3
-
3
+ require 'pry'
4
4
  require 'json'
5
5
  require 'faraday'
6
6
  require 'yaml'
7
- require 'pry'
8
7
  require 'fileutils'
9
8
  require 'tempfile'
10
9
  require 'pp'
10
+ require 'zip/zip'
11
11
  require_relative 'my_config'
12
12
 
13
13
  class Client
@@ -16,21 +16,7 @@ class Client
16
16
  @config = MyConfig.new
17
17
  @output = output
18
18
  @input = input
19
- begin
20
- @config.server_url ||= request_server_url
21
- rescue
22
- request_server_url
23
- end
24
- init_connection()
25
- if @config.auth
26
- begin
27
- @courses = JSON.parse get_courses_json
28
- rescue => e
29
- auth
30
- end
31
- else
32
- output.puts "No username/password. run tmc auth"
33
- end
19
+ setup_client
34
20
  end
35
21
 
36
22
  # stupid name - this should create connection, but not fetch courses.json!
@@ -156,7 +142,6 @@ class Client
156
142
  output.print "Would you like to download all available exercises? Yn"
157
143
  if ["", "y", "Y"].include? @input.gets.strip.chomp
158
144
  Dir.chdir(course_name) do
159
- course = @courses['courses'].select { |course| course['name'] == course_name }.first
160
145
  download_new_exercises
161
146
  end
162
147
  end
@@ -201,7 +186,10 @@ class Client
201
186
  Dir.mktmpdir do |tmpdir|
202
187
  Dir.chdir tmpdir do
203
188
  File.open("tmp.zip", 'wb') {|file| file.write(zip.body)}
204
- `unzip -n tmp.zip && rm tmp.zip`
189
+ #`unzip -n tmp.zip && rm tmp.zip`
190
+ full_path = File.join(Dir.pwd, 'tmp.zip')
191
+ unzip_file(full_path, Dir.pwd, exercise_dir_name)
192
+ `rm tmp.zip`
205
193
  files = Dir.glob('**/*')
206
194
  all_selected = false
207
195
  files.each do |file|
@@ -222,8 +210,6 @@ class Client
222
210
  rescue ArgumentError => e
223
211
  output.puts "An error occurred #{e}"
224
212
  end
225
- elsif input == "b"
226
- binding.pry
227
213
  else
228
214
  output.puts "Skipping file #{file}"
229
215
  end
@@ -243,7 +229,10 @@ class Client
243
229
  Dir.mktmpdir do |tmpdir|
244
230
  Dir.chdir tmpdir do
245
231
  File.open("tmp.zip", 'wb') {|file| file.write(zip.body)}
246
- `unzip -n tmp.zip && rm tmp.zip`
232
+ # `unzip -n tmp.zip && rm tmp.zip`
233
+ full_path = File.join(Dir.pwd, 'tmp.zip')
234
+ unzip_file(full_path, Dir.pwd, exercise_dir_name)
235
+ `rm tmp.zip`
247
236
  files = Dir.glob('**/*')
248
237
 
249
238
  files.each do |file|
@@ -294,7 +283,21 @@ class Client
294
283
  raise "Exercise already downloaded" if File.exists? exercise['name']
295
284
  zip = fetch_zip(exercise['zip_url'])
296
285
  File.open("tmp.zip", 'wb') {|file| file.write(zip.body)}
297
- `unzip -n tmp.zip && rm tmp.zip`
286
+ full_path = File.join(Dir.pwd, 'tmp.zip')
287
+ unzip_file(full_path, Dir.pwd, exercise_dir_name)
288
+ #`unzip -n tmp.zip && rm tmp.zip`
289
+ `rm tmp.zip`
290
+ end
291
+
292
+ def unzip_file (file, destination, exercise_dir_name)
293
+ Zip::ZipFile.open(file) do |zip_file|
294
+ zip_file.each do |f|
295
+ merged_path = f.name.sub(exercise_dir_name.gsub("-", "/"), "")
296
+ f_path=File.join(destination, exercise_dir_name, merged_path)
297
+ FileUtils.mkdir_p(File.dirname(f_path))
298
+ zip_file.extract(f, f_path) unless File.exist?(f_path)
299
+ end
300
+ end
298
301
  end
299
302
 
300
303
  # Filepath can be either relative or absolute
@@ -383,4 +386,23 @@ class Client
383
386
  update_automatically_detected_project_from_zip(exercise['zip_url'], exercise_dir_name, course_dir_name, exercise, course)
384
387
  end
385
388
  end
389
+
390
+ protected
391
+ def setup_client
392
+ begin
393
+ @config.server_url ||= request_server_url
394
+ rescue
395
+ request_server_url
396
+ end
397
+ init_connection()
398
+ if @config.auth
399
+ begin
400
+ @courses = JSON.parse get_courses_json
401
+ rescue => e
402
+ auth
403
+ end
404
+ else
405
+ output.puts "No username/password. run tmc auth"
406
+ end
407
+ end
386
408
  end
data/specs/config.yml ADDED
@@ -0,0 +1,3 @@
1
+ ---
2
+ :server_url: http://0.0.0.0
3
+ :auth: Basic YXNkOmFzZGFzZGFzZGFzZA==
@@ -2,11 +2,20 @@ require_relative '../lib/tmc-client/client.rb'
2
2
  require 'rspec'
3
3
  require 'mocha/setup'
4
4
 
5
+ Client.class_eval do
6
+ def setup_client
7
+ end
8
+ end
9
+
5
10
  describe Client do
6
11
  subject do
7
12
  c = Client.new
8
13
  end
9
14
 
15
+ before(:each) do
16
+ subject.config = MyConfig.new
17
+ end
18
+
10
19
  it "should be able to download a zip" do
11
20
  received_zip_data = mock("faraday_object")
12
21
  received_zip_data.expects(:body).returns(File.read(File.join(File.dirname(File.expand_path(__FILE__)), "ex.zip")))
data/specs/list_spec.rb CHANGED
@@ -7,6 +7,10 @@ describe Client do
7
7
  Client.new
8
8
  end
9
9
 
10
+ before(:each) do
11
+ subject.config = MyConfig.new
12
+ end
13
+
10
14
  it "should print all course names when listing courses" do
11
15
  subject.courses = {"courses" => [{ "name" => "test_course1"}, {"name" => "test_course2" }] }
12
16
  output = mock("output")
data/specs/submit_spec.rb CHANGED
@@ -2,11 +2,20 @@ require_relative '../lib/tmc-client/client.rb'
2
2
  require 'rspec'
3
3
  require 'mocha'
4
4
 
5
+ Client.class_eval do
6
+ def setup_client
7
+ end
8
+ end
9
+
5
10
  describe Client do
6
11
  subject do
7
12
  Client.new
8
13
  end
9
14
 
15
+ before(:each) do
16
+ subject.config = MyConfig.new
17
+ end
18
+
10
19
  its(:current_directory_name) { should == `pwd`.split("/").last.chomp }
11
20
  its(:previous_directory_name) { should == `pwd`.split("/")[-2].chomp }
12
21
 
data/specs/update_spec.rb CHANGED
@@ -2,11 +2,20 @@ require_relative '../lib/tmc-client/client.rb'
2
2
  require 'rspec'
3
3
  require 'mocha/setup'
4
4
 
5
+ Client.class_eval do
6
+ def setup_client
7
+ end
8
+ end
9
+
5
10
  describe Client do
6
11
  subject do
7
12
  c = Client.new
8
13
  end
9
14
 
15
+ before(:each) do
16
+ subject.config = MyConfig.new
17
+ end
18
+
10
19
  after(:each) do
11
20
  `rm -r update_universal_ex`
12
21
  `rm -r update_ex`
data/tmc-client.gemspec CHANGED
@@ -1,10 +1,10 @@
1
1
  Gem::Specification.new do |s|
2
- s.name = 'tmc-client'
3
- s.version = '0.0.1'
2
+ s.name = 'tmc-client'
3
+ s.version = '0.0.2'
4
4
  s.platform = Gem::Platform::RUBY
5
- s.summary = 'TestMyCode Commandline client'
6
- s.authors = ['Jarmo Isotalo', 'Tony Kovanen']
7
- s.homepage = "https://github.com/TMCee/tmc-client/"
5
+ s.summary = 'TestMyCode Commandline client'
6
+ s.authors = ['Jarmo Isotalo', 'Tony Kovanen']
7
+ s.homepage = "https://github.com/TMCee/tmc-client/"
8
8
  s.files = `git ls-files`.split("\n")
9
9
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
10
10
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
@@ -12,13 +12,12 @@ Gem::Specification.new do |s|
12
12
 
13
13
  s.add_dependency "json"
14
14
  s.add_dependency "faraday"
15
- s.add_dependency "pry"
16
15
  s.add_dependency "fileutils"
17
16
  s.add_dependency "mocha"
18
17
  s.add_dependency "highline"
19
18
  s.add_dependency "rake"
20
- s.add_dependency "rspec"
19
+ s.add_dependency "rubyzip"
21
20
 
22
- s.add_development_dependency "rspec", "~> 2.8"
21
+ s.add_development_dependency "rspec"
23
22
 
24
- end
23
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tmc-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-05-03 00:00:00.000000000 Z
13
+ date: 2013-05-06 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: json
@@ -44,22 +44,6 @@ dependencies:
44
44
  - - ! '>='
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
- - !ruby/object:Gem::Dependency
48
- name: pry
49
- requirement: !ruby/object:Gem::Requirement
50
- none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- type: :runtime
56
- prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ! '>='
61
- - !ruby/object:Gem::Version
62
- version: '0'
63
47
  - !ruby/object:Gem::Dependency
64
48
  name: fileutils
65
49
  requirement: !ruby/object:Gem::Requirement
@@ -125,7 +109,7 @@ dependencies:
125
109
  - !ruby/object:Gem::Version
126
110
  version: '0'
127
111
  - !ruby/object:Gem::Dependency
128
- name: rspec
112
+ name: rubyzip
129
113
  requirement: !ruby/object:Gem::Requirement
130
114
  none: false
131
115
  requirements:
@@ -145,17 +129,17 @@ dependencies:
145
129
  requirement: !ruby/object:Gem::Requirement
146
130
  none: false
147
131
  requirements:
148
- - - ~>
132
+ - - ! '>='
149
133
  - !ruby/object:Gem::Version
150
- version: '2.8'
134
+ version: '0'
151
135
  type: :development
152
136
  prerelease: false
153
137
  version_requirements: !ruby/object:Gem::Requirement
154
138
  none: false
155
139
  requirements:
156
- - - ~>
140
+ - - ! '>='
157
141
  - !ruby/object:Gem::Version
158
- version: '2.8'
142
+ version: '0'
159
143
  description:
160
144
  email:
161
145
  executables:
@@ -166,8 +150,7 @@ files:
166
150
  - .gitignore
167
151
  - .travis.yml
168
152
  - Gemfile
169
- - Gemfile.lock
170
- - Readme.md
153
+ - README.md
171
154
  - bin/tmc-client
172
155
  - lib/tmc-client.rb
173
156
  - lib/tmc-client/client.rb
@@ -175,6 +158,7 @@ files:
175
158
  - lib/tmc-client/config.yml
176
159
  - lib/tmc-client/my_config.rb
177
160
  - lib/tmc-client/old-client.rb
161
+ - specs/config.yml
178
162
  - specs/download_spec.rb
179
163
  - specs/ex.zip
180
164
  - specs/list_spec.rb
@@ -183,7 +167,6 @@ files:
183
167
  - specs/update_spec.rb
184
168
  - specs/update_universal_ex.zip
185
169
  - tmc
186
- - tmc-client-0.0.1.gem
187
170
  - tmc-client.gemspec
188
171
  homepage: https://github.com/TMCee/tmc-client/
189
172
  licenses: []
data/Gemfile.lock DELETED
@@ -1,44 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- coderay (1.0.9)
5
- diff-lcs (1.1.3)
6
- faraday (0.8.7)
7
- multipart-post (~> 1.1)
8
- fileutils (0.7)
9
- rmagick (>= 2.13.1)
10
- highline (1.6.18)
11
- json (1.7.7)
12
- metaclass (0.0.1)
13
- method_source (0.8.1)
14
- mocha (0.13.3)
15
- metaclass (~> 0.0.1)
16
- multipart-post (1.2.0)
17
- pry (0.9.12)
18
- coderay (~> 1.0.5)
19
- method_source (~> 0.8)
20
- slop (~> 3.4)
21
- rake (10.0.4)
22
- rmagick (2.13.2)
23
- rspec (2.12.0)
24
- rspec-core (~> 2.12.0)
25
- rspec-expectations (~> 2.12.0)
26
- rspec-mocks (~> 2.12.0)
27
- rspec-core (2.12.2)
28
- rspec-expectations (2.12.1)
29
- diff-lcs (~> 1.1.3)
30
- rspec-mocks (2.12.2)
31
- slop (3.4.4)
32
-
33
- PLATFORMS
34
- ruby
35
-
36
- DEPENDENCIES
37
- faraday
38
- fileutils
39
- highline
40
- json
41
- mocha
42
- pry
43
- rake
44
- rspec
data/Readme.md DELETED
File without changes