brief 1.2.0 → 1.3.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 +4 -4
- data/CHANGELOG.md +70 -0
- data/Gemfile.lock +2 -2
- data/README.md +143 -70
- data/lib/brief/adapters/middleman.rb +2 -3
- data/lib/brief/briefcase.rb +28 -5
- data/lib/brief/cli/change.rb +7 -7
- data/lib/brief/cli/init.rb +10 -11
- data/lib/brief/cli/write.rb +23 -0
- data/lib/brief/configuration.rb +3 -4
- data/lib/brief/document/content_extractor.rb +2 -4
- data/lib/brief/document/front_matter.rb +4 -4
- data/lib/brief/document/rendering.rb +7 -9
- data/lib/brief/document/section/builder.rb +10 -10
- data/lib/brief/document/section/mapping.rb +5 -11
- data/lib/brief/document/section.rb +2 -3
- data/lib/brief/document/structure.rb +14 -15
- data/lib/brief/document/templating.rb +14 -0
- data/lib/brief/document.rb +20 -9
- data/lib/brief/document_mapper.rb +10 -10
- data/lib/brief/dsl.rb +5 -6
- data/lib/brief/model/definition.rb +37 -13
- data/lib/brief/model/persistence.rb +0 -2
- data/lib/brief/model.rb +50 -21
- data/lib/brief/repository.rb +2 -3
- data/lib/brief/util.rb +4 -4
- data/lib/brief/version.rb +1 -1
- data/lib/brief.rb +47 -33
- data/spec/fixtures/example/brief.rb +3 -0
- data/spec/fixtures/example/models/epic.rb +43 -5
- data/spec/fixtures/example/templates/user_story.md.erb +22 -0
- data/spec/lib/brief/briefcase_spec.rb +1 -1
- data/spec/lib/brief/dsl_spec.rb +1 -1
- data/spec/lib/brief/model_spec.rb +6 -1
- data/spec/lib/brief/persistence_spec.rb +1 -1
- data/spec/lib/brief/repository_spec.rb +1 -1
- data/spec/lib/brief/template_spec.rb +44 -0
- data/spec/spec_helper.rb +2 -2
- metadata +7 -2
data/lib/brief/util.rb
CHANGED
@@ -7,19 +7,19 @@ module Brief::Util
|
|
7
7
|
c.syntax = "brief #{identifier}"
|
8
8
|
c.description = "run the #{identifier} command"
|
9
9
|
|
10
|
-
c.action do |args,
|
10
|
+
c.action do |args, _opts|
|
11
11
|
briefcase = Brief.case
|
12
12
|
|
13
|
-
path_args = args.select {|arg| arg.is_a?(String) && arg.match(/\.md$/) }
|
13
|
+
path_args = args.select { |arg| arg.is_a?(String) && arg.match(/\.md$/) }
|
14
14
|
|
15
15
|
path_args.select! do |arg|
|
16
16
|
path = briefcase.repository.root.join(arg)
|
17
17
|
path.exist?
|
18
18
|
end
|
19
19
|
|
20
|
-
path_args.map! {|p| briefcase.repository.root.join(p) }
|
20
|
+
path_args.map! { |p| briefcase.repository.root.join(p) }
|
21
21
|
|
22
|
-
models = path_args.map {|path| Brief::Document.new(path) }.map(&:to_model)
|
22
|
+
models = path_args.map { |path| Brief::Document.new(path) }.map(&:to_model)
|
23
23
|
|
24
24
|
if models.empty?
|
25
25
|
model_finder = c.name.to_s.split(' ').last
|
data/lib/brief/version.rb
CHANGED
data/lib/brief.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
1
|
+
require 'pathname'
|
2
|
+
require 'set'
|
3
|
+
require 'hashie'
|
4
|
+
require 'virtus'
|
5
|
+
require 'inflecto'
|
6
|
+
require 'active_support'
|
7
|
+
require 'active_support/core_ext'
|
8
|
+
require 'redcarpet'
|
9
|
+
require 'nokogiri'
|
10
|
+
require 'yaml'
|
11
|
+
require 'erb'
|
11
12
|
|
12
13
|
module Brief
|
13
|
-
def self.case=
|
14
|
+
def self.case=(value)
|
14
15
|
@briefcase = value
|
15
16
|
end
|
16
17
|
|
@@ -26,8 +27,12 @@ module Brief
|
|
26
27
|
Pathname(File.dirname(__FILE__))
|
27
28
|
end
|
28
29
|
|
30
|
+
def self.apps_path
|
31
|
+
gem_root.join("..","apps")
|
32
|
+
end
|
33
|
+
|
29
34
|
def self.load_commands
|
30
|
-
Dir[gem_root.join(
|
35
|
+
Dir[gem_root.join('brief', 'cli', '**/*.rb')].each { |f| require(f) }
|
31
36
|
|
32
37
|
# the instance methods which get defined with the helper
|
33
38
|
Brief::Model.classes.each do |klass|
|
@@ -37,8 +42,16 @@ module Brief
|
|
37
42
|
end
|
38
43
|
end
|
39
44
|
|
40
|
-
def self.
|
41
|
-
Brief::
|
45
|
+
def self.default_model_class
|
46
|
+
if defined?(Brief::DefaultModel)
|
47
|
+
Brief::DefaultModel
|
48
|
+
else
|
49
|
+
Brief.const_set(:DefaultModel, Class.new { include Brief::Model; def self.type_alias; "default"; end })
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.load_modules_from(folder)
|
54
|
+
Dir[folder.join('**/*.rb')].each { |f| require(f) }
|
42
55
|
end
|
43
56
|
|
44
57
|
# Adapters for Rails, Middleman, or Jekyll apps
|
@@ -49,22 +62,23 @@ module Brief
|
|
49
62
|
end
|
50
63
|
end
|
51
64
|
|
52
|
-
require
|
53
|
-
require
|
54
|
-
require
|
55
|
-
require
|
56
|
-
require
|
57
|
-
require
|
58
|
-
require
|
59
|
-
require
|
60
|
-
require
|
61
|
-
require
|
62
|
-
require
|
63
|
-
require
|
64
|
-
require
|
65
|
-
require
|
66
|
-
require
|
67
|
-
require
|
68
|
-
require
|
69
|
-
require
|
70
|
-
require
|
65
|
+
require 'brief/core_ext'
|
66
|
+
require 'brief/version'
|
67
|
+
require 'brief/util'
|
68
|
+
require 'brief/configuration'
|
69
|
+
require 'brief/document/rendering'
|
70
|
+
require 'brief/document/front_matter'
|
71
|
+
require 'brief/document/templating'
|
72
|
+
require 'brief/document/content_extractor'
|
73
|
+
require 'brief/document/structure'
|
74
|
+
require 'brief/document/section'
|
75
|
+
require 'brief/document/section/mapping'
|
76
|
+
require 'brief/document/section/builder'
|
77
|
+
require 'brief/document'
|
78
|
+
require 'brief/document_mapper'
|
79
|
+
require 'brief/repository'
|
80
|
+
require 'brief/model'
|
81
|
+
require 'brief/model/definition'
|
82
|
+
require 'brief/model/persistence'
|
83
|
+
require 'brief/dsl'
|
84
|
+
require 'brief/briefcase'
|
@@ -1,5 +1,6 @@
|
|
1
1
|
config do
|
2
2
|
set(:models => Pathname(File.dirname(__FILE__)).join("models"))
|
3
|
+
set(:templates => Pathname(File.dirname(__FILE__)).join("templates"))
|
3
4
|
end
|
4
5
|
|
5
6
|
define "User Story" do
|
@@ -9,6 +10,8 @@ define "User Story" do
|
|
9
10
|
epic_title
|
10
11
|
end
|
11
12
|
|
13
|
+
template :file => "user_story.md.erb"
|
14
|
+
|
12
15
|
content do
|
13
16
|
persona "p strong:first-child"
|
14
17
|
behavior "p strong:second-child"
|
@@ -7,22 +7,60 @@ class Brief::Epic
|
|
7
7
|
status String, :in => %w(draft published)
|
8
8
|
end
|
9
9
|
|
10
|
+
example <<-EOF
|
11
|
+
---
|
12
|
+
type: epic
|
13
|
+
status: draft
|
14
|
+
---
|
15
|
+
|
16
|
+
# Epic Title
|
17
|
+
|
18
|
+
Write a description for your epic.
|
19
|
+
|
20
|
+
# User Stories
|
21
|
+
|
22
|
+
## User Story Title
|
23
|
+
|
24
|
+
As a **PERSONA** I would like to **BEHAVIOR** so that I can **GOAL**
|
25
|
+
EOF
|
26
|
+
|
27
|
+
template <<-EOF
|
28
|
+
# <%= object.title %>
|
29
|
+
# User Stories
|
30
|
+
<% Array(object.user_stories).each do |user_story| %>
|
31
|
+
## <%= user_story.title %>
|
32
|
+
As a **User** I would like to **Do this** so that I can **succeed**
|
33
|
+
<% end %>
|
34
|
+
EOF
|
35
|
+
|
10
36
|
content do
|
11
|
-
# have to do this so that the user stories section h1 doesnt get confused
|
12
37
|
title "h1:first-of-type"
|
13
|
-
|
14
38
|
define_section "User Stories" do
|
15
|
-
# NOT YET Implemented
|
16
|
-
each("h2").is_a :user_story
|
17
|
-
|
18
39
|
each("h2").has(:title => "h2",
|
19
40
|
:paragraph => "p:first-of-type",
|
20
41
|
:components => "p:first-of-type strong"
|
21
42
|
)
|
43
|
+
|
44
|
+
each("h2").is_a :user_story
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
helpers do
|
49
|
+
def user_stories
|
50
|
+
sections.user_stories.items.map do |item|
|
51
|
+
item.components = Array(item.components)
|
52
|
+
|
53
|
+
item.merge(goal: item.components[2],
|
54
|
+
persona: item.components[0],
|
55
|
+
behavior: item.components[1])
|
56
|
+
end
|
22
57
|
end
|
23
58
|
end
|
24
59
|
|
25
60
|
actions do
|
61
|
+
def publish_to_github
|
62
|
+
end
|
63
|
+
|
26
64
|
def custom_action
|
27
65
|
end
|
28
66
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# <%= object.title %>
|
2
|
+
|
3
|
+
<% if object.persona && object.behavior %>
|
4
|
+
As a **<%= object.persona %>** I would like to <%= object.behavior %>** <% if object.goal; %> so that I can **<%= object.goal %>** <% end; %>
|
5
|
+
<% elsif object.paragraph.to_s.length > 0 %>
|
6
|
+
<%= object.paragraph %>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<% if object.wireframes %>
|
10
|
+
### Wireframes
|
11
|
+
<% Array(object.wireframes).each do |wireframe| %>
|
12
|
+
- <%= wireframe %>
|
13
|
+
<% end %>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<% if object.estimates %>
|
17
|
+
### Estimates
|
18
|
+
<% Array(object.estimates).each do |estimate| %>
|
19
|
+
- <%= estimate %>
|
20
|
+
<% end %>
|
21
|
+
<% end %>
|
22
|
+
|
data/spec/lib/brief/dsl_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe "The Brief Model" do
|
4
|
-
let(:briefcase) { Brief.
|
4
|
+
let(:briefcase) { Brief.testcase }
|
5
5
|
let(:epic) { briefcase.epics.first }
|
6
6
|
let(:user_story) { briefcase.user_stories.first }
|
7
7
|
|
@@ -101,6 +101,11 @@ describe "The Brief Model" do
|
|
101
101
|
it "users the actions block to define CLI dispatchers (dsl)" do
|
102
102
|
expect(user_story.class.defined_actions).to include(:custom_action)
|
103
103
|
end
|
104
|
+
|
105
|
+
it "lets me define a helper method which utilizes all the extracted data and content structure" do
|
106
|
+
expect(epic.user_stories.length).to eq(3)
|
107
|
+
expect(epic.user_stories.map(&:persona)).to include("User")
|
108
|
+
end
|
104
109
|
end
|
105
110
|
|
106
111
|
context "Section Mappings" do
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "Document Templates" do
|
4
|
+
let(:data) do
|
5
|
+
{
|
6
|
+
title: "Epic Example",
|
7
|
+
status: "published",
|
8
|
+
type: "epic",
|
9
|
+
user_stories:[{
|
10
|
+
title: "A user wants to do something",
|
11
|
+
paragraph: "As a user I would like to do something so that I can succeed",
|
12
|
+
goal: "I can succeed",
|
13
|
+
persona: "user",
|
14
|
+
behavior: "do something"
|
15
|
+
},{
|
16
|
+
title: "A user wants to do something else",
|
17
|
+
paragraph: "As a user I would like to do something else so that I can succeed"
|
18
|
+
}]
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
it "has template body" do
|
23
|
+
expect(Brief::Epic.template_body).not_to be_empty
|
24
|
+
end
|
25
|
+
|
26
|
+
it "has an example" do
|
27
|
+
expect(Brief::Epic.example_body).not_to be_empty
|
28
|
+
end
|
29
|
+
|
30
|
+
it "takes a hash of data and renders yaml frontmatter" do
|
31
|
+
expect(Brief::Document.create_from_data(data).title).to eq("Epic Example")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "supports more complex renderings" do
|
35
|
+
doc = Brief::Document.create_from_data(data)
|
36
|
+
content = doc.content
|
37
|
+
|
38
|
+
expect(content).to include("# User Stories")
|
39
|
+
expect(content).to include("# Epic Example")
|
40
|
+
expect(content).to include("## A user wants to do something")
|
41
|
+
expect(content).to include("## A user wants to do something else")
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brief
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Soeder
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|
@@ -244,6 +244,7 @@ files:
|
|
244
244
|
- lib/brief/document/section/builder.rb
|
245
245
|
- lib/brief/document/section/mapping.rb
|
246
246
|
- lib/brief/document/structure.rb
|
247
|
+
- lib/brief/document/templating.rb
|
247
248
|
- lib/brief/document_mapper.rb
|
248
249
|
- lib/brief/dsl.rb
|
249
250
|
- lib/brief/model.rb
|
@@ -261,6 +262,7 @@ files:
|
|
261
262
|
- spec/fixtures/example/docs/user_story.html.md
|
262
263
|
- spec/fixtures/example/docs/wireframe.html.md
|
263
264
|
- spec/fixtures/example/models/epic.rb
|
265
|
+
- spec/fixtures/example/templates/user_story.md.erb
|
264
266
|
- spec/fixtures/structures/one.html.md
|
265
267
|
- spec/fixtures/structures/three.html.md
|
266
268
|
- spec/fixtures/structures/two.html.md
|
@@ -273,6 +275,7 @@ files:
|
|
273
275
|
- spec/lib/brief/repository_spec.rb
|
274
276
|
- spec/lib/brief/section_builder_spec.rb
|
275
277
|
- spec/lib/brief/structure_spec.rb
|
278
|
+
- spec/lib/brief/template_spec.rb
|
276
279
|
- spec/spec_helper.rb
|
277
280
|
- spec/support/test_helpers.rb
|
278
281
|
- tasks/brief/release.rake
|
@@ -310,6 +313,7 @@ test_files:
|
|
310
313
|
- spec/fixtures/example/docs/user_story.html.md
|
311
314
|
- spec/fixtures/example/docs/wireframe.html.md
|
312
315
|
- spec/fixtures/example/models/epic.rb
|
316
|
+
- spec/fixtures/example/templates/user_story.md.erb
|
313
317
|
- spec/fixtures/structures/one.html.md
|
314
318
|
- spec/fixtures/structures/three.html.md
|
315
319
|
- spec/fixtures/structures/two.html.md
|
@@ -322,6 +326,7 @@ test_files:
|
|
322
326
|
- spec/lib/brief/repository_spec.rb
|
323
327
|
- spec/lib/brief/section_builder_spec.rb
|
324
328
|
- spec/lib/brief/structure_spec.rb
|
329
|
+
- spec/lib/brief/template_spec.rb
|
325
330
|
- spec/spec_helper.rb
|
326
331
|
- spec/support/test_helpers.rb
|
327
332
|
has_rdoc:
|