bloc 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/bloc +1 -1
- data/lib/bloc/command/add_chapter.rb +7 -9
- data/lib/bloc/command/tasks/formatter.rb +39 -2
- data/lib/bloc/command/validate.rb +24 -6
- data/lib/bloc/version.rb +1 -1
- data/spec/command/add_chapter_spec.rb +19 -5
- data/spec/command/tasks_spec.rb +3 -2
- metadata +16 -16
data/bin/bloc
CHANGED
@@ -3,24 +3,22 @@ module Bloc::Command
|
|
3
3
|
USAGE = <<eos
|
4
4
|
Usage:
|
5
5
|
|
6
|
-
bloc add-chapter
|
6
|
+
bloc add-chapter ["name"]
|
7
7
|
|
8
8
|
Example:
|
9
9
|
|
10
|
-
bloc add-chapter "Stacks and Queues"
|
10
|
+
bloc add-chapter "Stacks and Queues"
|
11
11
|
eos
|
12
12
|
def self.run(*args)
|
13
13
|
raise Bloc::Manifest::MANIFEST_NOT_FOUND unless File.exists?(Bloc::Manifest::MANIFEST_PATH)
|
14
|
-
raise USAGE unless ARGV.size ==
|
15
|
-
name = ARGV[1]
|
16
|
-
markdown = ARGV[2] || ""
|
17
|
-
command = ARGV[3] || ""
|
18
|
-
|
14
|
+
raise USAGE unless ARGV.size == 2
|
15
|
+
name = ARGV[1]
|
19
16
|
manifest = Bloc::Manifest.parse
|
17
|
+
number = manifest.chapters.size + 1
|
20
18
|
manifest.add_chapter(
|
21
19
|
:name => name,
|
22
|
-
:markdown =>
|
23
|
-
:command =>
|
20
|
+
:markdown => "chapters/chapter#{number}.md",
|
21
|
+
:command => ""
|
24
22
|
)
|
25
23
|
end
|
26
24
|
end
|
@@ -1,9 +1,46 @@
|
|
1
|
+
require "colorize"
|
2
|
+
|
1
3
|
module Bloc
|
2
4
|
module Command
|
3
5
|
class Tasks
|
4
6
|
module Formatter
|
5
|
-
def self.format(
|
6
|
-
|
7
|
+
def self.format(tests)
|
8
|
+
output = ""
|
9
|
+
tests.each_with_index do |test, index|
|
10
|
+
if test["passed"]
|
11
|
+
output << format_passed(test, index)
|
12
|
+
else
|
13
|
+
output << format_failed(test, index)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
output
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.format_passed(test, index)
|
21
|
+
%Q(
|
22
|
+
#{index+1}. #{indent(test["name"].green)}
|
23
|
+
#{indent(test["description"])}
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.format_failed(test, index)
|
28
|
+
%Q(
|
29
|
+
#{index+1}. #{indent(test["name"].red)}
|
30
|
+
#{indent(test["description"])}
|
31
|
+
#{indent(test["failed_line"])}
|
32
|
+
#{indent(test["backtrace"].join("\n"))}
|
33
|
+
|
34
|
+
#{indent(test["code"].light_cyan)}
|
35
|
+
#{indent(test["stdout"])}
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.indent(text, options={})
|
40
|
+
tab_level = options[:level] || 1
|
41
|
+
tabs = "\t"*tab_level
|
42
|
+
lines = text.split("\n")
|
43
|
+
lines.map {|line| tabs + line }.join("\n")
|
7
44
|
end
|
8
45
|
end
|
9
46
|
end
|
@@ -1,22 +1,40 @@
|
|
1
1
|
module Bloc
|
2
2
|
module Command
|
3
3
|
class Validate
|
4
|
-
|
5
|
-
|
4
|
+
LESSON_NOT_SPECIFIED = "No markdown was specified for: '%s'".red
|
5
|
+
LESSON_NOT_FOUND = "Missing markdown file: %s".red
|
6
|
+
LESSON_EXISTS = "(OK) Markdown exists: %s".green
|
7
|
+
NO_DEFAULT_COURSE_FILE = "(OK) No default file for course specified".green
|
8
|
+
VALID_DEFAULT_COURSE_FILE = "(OK) Default file for course exists".green
|
6
9
|
INVALID_DEFAULT_COURSE_FILE = "Default file for course does not exist (expected %s)".red
|
7
|
-
NO_DEFAULT_CHAPTER_FILE = "No default file for chapter specified
|
8
|
-
VALID_DEFAULT_CHAPTER_FILE = "Default file for chapter exists
|
10
|
+
NO_DEFAULT_CHAPTER_FILE = "(OK) No default file for chapter specified: %s".green
|
11
|
+
VALID_DEFAULT_CHAPTER_FILE = "(OK) Default file for chapter exists: %s".green
|
9
12
|
INVALID_DEFAULT_CHAPTER_FILE = "Default file for chapter does not exist: %s (expected %s)".red
|
10
13
|
NO_SUCH_PATCH = "Patch not found: %s".red
|
11
|
-
PATCH_EXISTS = "Patch exists: %s".green
|
14
|
+
PATCH_EXISTS = "(OK) Patch exists: %s".green
|
12
15
|
|
13
16
|
def self.run(*args)
|
14
|
-
manifest = Manifest.parse
|
17
|
+
manifest = Bloc::Manifest.parse
|
18
|
+
check_markdown_files manifest
|
15
19
|
check_course_default_file manifest
|
16
20
|
check_chapter_default_files manifest
|
17
21
|
check_patches manifest
|
18
22
|
end
|
19
23
|
|
24
|
+
def self.check_markdown_files(manifest)
|
25
|
+
manifest.chapters.each do |chapter|
|
26
|
+
begin
|
27
|
+
if File.exists?("bloc/#{chapter.markdown}")
|
28
|
+
puts LESSON_EXISTS % chapter.markdown
|
29
|
+
else
|
30
|
+
raise LESSON_NOT_FOUND % chapter.markdown
|
31
|
+
end
|
32
|
+
rescue NoMethodError => e
|
33
|
+
raise LESSON_NOT_SPECIFIED % chapter.name
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
20
38
|
def self.check_course_default_file(manifest)
|
21
39
|
course_default_file = manifest.course.default_file
|
22
40
|
if course_default_file.nil?
|
data/lib/bloc/version.rb
CHANGED
@@ -11,24 +11,38 @@ module Bloc::Command
|
|
11
11
|
},
|
12
12
|
:chapters => []
|
13
13
|
}
|
14
|
+
$verbose = $VERBOSE
|
15
|
+
$VERBOSE = nil
|
16
|
+
$argv = ARGV
|
17
|
+
ARGV = ['add-chapter', 'stacks and queues']
|
18
|
+
end
|
19
|
+
|
20
|
+
after do
|
21
|
+
ARGV = $argv
|
22
|
+
$VERBOSE = $verbose
|
14
23
|
end
|
15
24
|
|
16
25
|
it "raises an exception if a manifest doesn't exist" do
|
17
|
-
|
26
|
+
FakeFS do
|
27
|
+
lambda { AddChapter.run() }.should raise_error(Bloc::Manifest::MANIFEST_NOT_FOUND)
|
28
|
+
end
|
18
29
|
end
|
19
30
|
|
20
31
|
it "raises and exception if not all arguments are passed" do
|
21
|
-
|
22
|
-
|
32
|
+
FakeFS do
|
33
|
+
$tmp = ARGV
|
34
|
+
ARGV = ['add-chapter']
|
35
|
+
Bloc::Manifest.new(@options).write
|
36
|
+
lambda { AddChapter.run() }.should raise_error(AddChapter::USAGE)
|
37
|
+
ARGV = $tmp
|
38
|
+
end
|
23
39
|
end
|
24
40
|
|
25
41
|
it "adds a chapter to an existing manifest" do
|
26
42
|
FakeFS do
|
27
|
-
|
28
43
|
manifest = Bloc::Manifest.new(@options)
|
29
44
|
manifest.write
|
30
45
|
chapter_count = manifest.chapters.size
|
31
|
-
ARGV = ['stacks and queues', 'markdown/chapter4.md', 'rspec spec -t ch4 -f j']
|
32
46
|
AddChapter.run
|
33
47
|
Bloc::Manifest.parse.chapters.size.should be(chapter_count + 1)
|
34
48
|
end
|
data/spec/command/tasks_spec.rb
CHANGED
@@ -8,7 +8,7 @@ module Bloc
|
|
8
8
|
let(:enrollment) { Client::Enrollment.new("id" => 1, "current_step" => 1, "completed" => false) }
|
9
9
|
let(:course) { Client::Course.new({"id" => "1", "slug" => "url-shortener" }) }
|
10
10
|
let(:git_remote) { "git://github.com/Bloc/URL-Shortener.git" }
|
11
|
-
let(:passed_results) { { "tests" => [{"passed" => true }, { "passed" => true }] } }
|
11
|
+
let(:passed_results) { { "tests" => [{"passed" => true }, { "passed" => true }] } }
|
12
12
|
let(:failed_results) { { "tests" => [{"passed" => false }, { "passed" => true }] } }
|
13
13
|
|
14
14
|
before do
|
@@ -23,6 +23,7 @@ module Bloc
|
|
23
23
|
Runner.stub(:run).and_return(failed_results)
|
24
24
|
|
25
25
|
$stdout = StringIO.new
|
26
|
+
Command::Tasks::Formatter.stub(:format)
|
26
27
|
end
|
27
28
|
|
28
29
|
after do
|
@@ -36,7 +37,7 @@ module Bloc
|
|
36
37
|
end
|
37
38
|
|
38
39
|
context "if the tests pass" do
|
39
|
-
before do
|
40
|
+
before do
|
40
41
|
Runner.stub(:run).and_return(passed_results)
|
41
42
|
Client::Course.stub(:find).with(:scaffold_clone_url => git_remote).and_return(course)
|
42
43
|
Client::Enrollment.stub(:create).with(:course_id => course.id).and_return(enrollment)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bloc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-03-
|
13
|
+
date: 2012-03-13 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
17
|
-
requirement: &
|
17
|
+
requirement: &70329855606340 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70329855606340
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: fakefs
|
28
|
-
requirement: &
|
28
|
+
requirement: &70329855605920 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70329855605920
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: ruby-debug19
|
39
|
-
requirement: &
|
39
|
+
requirement: &70329855605500 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70329855605500
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: json
|
50
|
-
requirement: &
|
50
|
+
requirement: &70329855605080 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ! '>='
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: '0'
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *70329855605080
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: colorize
|
61
|
-
requirement: &
|
61
|
+
requirement: &70329855604660 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ! '>='
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: '0'
|
67
67
|
type: :runtime
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *70329855604660
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rest-client
|
72
|
-
requirement: &
|
72
|
+
requirement: &70329855604240 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
@@ -77,10 +77,10 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
type: :runtime
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *70329855604240
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: hashie
|
83
|
-
requirement: &
|
83
|
+
requirement: &70329855603820 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
86
86
|
- - ! '>='
|
@@ -88,7 +88,7 @@ dependencies:
|
|
88
88
|
version: '0'
|
89
89
|
type: :runtime
|
90
90
|
prerelease: false
|
91
|
-
version_requirements: *
|
91
|
+
version_requirements: *70329855603820
|
92
92
|
description: A command-line tool for Bloc
|
93
93
|
email:
|
94
94
|
- roshan.choxi@gmail.com
|