codersdojo 0.9.7 → 0.9.8

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.
@@ -0,0 +1,27 @@
1
+ require 'state_reader'
2
+ require 'filename_formatter'
3
+
4
+ describe StateReader do
5
+
6
+ before (:each) do
7
+ @a_time = Time.new
8
+ @shell_mock = mock
9
+ @state_reader = StateReader.new @shell_mock
10
+ @state_reader.session_id = "id0815"
11
+ @state_dir_prefix = FilenameFormatter.state_dir_prefix
12
+ end
13
+
14
+ it "should read a stored kata state" do
15
+ @shell_mock.should_receive(:ctime).with("#{@state_dir_prefix}0").and_return @a_time
16
+ Dir.should_receive(:entries).with("#{@state_dir_prefix}0").and_return(['.','..','file.rb', 'result.txt'])
17
+ @shell_mock.should_receive(:read_file).with("#{@state_dir_prefix}0/file.rb").and_return "source code"
18
+ @shell_mock.should_receive(:read_file).with("#{@state_dir_prefix}0/result.txt").and_return "result"
19
+ state = @state_reader.read_next_state
20
+ state.time.should == @a_time
21
+ state.code.should == "source code"
22
+ state.result.should == "result"
23
+ @state_reader.next_step.should == 1
24
+ end
25
+
26
+ end
27
+
@@ -0,0 +1,78 @@
1
+ require 'uploader'
2
+
3
+ describe Uploader do
4
+
5
+ before (:each) do
6
+ @state_reader_mock = mock StateReader
7
+ end
8
+
9
+ it "should convert session-dir to session-id" do
10
+ @state_reader_mock.should_receive(:session_id=).with("session_id")
11
+ Uploader.new "http://dummy_host", "dummy.framework", ".codersdojo/session_id", @state_reader_mock
12
+ end
13
+
14
+ context'upload' do
15
+
16
+ before (:each) do
17
+ @state_reader_mock = mock StateReader
18
+ @state_reader_mock.should_receive(:session_id=).with("path_to_kata")
19
+ @uploader = Uploader.new "http://dummy_host", "dummy.framework", "path_to_kata", @state_reader_mock
20
+ end
21
+
22
+ it "should upload a kata through a rest-interface" do
23
+ RestClient.should_receive(:post).with('http://dummy_host/katas', {:framework => "dummy.framework"}).and_return '<id>222</id>'
24
+ @uploader.upload_kata
25
+ end
26
+
27
+ it "should upload kata and states" do
28
+ @uploader.stub(:upload_kata).and_return 'kata_xml'
29
+ XMLElementExtractor.should_receive(:extract).with('kata/id', 'kata_xml').and_return 'kata_id'
30
+ @uploader.stub(:upload_states).with 'kata_id'
31
+ XMLElementExtractor.should_receive(:extract).with('kata/short-url', 'kata_xml').and_return 'short_url'
32
+ @uploader.upload_kata_and_states
33
+ end
34
+
35
+ it 'should upload if enugh states are there' do
36
+ @state_reader_mock.should_receive(:enough_states?).and_return 'true'
37
+ @uploader.stub!(:upload_kata_and_states).and_return 'kata_link'
38
+ @uploader.upload
39
+ end
40
+
41
+ it 'should return a helptext if not enught states are there' do
42
+ @state_reader_mock.should_receive(:enough_states?).and_return nil
43
+ help_text = @uploader.upload
44
+ help_text.should == 'You need at least two states'
45
+ end
46
+
47
+ context 'states' do
48
+ it "should read all states and starts/ends progress" do
49
+ @state_reader_mock.should_receive(:state_count).and_return(1)
50
+ Progress.should_receive(:write_empty_progress).with(1)
51
+
52
+ @state_reader_mock.should_receive(:has_next_state).and_return 'true'
53
+ @uploader.should_receive(:upload_state)
54
+ @state_reader_mock.should_receive(:has_next_state).and_return nil
55
+
56
+ Progress.should_receive(:end)
57
+
58
+ @uploader.upload_states "kata_id"
59
+ end
60
+
61
+
62
+ it "through a rest interface and log process" do
63
+ state = mock State
64
+ @state_reader_mock.should_receive(:read_next_state).and_return state
65
+ state.should_receive(:code).and_return 'code'
66
+ state.should_receive(:time).and_return 'time'
67
+ state.should_receive(:result).and_return 'result'
68
+ RestClient.should_receive(:post).with('http://dummy_host/katas/kata_id/states', {:code=> 'code', :result => 'result', :created_at => 'time'})
69
+ Progress.should_receive(:next)
70
+ @uploader.upload_state "kata_id"
71
+ end
72
+
73
+ end
74
+
75
+ end
76
+
77
+ end
78
+
@@ -0,0 +1,12 @@
1
+ require "xml_element_extractor"
2
+
3
+ describe XMLElementExtractor do
4
+
5
+ it "should extract first element from a xml string" do
6
+ xmlString = "<?xml version='1.0' encoding='UTF-8'?>\n<kata>\n <created-at type='datetime'>2010-07-16T16:02:00+02:00</created-at>\n <end-date type='datetime' nil='true'/>\n <id type='integer'>60</id>\n <short-url nil='true'/>\n <updated-at type='datetime'>2010-07-16T16:02:00+02:00</updated-at>\n <uuid>2a5a83dc71b8ad6565bd99f15d01e41ec1a8f3f2</uuid>\n</kata>\n"
7
+ element = XMLElementExtractor.extract 'kata/id', xmlString
8
+ element.should == "60"
9
+ end
10
+
11
+ end
12
+
@@ -0,0 +1,10 @@
1
+ You have to create two shell scripts manually:
2
+ Create a shell script run-once.%sh% that runs the tests of your kata once.
3
+
4
+ Create a second shell script run-endless.sh with this content:
5
+ #{$0} start run-once.%sh% #{kata_file}.<extension>
6
+
7
+ Run run-endless.%sh% and start your kata.
8
+
9
+ Assumptions:
10
+ - The whole kata source code is in the one #{kata_file}.<extension>.
@@ -0,0 +1,2 @@
1
+ echo "Modify run-endless.sh so that it uses your actual kata file."
2
+ #codersdojo start run-once.sh #{kata_file}
@@ -0,0 +1 @@
1
+ echo "Modify shell script run-once.sh so that it runs your tests once."
@@ -0,0 +1,12 @@
1
+ You have to create two shell scripts manually:
2
+ Create a shell script run-once.%sh% with this content:
3
+ java -cp clojure-contrib.jar%:%clojure.jar clojure.main #{kata_file}.clj
4
+
5
+ Create a second shell script run-endless.sh with this content:
6
+ #{$0} start run-once.%sh% #{kata_file}.clj
7
+
8
+ Run run-endless.%sh% and start your kata.
9
+
10
+ Assumptions:
11
+ - Java is installed on your system and 'java' is in the path.
12
+ - clojure.jar and clojure-contrib.jar are placed in your work directory.
@@ -0,0 +1 @@
1
+ codersdojo start run-once.sh prime.clj
@@ -0,0 +1,2 @@
1
+ echo "Modify shell script run-once.sh so that it runs your tests once."
2
+ # java -cp lib/clojure-contrib.jar:/System/Library/Frameworks/Clojure/clojure.jar clojure.main #{kata_file}
@@ -0,0 +1,20 @@
1
+ You have to create two shell scripts manually:
2
+ Create a shell script run-once.%sh% with this content:
3
+ %rm% bin/#{kata_file}.class
4
+ javac -cp lib/junit.jar -d bin #{kata_file}.java
5
+ java -cp lib/junit.jar%:%bin #{kata_file}
6
+
7
+ Create a second shell script run-endless.sh with this content:
8
+ #{$0} start run-once.%sh% src/#{kata_file}.java
9
+
10
+ Run run-endless.%sh% and start your kata.
11
+
12
+ Assumptions:
13
+ - A Java JDK is installed on your system and 'java' and 'javac' are in the path.
14
+ - junit.jar is placed in a directory named 'lib'.
15
+ - The kata source file is placed in the 'src' directory.
16
+ - The kata class file is generated into the 'class' directory.
17
+ - In the source file the classes are placed in the default package.
18
+ - The kata source file has a main method that starts the tests.
19
+ - If your IDE (like Eclipse) compiles the source file, you should remove the first two lines
20
+ in the run-once.%sh% file.
@@ -0,0 +1 @@
1
+ ruby ../../app/personal_codersdojo.rb start run-once.sh src/PrimeTest.java
@@ -0,0 +1,3 @@
1
+ rm bin/PrimeTest.class
2
+ javac -cp lib/junit.jar -d bin src/PrimeTest.java
3
+ java -cp lib/junit.jar:bin PrimeTest
@@ -0,0 +1,8 @@
1
+ You have to create two shell scripts manually:
2
+ Create a shell script run-once.%sh% with this content:
3
+ jspec --rhino run
4
+
5
+ Create a second shell script run-endless.sh with this content:
6
+ #{$0} start run-once.%sh% #{kata_file}.js
7
+
8
+ Run run-endless.%sh% and start your kata.
@@ -0,0 +1,8 @@
1
+ You have to create two shell scripts manually:
2
+ Create a shell script run-once.%sh% with this content:
3
+ python #{kata_file}.py
4
+
5
+ Create a second shell script run-endless.sh with this content:
6
+ #{$0} start run-once.%sh% #{kata_file}.py
7
+
8
+ Run run-endless.%sh% and start your kata.
@@ -0,0 +1,5 @@
1
+ You have to create one shell script manually:
2
+ Create a shell script run-endless.%sh% with this content:
3
+ #{$0} start ruby #{kata_file}.rb
4
+
5
+ Run run-endless.%sh% and start your kata.
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codersdojo
3
3
  version: !ruby/object:Gem::Version
4
- hash: 53
4
+ hash: 43
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 7
10
- version: 0.9.7
9
+ - 8
10
+ version: 0.9.8
11
11
  platform: ruby
12
12
  authors:
13
13
  - CodersDojo-Team
@@ -41,8 +41,39 @@ extensions: []
41
41
  extra_rdoc_files: []
42
42
 
43
43
  files:
44
+ - app/argument_parser.rb
44
45
  - app/codersdojo.rb
45
- - spec/codersdojo_spec.rb
46
+ - app/console_view.rb
47
+ - app/controller.rb
48
+ - app/filename_formatter.rb
49
+ - app/progress.rb
50
+ - app/runner.rb
51
+ - app/scheduler.rb
52
+ - app/session_id_generator.rb
53
+ - app/shell_wrapper.rb
54
+ - app/state_reader.rb
55
+ - app/uploader.rb
56
+ - app/xml_element_extractor.rb
57
+ - templates/any/README
58
+ - templates/any/run-endless.sh
59
+ - templates/any/run-once.sh
60
+ - templates/clojure.is-test/lib/clojure-contrib.jar
61
+ - templates/clojure.is-test/README
62
+ - templates/clojure.is-test/run-endless.sh
63
+ - templates/clojure.is-test/run-once.sh
64
+ - templates/java.junit/README
65
+ - templates/java.junit/run-endless.sh
66
+ - templates/java.junit/run-once.sh
67
+ - templates/javascript.jspec/README
68
+ - templates/python.unittest/README
69
+ - templates/ruby.test-unit/README
70
+ - spec/argument_parser_spec.rb
71
+ - spec/progress_spec.rb
72
+ - spec/runner_spec.rb
73
+ - spec/session_id_generator_spec.rb
74
+ - spec/state_reader_spec.rb
75
+ - spec/uploader_spec.rb
76
+ - spec/xml_element_extractor_spec.rb
46
77
  - bin/codersdojo
47
78
  has_rdoc: true
48
79
  homepage: http://www.codersdojo.org/
@@ -79,4 +110,10 @@ signing_key:
79
110
  specification_version: 3
80
111
  summary: Client for CodersDojo.org
81
112
  test_files:
82
- - spec/codersdojo_spec.rb
113
+ - spec/argument_parser_spec.rb
114
+ - spec/progress_spec.rb
115
+ - spec/runner_spec.rb
116
+ - spec/session_id_generator_spec.rb
117
+ - spec/state_reader_spec.rb
118
+ - spec/uploader_spec.rb
119
+ - spec/xml_element_extractor_spec.rb
@@ -1,265 +0,0 @@
1
- ARGV[0] = "spec" # to be first line to suppress help text output of shell command
2
- require "app/codersdojo"
3
- require "restclient"
4
- require "spec"
5
-
6
-
7
- describe Runner, "in run mode" do
8
-
9
- WORKSPACE_DIR = ".codersdojo"
10
- SESSION_ID = "id0815"
11
- SESSION_DIR = "#{WORKSPACE_DIR}/#{SESSION_ID}"
12
- STATE_DIR_PREFIX = "#{SESSION_DIR}/state_"
13
-
14
- before (:each) do
15
- @shell_mock = mock.as_null_object
16
- @session_id_provider_mock = mock.as_null_object
17
- @session_id_provider_mock.should_receive(:generate_id).and_return SESSION_ID
18
- @runner = Runner.new @shell_mock, @session_id_provider_mock
19
- @runner.file = "my_file.rb"
20
- @runner.run_command = "ruby"
21
- end
22
-
23
- it "should create codersdojo directory if it doesn't exist with session sub-directory" do
24
- @shell_mock.should_receive(:mkdir_p).with SESSION_DIR
25
- @runner.start
26
- end
27
-
28
- it "should run ruby command on kata file given as argument" do
29
- @shell_mock.should_receive(:execute).with "ruby my_file.rb"
30
- @runner.start
31
- end
32
-
33
- it "should create a state directory for every state" do
34
- @shell_mock.should_receive(:ctime).with("my_file.rb").and_return 1
35
- @shell_mock.should_receive(:mkdir).with "#{STATE_DIR_PREFIX}0"
36
- @shell_mock.should_receive(:cp).with "my_file.rb", "#{STATE_DIR_PREFIX}0"
37
- @runner.start
38
- @shell_mock.should_receive(:ctime).with("my_file.rb").and_return 2
39
- @shell_mock.should_receive(:mkdir).with "#{STATE_DIR_PREFIX}1"
40
- @shell_mock.should_receive(:cp).with "my_file.rb", "#{STATE_DIR_PREFIX}1"
41
- @runner.execute
42
- end
43
-
44
- it "should not run if the kata file wasn't modified" do
45
- a_time = Time.new
46
- @shell_mock.should_receive(:ctime).with("my_file.rb").and_return a_time
47
- @shell_mock.should_receive(:mkdir).with "#{STATE_DIR_PREFIX}0"
48
- @shell_mock.should_receive(:cp).with "my_file.rb", "#{STATE_DIR_PREFIX}0"
49
- @runner.start
50
- @shell_mock.should_receive(:ctime).with("my_file.rb").and_return a_time
51
- @shell_mock.should_not_receive(:mkdir).with "#{STATE_DIR_PREFIX}1"
52
- @shell_mock.should_not_receive(:cp).with "my_file.rb", "#{STATE_DIR_PREFIX}1"
53
- @runner.execute
54
- end
55
-
56
- it "should capture run result into state directory" do
57
- @shell_mock.should_receive(:execute).and_return "spec result"
58
- @shell_mock.should_receive(:write_file).with "#{STATE_DIR_PREFIX}0/result.txt", "spec result"
59
- @runner.start
60
- end
61
-
62
- end
63
-
64
-
65
- describe SessionIdGenerator do
66
-
67
- before (:each) do
68
- @time_mock = mock
69
- @generator = SessionIdGenerator.new
70
- end
71
-
72
- it "should format id as yyyy-mm-dd_hh-mm-ss" do
73
- @time_mock.should_receive(:year).and_return 2010
74
- @time_mock.should_receive(:month).and_return 8
75
- @time_mock.should_receive(:day).and_return 7
76
- @time_mock.should_receive(:hour).and_return 6
77
- @time_mock.should_receive(:min).and_return 5
78
- @time_mock.should_receive(:sec).and_return 0
79
- @generator.generate_id(@time_mock).should == "2010-08-07_06-05-00"
80
- end
81
-
82
- end
83
-
84
- describe StateReader do
85
-
86
- before (:each) do
87
- @a_time = Time.new
88
- @shell_mock = mock
89
- @state_reader = StateReader.new @shell_mock
90
- @state_reader.session_id = "id0815"
91
- end
92
-
93
- it "should read a stored kata state" do
94
- @shell_mock.should_receive(:ctime).with("#{STATE_DIR_PREFIX}0").and_return @a_time
95
- Dir.should_receive(:entries).with("#{STATE_DIR_PREFIX}0").and_return(['.','..','file.rb', 'result.txt'])
96
- @shell_mock.should_receive(:read_file).with("#{STATE_DIR_PREFIX}0/file.rb").and_return "source code"
97
- @shell_mock.should_receive(:read_file).with("#{STATE_DIR_PREFIX}0/result.txt").and_return "result"
98
- state = @state_reader.read_next_state
99
- state.time.should == @a_time
100
- state.code.should == "source code"
101
- state.result.should == "result"
102
- @state_reader.next_step.should == 1
103
- end
104
-
105
- end
106
-
107
- describe Uploader do
108
-
109
- before (:each) do
110
- @state_reader_mock = mock StateReader
111
- end
112
-
113
- it "should convert session-dir to session-id" do
114
- @state_reader_mock.should_receive(:session_id=).with("session_id")
115
- Uploader.new "http://dummy_host", "dummy.framework", ".codersdojo/session_id", @state_reader_mock
116
- end
117
-
118
- context'upload' do
119
-
120
- before (:each) do
121
- @state_reader_mock = mock StateReader
122
- @state_reader_mock.should_receive(:session_id=).with("path_to_kata")
123
- @uploader = Uploader.new "http://dummy_host", "dummy.framework", "path_to_kata", @state_reader_mock
124
- end
125
-
126
- it "should upload a kata through a rest-interface" do
127
- RestClient.should_receive(:post).with('http://dummy_host/katas', {:framework => "dummy.framework"}).and_return '<id>222</id>'
128
- @uploader.upload_kata
129
- end
130
-
131
- it "should upload kata and states" do
132
- @uploader.stub(:upload_kata).and_return 'kata_xml'
133
- XMLElementExtractor.should_receive(:extract).with('kata/id', 'kata_xml').and_return 'kata_id'
134
- @uploader.stub(:upload_states).with 'kata_id'
135
- XMLElementExtractor.should_receive(:extract).with('kata/short-url', 'kata_xml').and_return 'short_url'
136
- @uploader.upload_kata_and_states
137
- end
138
-
139
- it 'should upload if enugh states are there' do
140
- @state_reader_mock.should_receive(:enough_states?).and_return 'true'
141
- @uploader.stub!(:upload_kata_and_states).and_return 'kata_link'
142
- @uploader.upload
143
- end
144
-
145
- it 'should return a helptext if not enught states are there' do
146
- @state_reader_mock.should_receive(:enough_states?).and_return nil
147
- help_text = @uploader.upload
148
- help_text.should == 'You need at least two states'
149
- end
150
-
151
- context 'states' do
152
- it "should read all states and starts/ends progress" do
153
- @state_reader_mock.should_receive(:state_count).and_return(1)
154
- Progress.should_receive(:write_empty_progress).with(1)
155
-
156
- @state_reader_mock.should_receive(:has_next_state).and_return 'true'
157
- @uploader.should_receive(:upload_state)
158
- @state_reader_mock.should_receive(:has_next_state).and_return nil
159
-
160
- Progress.should_receive(:end)
161
-
162
- @uploader.upload_states "kata_id"
163
- end
164
-
165
-
166
- it "through a rest interface and log process" do
167
- state = mock State
168
- @state_reader_mock.should_receive(:read_next_state).and_return state
169
- state.should_receive(:code).and_return 'code'
170
- state.should_receive(:time).and_return 'time'
171
- state.should_receive(:result).and_return 'result'
172
- RestClient.should_receive(:post).with('http://dummy_host/katas/kata_id/states', {:code=> 'code', :result => 'result', :created_at => 'time'})
173
- Progress.should_receive(:next)
174
- @uploader.upload_state "kata_id"
175
- end
176
-
177
- end
178
-
179
- end
180
-
181
- end
182
-
183
- describe XMLElementExtractor do
184
-
185
- it "should extract first element from a xml string" do
186
- xmlString = "<?xml version='1.0' encoding='UTF-8'?>\n<kata>\n <created-at type='datetime'>2010-07-16T16:02:00+02:00</created-at>\n <end-date type='datetime' nil='true'/>\n <id type='integer'>60</id>\n <short-url nil='true'/>\n <updated-at type='datetime'>2010-07-16T16:02:00+02:00</updated-at>\n <uuid>2a5a83dc71b8ad6565bd99f15d01e41ec1a8f3f2</uuid>\n</kata>\n"
187
- element = XMLElementExtractor.extract 'kata/id', xmlString
188
- element.should == "60"
189
- end
190
-
191
- end
192
-
193
- describe ArgumentParser do
194
-
195
- before (:each) do
196
- @controller_mock = mock.as_null_object
197
- @parser = ArgumentParser.new @controller_mock
198
- end
199
-
200
- it "should reject empty command" do
201
- lambda{@parser.parse []}.should raise_error
202
- end
203
-
204
- it "should reject unknown command" do
205
- lambda{@parser.parse "unknown command"}.should raise_error
206
- end
207
-
208
- it "should accept help command" do
209
- @controller_mock.should_receive(:help).with(nil)
210
- @parser.parse ["help"]
211
- end
212
-
213
- it "should accept start command" do
214
- @controller_mock.should_receive(:start).with "aCommand", "aFile"
215
- @parser.parse ["start", "aCommand","aFile"]
216
- end
217
-
218
- it "should prepend *.sh start scripts with 'bash'" do
219
- @controller_mock.should_receive(:start).with "bash aCommand.sh", "aFile"
220
- @parser.parse ["start", "aCommand.sh","aFile"]
221
- end
222
-
223
- it "should prepend *.bat start scripts with 'start'" do
224
- @controller_mock.should_receive(:start).with "start aCommand.bat", "aFile"
225
- @parser.parse ["start", "aCommand.bat","aFile"]
226
- end
227
-
228
- it "should prepend *.cmd start scripts with 'start'" do
229
- @controller_mock.should_receive(:start).with "start aCommand.cmd", "aFile"
230
- @parser.parse ["start", "aCommand.cmd","aFile"]
231
- end
232
-
233
- it "should accept upload command" do
234
- @controller_mock.should_receive(:upload).with "framework", "dir"
235
- @parser.parse ["upload", "framework", "dir"]
236
- end
237
-
238
- it "should accept uppercase commands" do
239
- @controller_mock.should_receive(:help).with(nil)
240
- @parser.parse ["HELP"]
241
- end
242
-
243
- end
244
-
245
- describe Progress do
246
-
247
- it 'should print infos and empty progress in initialization' do
248
- STDOUT.should_receive(:print).with("2 states to upload")
249
- STDOUT.should_receive(:print).with("[ ]")
250
- STDOUT.should_receive(:print).with("\b\b\b")
251
- Progress.write_empty_progress 2
252
- end
253
-
254
- it 'should print dots and flush in next' do
255
- STDOUT.should_receive(:print).with(".")
256
- STDOUT.should_receive(:flush)
257
- Progress.next
258
- end
259
-
260
- it 'should print empty line in end' do
261
- STDOUT.should_receive(:puts)
262
- Progress.end
263
- end
264
-
265
- end