brief 1.9.14 → 1.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +2 -2
- data/Gemfile.lock +1 -1
- data/README.md +53 -19
- data/TUTORIAL.md +6 -6
- data/apps/blueprint/documentation/epic.md +1 -1
- data/apps/blueprint/documentation/user_story.md +1 -1
- data/apps/blueprint/models/epic.rb +9 -9
- data/apps/blueprint/models/{user_story.rb → feature.rb} +2 -2
- data/apps/blueprint/models/release.rb +1 -1
- data/lib/brief/cli/browse.rb +1 -1
- data/lib/brief/cli/parse.rb +1 -1
- data/lib/brief/document/structure.rb +24 -0
- data/lib/brief/version.rb +1 -1
- data/spec/fixtures/example/brief.rb +2 -2
- data/spec/fixtures/example/docs/epics/epic.html.md +2 -8
- data/spec/fixtures/example/docs/index.md +1 -1
- data/spec/fixtures/example/docs/user_story.html.md +2 -2
- data/spec/fixtures/example/models/epic.rb +9 -9
- data/spec/fixtures/structures/one.html.md +1 -1
- data/spec/fixtures/structures/two.html.md +1 -1
- data/spec/lib/brief/document_spec.rb +6 -6
- data/spec/lib/brief/dsl_spec.rb +3 -3
- data/spec/lib/brief/model_spec.rb +15 -15
- data/spec/lib/brief/repository_spec.rb +2 -2
- data/spec/lib/brief/template_spec.rb +2 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c99e43e2cb14081fa9dfb044d30bf1e21771225e
|
4
|
+
data.tar.gz: 75be39413bbe58d8d0169eccc6ae936223635e92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ee79d64d3b01159c7493672b4c7c13ad9bc7fdab0446253729fd037ed0e576a8813676e9d202ca2e26da33108dae58c1859fac7362953b689818e96c1719d0b
|
7
|
+
data.tar.gz: 52992dd1e843eb9259d6210fa828d50c760d6866639280d823b8b2a8581530a38b837647cc21e9464c3a33f44dc591f75a9a241fb637eece79d31cc5a052edc5
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -2,20 +2,15 @@
|
|
2
2
|
[![Build
|
3
3
|
Status](https://travis-ci.org/datapimp/brief.svg?branch=master)](https://travis-ci.org/datapimp/brief)
|
4
4
|
|
5
|
-
###
|
5
|
+
### Turning writers into object oriented programmers
|
6
6
|
|
7
|
-
Brief lets writers build applications on top of collections of markdown
|
8
|
-
files. Brief lets you define different classes or types of documents, called
|
9
|
-
`Model`s.
|
7
|
+
Brief lets writers build applications on top of collections of markdown files. Brief lets you define different classes or types of documents, called `Model`s which are responsible for defining certain writing conventions that apply to a group of documents.
|
10
8
|
|
11
|
-
|
12
|
-
used to do things such as make API calls, or publish a blog post and
|
13
|
-
send an email campaign at the same time.
|
9
|
+
When documents conform to these conventions, it is possible to treat them as software entities with attributes, and give the documents and their content unique identities that can be mapped to other parts of the software systems we work with every day.
|
14
10
|
|
15
11
|
### Turn documents into data
|
16
12
|
|
17
|
-
The most basic way of combining writing with data, is through the use of
|
18
|
-
YAML Frontmatter as metadata for the document. For example:
|
13
|
+
The most basic way of combining writing with data, is through the use of YAML Frontmatter as metadata for the document. For example:
|
19
14
|
|
20
15
|
```
|
21
16
|
---
|
@@ -34,8 +29,7 @@ This is the first paragraph.
|
|
34
29
|
This is another pargraph.
|
35
30
|
```
|
36
31
|
|
37
|
-
This YAML content at the top gets turned into data associated with the
|
38
|
-
document.
|
32
|
+
This YAML content at the top gets turned into data associated with the document.
|
39
33
|
|
40
34
|
```
|
41
35
|
post = Post.new("/path/to/post.md")
|
@@ -43,17 +37,12 @@ post.status # => 'draft'
|
|
43
37
|
post.tags # => ['help','ruby']
|
44
38
|
```
|
45
39
|
|
46
|
-
The YAML data is useful, but where the brief model system really shines
|
47
|
-
is in the ability to extract data and metadata from the writing itself.
|
40
|
+
The YAML data is useful, but where the brief model system really shines is in the ability to extract data and metadata from the writing itself.
|
48
41
|
|
49
|
-
Each `Model` prescribes its own specific structure, usually
|
50
|
-
in the form of heading hierarchys (h1, h2, h3, etc). Any CSS selector
|
51
|
-
can be used against the rendered HTML produced by the markdown. A
|
52
|
-
model can define attributes that will be extracted from the writing, for
|
53
|
-
example:
|
42
|
+
Each `Model` prescribes its own specific structure, usually in the form of heading hierarchys (h1, h2, h3, etc). Any CSS selector can be used against the rendered HTML produced by the markdown. A model can define attributes that will be extracted from the writing, for example:
|
54
43
|
|
55
44
|
```ruby
|
56
|
-
define "
|
45
|
+
define "Recipe" do
|
57
46
|
content do
|
58
47
|
title "h1:first-of-type"
|
59
48
|
subtitle "h2:first-of-type"
|
@@ -61,10 +50,55 @@ define "Post" do
|
|
61
50
|
|
62
51
|
# parses YAML blocks inside the document
|
63
52
|
settings 'code.yaml', :serialize => true
|
53
|
+
|
54
|
+
define_section("Ingredients") do
|
55
|
+
each("li").is_a(:ingredient).has(:name=>"li")
|
56
|
+
end
|
57
|
+
|
58
|
+
define_section("Steps") do
|
59
|
+
each("li").is_a(:step).has(:description=>"li")
|
60
|
+
end
|
61
|
+
|
62
|
+
helpers do
|
63
|
+
def ingredient_names
|
64
|
+
sections.ingredients.items.map(&:name)
|
65
|
+
end
|
66
|
+
|
67
|
+
def have_inventory?
|
68
|
+
!ingredient_names.detect {|ingredient| inventory[ingredient].to_i <= 0 }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
define "Ingredient" do
|
75
|
+
content do
|
76
|
+
title "h1:first-of-type"
|
77
|
+
summary "p:first-of-type"
|
78
|
+
|
79
|
+
define_section("Vendors") do
|
80
|
+
each("h2").is_a(:vendor).has(:title=>"h2",:website=>"a:first-of-type")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
helpers do
|
85
|
+
def vendor_websites
|
86
|
+
sections.vendors.items.map(&:website)
|
87
|
+
end
|
64
88
|
end
|
65
89
|
end
|
66
90
|
```
|
67
91
|
|
92
|
+
### Document Structure
|
93
|
+
|
94
|
+
Brief works by processing the markdown that is rendered by default, and building a hierarchal structure based on the headings you use. A `Brief::Model` can be assigned to a certain folder of documents, and if all of those documents follow the same heading structure, you can
|
95
|
+
interact with the documents as data structures and treat them as relatable entities in your object oriented software system.
|
96
|
+
|
97
|
+
This opens up writing as a possible user interface for a number of
|
98
|
+
systems.
|
99
|
+
|
100
|
+
That is powerful stuff.
|
101
|
+
|
68
102
|
### Getting Started
|
69
103
|
|
70
104
|
```
|
data/TUTORIAL.md
CHANGED
@@ -109,7 +109,7 @@ which is implemented by:
|
|
109
109
|
```ruby
|
110
110
|
# brief.rb
|
111
111
|
|
112
|
-
define "
|
112
|
+
define "Feature" do
|
113
113
|
meta do
|
114
114
|
status
|
115
115
|
end
|
@@ -131,12 +131,12 @@ define "User Story" do
|
|
131
131
|
end
|
132
132
|
|
133
133
|
action "publish user stories" do |briefcase, models, options|
|
134
|
-
|
134
|
+
features = models
|
135
135
|
|
136
|
-
|
137
|
-
if
|
138
|
-
|
139
|
-
|
136
|
+
features.each do |feature|
|
137
|
+
if feature.create_github_issue()
|
138
|
+
feature.status = "published"
|
139
|
+
feature.save
|
140
140
|
end
|
141
141
|
end
|
142
142
|
end
|
@@ -2,6 +2,6 @@
|
|
2
2
|
|
3
3
|
The Feature Epic model is a document that is used to document a bunch of related user stories related to a general feature category or group.
|
4
4
|
|
5
|
-
For example you might have a "3rd Party Integrations" Epic which has
|
5
|
+
For example you might have a "3rd Party Integrations" Epic which has Features for LinkedIn, Facebook, Github, and Twitter.
|
6
6
|
|
7
7
|
The Epic Document can be used to describe the importance of the module as a whole at the same time that it captures the user stories.
|
@@ -1 +1 @@
|
|
1
|
-
####
|
1
|
+
#### Features
|
@@ -19,18 +19,18 @@ status: draft
|
|
19
19
|
|
20
20
|
Write a description for your epic.
|
21
21
|
|
22
|
-
#
|
22
|
+
# Features
|
23
23
|
|
24
|
-
##
|
24
|
+
## Feature Title
|
25
25
|
|
26
26
|
As a **PERSONA** I would like to **BEHAVIOR** so that I can **GOAL**
|
27
27
|
EOF
|
28
28
|
|
29
29
|
template <<-EOF
|
30
30
|
# <%= object.title %>
|
31
|
-
#
|
32
|
-
<% Array(object.
|
33
|
-
## <%=
|
31
|
+
# Features
|
32
|
+
<% Array(object.features).each do |feature| %>
|
33
|
+
## <%= feature.title %>
|
34
34
|
As a **User** I would like to **Do this** so that I can **succeed**
|
35
35
|
<% end %>
|
36
36
|
EOF
|
@@ -40,19 +40,19 @@ As a **User** I would like to **Do this** so that I can **succeed**
|
|
40
40
|
paragraph "p:first-of-type"
|
41
41
|
paragraphs "p"
|
42
42
|
|
43
|
-
define_section "
|
43
|
+
define_section "Features" do
|
44
44
|
each("h2").has(:title => "h2",
|
45
45
|
:paragraph => "p:first-of-type",
|
46
46
|
:components => "p:first-of-type strong"
|
47
47
|
)
|
48
48
|
|
49
|
-
each("h2").is_a :
|
49
|
+
each("h2").is_a :feature
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
53
|
helpers do
|
54
|
-
def
|
55
|
-
sections.
|
54
|
+
def features
|
55
|
+
sections.features.items.map do |item|
|
56
56
|
item.components = Array(item.components)
|
57
57
|
|
58
58
|
item.merge(goal: item.components[2],
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class Brief::Apps::Blueprint::
|
1
|
+
class Brief::Apps::Blueprint::Feature
|
2
2
|
include Brief::Model
|
3
3
|
|
4
4
|
defined_in Pathname(__FILE__)
|
@@ -9,7 +9,7 @@ class Brief::Apps::Blueprint::UserStory
|
|
9
9
|
epic_title
|
10
10
|
end
|
11
11
|
|
12
|
-
template :file => "
|
12
|
+
template :file => "feature.md.erb"
|
13
13
|
|
14
14
|
content do
|
15
15
|
persona "p strong:first-child"
|
@@ -16,7 +16,7 @@ class Brief::Apps::Blueprint::Release
|
|
16
16
|
tagline "h2:first-of-type", :hide => true
|
17
17
|
yaml_data "code.yaml:first-of-type", :serialize => :yaml, :hide => true
|
18
18
|
|
19
|
-
define_section "
|
19
|
+
define_section "Features" do
|
20
20
|
each("h2").has(:title => "h2",
|
21
21
|
:paragraph => "p:first-of-type",
|
22
22
|
:components => "p:first-of-type strong"
|
data/lib/brief/cli/browse.rb
CHANGED
@@ -5,7 +5,7 @@ command 'browse documents' do |c|
|
|
5
5
|
c.option '--presenter-format FORMAT', String, 'Which presenter to use?'
|
6
6
|
c.option '--include-urls', 'Gets passed to the model renderers if present'
|
7
7
|
|
8
|
-
c.example "Browsing an arbitrary selection of documents", "brief parse ./blueprint/docs/epics ./blueprint/docs/
|
8
|
+
c.example "Browsing an arbitrary selection of documents", "brief parse ./blueprint/docs/epics ./blueprint/docs/features --root=./blueprint --format json --include-rendered --include-content"
|
9
9
|
|
10
10
|
c.action do |args, options|
|
11
11
|
options.default(root: Pathname(Brief.pwd), output_type: "array")
|
data/lib/brief/cli/parse.rb
CHANGED
@@ -7,7 +7,7 @@ command 'parse' do |c|
|
|
7
7
|
c.option '--include-rendered', 'Gets passed to the model renderers if present'
|
8
8
|
c.option '--include-urls', 'Gets passed to the model renderers if present'
|
9
9
|
|
10
|
-
c.example "Parsing an arbitrary selection of documents", "brief parse ./blueprint/docs/epics ./blueprint/docs/
|
10
|
+
c.example "Parsing an arbitrary selection of documents", "brief parse ./blueprint/docs/epics ./blueprint/docs/features --root=./blueprint --format json --include-rendered --include-content"
|
11
11
|
|
12
12
|
c.action do |args, options|
|
13
13
|
options.default(root: Pathname(Brief.pwd), output_type: "array")
|
@@ -1,3 +1,27 @@
|
|
1
|
+
# # Structured Documents
|
2
|
+
#
|
3
|
+
# Normal markdown is rendered flat. While there may be hierarchy,
|
4
|
+
# it was difficult to parse it in a way which made the headings
|
5
|
+
# collapsible.
|
6
|
+
#
|
7
|
+
# The Document Structure is responsible for grouping
|
8
|
+
# blocks of content under their nearest previous heading element
|
9
|
+
# acting as a parent. It does this by wrapping them in `<section>`
|
10
|
+
# and <article> tags, and through the use of data-attributes on the elements.
|
11
|
+
#
|
12
|
+
# ```
|
13
|
+
# - h1
|
14
|
+
# - h2
|
15
|
+
# - h3
|
16
|
+
# - h3
|
17
|
+
# - h2
|
18
|
+
# - h1
|
19
|
+
# - h2
|
20
|
+
# ```
|
21
|
+
#
|
22
|
+
# This class allows for us to define rules based on headings, for how
|
23
|
+
# we might interpret the meaning of the content that is written. It allows
|
24
|
+
# us to say: all level 2 headings are 'TodoItems' if they exist under the level 1 heading 'Tasks'
|
1
25
|
module Brief
|
2
26
|
class Document::Structure
|
3
27
|
attr_accessor :fragment, :content_lines
|
data/lib/brief/version.rb
CHANGED
@@ -24,14 +24,14 @@ define "Outline" do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
define "
|
27
|
+
define "Feature" do
|
28
28
|
meta do
|
29
29
|
title
|
30
30
|
status :in => %w(draft published)
|
31
31
|
epic_title
|
32
32
|
end
|
33
33
|
|
34
|
-
template :file => "
|
34
|
+
template :file => "feature.md.erb"
|
35
35
|
|
36
36
|
content do
|
37
37
|
persona "p strong:first-child"
|
@@ -6,20 +6,14 @@ state: active
|
|
6
6
|
---
|
7
7
|
|
8
8
|
# Blueprint Epic Example
|
9
|
+
This is an example of an Epic Document. An Epic is a single document which contains user stories and such.
|
9
10
|
|
10
|
-
|
11
|
-
which contains user stories and such.
|
12
|
-
|
13
|
-
# User Stories
|
14
|
-
|
11
|
+
# Features
|
15
12
|
## A user wants to write epics
|
16
|
-
|
17
13
|
As a **User** I want to **write epics** so that I can **write a bunch of user stories in one file**
|
18
14
|
|
19
15
|
## A user wants to annotate wireframes
|
20
|
-
|
21
16
|
As a **User** I want to **annotate wireframes** so that I can **augment diagrams with targeted explanations**
|
22
17
|
|
23
18
|
## A user wants to provide details about domain concepts
|
24
|
-
|
25
19
|
As a **User** I want to **provide some detailed explanations of domain concepts** so that I can **augment diagrams with targeted explanations**
|
@@ -1,6 +1,6 @@
|
|
1
1
|
---
|
2
|
-
type:
|
3
|
-
title: Blueprint
|
2
|
+
type: feature
|
3
|
+
title: Blueprint Feature Example
|
4
4
|
subheading: A way of describing desired behavior of the software, from the perspective of a persona who has a goal
|
5
5
|
epic: Blueprint Epic Example
|
6
6
|
release: Blueprint Release Example
|
@@ -17,37 +17,37 @@ status: draft
|
|
17
17
|
|
18
18
|
Write a description for your epic.
|
19
19
|
|
20
|
-
#
|
20
|
+
# Features
|
21
21
|
|
22
|
-
##
|
22
|
+
## Feature Title
|
23
23
|
|
24
24
|
As a **PERSONA** I would like to **BEHAVIOR** so that I can **GOAL**
|
25
25
|
EOF
|
26
26
|
|
27
27
|
template <<-EOF
|
28
28
|
# <%= object.title %>
|
29
|
-
#
|
30
|
-
<% Array(object.
|
31
|
-
## <%=
|
29
|
+
# Features
|
30
|
+
<% Array(object.features).each do |feature| %>
|
31
|
+
## <%= feature.title %>
|
32
32
|
As a **User** I would like to **Do this** so that I can **succeed**
|
33
33
|
<% end %>
|
34
34
|
EOF
|
35
35
|
|
36
36
|
content do
|
37
37
|
title "h1:first-of-type"
|
38
|
-
define_section "
|
38
|
+
define_section "Features" do
|
39
39
|
each("h2").has(:title => "h2",
|
40
40
|
:paragraph => "p:first-of-type",
|
41
41
|
:components => "p:first-of-type strong"
|
42
42
|
)
|
43
43
|
|
44
|
-
each("h2").is_a :
|
44
|
+
each("h2").is_a :feature
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
helpers do
|
49
|
-
def
|
50
|
-
sections.
|
49
|
+
def features
|
50
|
+
sections.features.items.map do |item|
|
51
51
|
item.components = Array(item.components)
|
52
52
|
|
53
53
|
item.merge(goal: item.components[2],
|
@@ -23,7 +23,7 @@ describe "The Brief Document" do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
it "renders html" do
|
26
|
-
expect(sample.to_html).to match(/h1.*
|
26
|
+
expect(sample.to_html).to match(/h1.*Features.*h1\>/)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "renders html" do
|
@@ -59,7 +59,7 @@ describe "The Brief Document" do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
it "gives me info about the section headings" do
|
62
|
-
expect(sample.section_headings).to include("
|
62
|
+
expect(sample.section_headings).to include("features")
|
63
63
|
end
|
64
64
|
|
65
65
|
it "has the information from the sections" do
|
@@ -68,13 +68,13 @@ describe "The Brief Document" do
|
|
68
68
|
|
69
69
|
it "lets me define content sections" do
|
70
70
|
expect(sample.sections).not_to be_empty
|
71
|
-
expect(sample.sections.
|
72
|
-
expect(sample.sections.
|
73
|
-
expect(sample.sections.
|
71
|
+
expect(sample.sections.features).to be_present
|
72
|
+
expect(sample.sections.features.fragment.name).to eq("section")
|
73
|
+
expect(sample.sections.features.fragment.css("article").length).to eq(3)
|
74
74
|
end
|
75
75
|
|
76
76
|
it "gives me an array of items underneath the section filled with the key value mappings i laid out" do
|
77
|
-
items = sample.sections.
|
77
|
+
items = sample.sections.features.items
|
78
78
|
expect(items.length).to eq(3)
|
79
79
|
expect(items.map(&:components).map(&:first).uniq).to eq(["User"])
|
80
80
|
end
|
data/spec/lib/brief/dsl_spec.rb
CHANGED
@@ -5,7 +5,7 @@ describe "The Configuration DSL" do
|
|
5
5
|
let(:briefcase) { Brief.testcase }
|
6
6
|
|
7
7
|
it "can create methods on our models" do
|
8
|
-
expect(briefcase.
|
8
|
+
expect(briefcase.features.first.defined_helper_method).to eq(true)
|
9
9
|
end
|
10
10
|
|
11
11
|
it "treats actions as available commands" do
|
@@ -13,7 +13,7 @@ describe "The Configuration DSL" do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "doesnt treat helpers as available commands" do
|
16
|
-
expect(Brief::Epic.defined_helper_methods).to include(:
|
17
|
-
expect(Brief::Epic.defined_actions).not_to include(:
|
16
|
+
expect(Brief::Epic.defined_helper_methods).to include(:features)
|
17
|
+
expect(Brief::Epic.defined_actions).not_to include(:features)
|
18
18
|
end
|
19
19
|
end
|
@@ -3,41 +3,41 @@ require "spec_helper"
|
|
3
3
|
describe "The Brief Model" do
|
4
4
|
let(:briefcase) { Brief.testcase }
|
5
5
|
let(:epic) { briefcase.epics.first }
|
6
|
-
let(:
|
6
|
+
let(:feature) { briefcase.features.first }
|
7
7
|
|
8
8
|
it "exposes information about its schema" do
|
9
9
|
expect(epic.class.to_schema.keys).to include(:schema, :name, :class_name, :type_alias)
|
10
10
|
end
|
11
11
|
|
12
12
|
context "DSL Style Declarations" do
|
13
|
-
it "picks up a definition of '
|
14
|
-
expect(briefcase.model("
|
13
|
+
it "picks up a definition of 'Feature'" do
|
14
|
+
expect(briefcase.model("Feature")).to be_present
|
15
15
|
end
|
16
16
|
|
17
17
|
it "defines a class for us" do
|
18
|
-
expect((Brief::Model::
|
18
|
+
expect((Brief::Model::Feature rescue nil)).to be_present
|
19
19
|
end
|
20
20
|
|
21
21
|
it "shows up in the model definitions table" do
|
22
|
-
expect(Brief::Model.table.
|
22
|
+
expect(Brief::Model.table.feature).to be_present
|
23
23
|
end
|
24
24
|
|
25
25
|
it "has a definition" do
|
26
|
-
expect(Brief::Model::
|
26
|
+
expect(Brief::Model::Feature.definition).to be_a(Brief::Model::Definition)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "has paths and document attributes by default" do
|
30
|
-
set = Brief::Model::
|
30
|
+
set = Brief::Model::Feature.attribute_set.map(&:name)
|
31
31
|
expect(set).to include(:path, :document)
|
32
32
|
end
|
33
33
|
|
34
34
|
it "has the attributes defined in the DSL" do
|
35
|
-
set = Brief::Model::
|
35
|
+
set = Brief::Model::Feature.attribute_set.map(&:name)
|
36
36
|
expect(set).to include(:title, :status, :epic_title)
|
37
37
|
end
|
38
38
|
|
39
39
|
it "has attribute setters" do
|
40
|
-
story = Brief::Model::
|
40
|
+
story = Brief::Model::Feature.new
|
41
41
|
expect(story).to respond_to(:title=)
|
42
42
|
end
|
43
43
|
end
|
@@ -75,7 +75,7 @@ describe "The Brief Model" do
|
|
75
75
|
context "Briefcase Finders" do
|
76
76
|
it "creates methods on the briefcase for each class" do
|
77
77
|
expect(briefcase.epics).not_to be_empty
|
78
|
-
expect(briefcase.
|
78
|
+
expect(briefcase.features).not_to be_empty
|
79
79
|
end
|
80
80
|
|
81
81
|
it "finds instances of the desired model" do
|
@@ -103,18 +103,18 @@ describe "The Brief Model" do
|
|
103
103
|
end
|
104
104
|
|
105
105
|
it "users the actions block to define CLI dispatchers (dsl)" do
|
106
|
-
expect(
|
106
|
+
expect(feature.class.defined_actions).to include(:custom_action)
|
107
107
|
end
|
108
108
|
|
109
109
|
it "lets me define a helper method which utilizes all the extracted data and content structure" do
|
110
|
-
expect(epic.
|
111
|
-
expect(epic.
|
110
|
+
expect(epic.features.length).to eq(3)
|
111
|
+
expect(epic.features.map(&:persona)).to include("User")
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
115
115
|
context "Section Mappings" do
|
116
|
-
it "defines a section mapping for
|
117
|
-
mapping = epic.class.section_mapping("
|
116
|
+
it "defines a section mapping for Features" do
|
117
|
+
mapping = epic.class.section_mapping("Features")
|
118
118
|
expect(mapping).to be_a(Brief::Document::Section::Mapping)
|
119
119
|
end
|
120
120
|
end
|
@@ -31,8 +31,8 @@ describe "The Brief Document Repository" do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
it "finds the last document matching a query" do
|
34
|
-
query = repository.where(state:"active", type:"
|
35
|
-
expect(query.last.type).to eq("
|
34
|
+
query = repository.where(state:"active", type:"feature")
|
35
|
+
expect(query.last.type).to eq("feature")
|
36
36
|
end
|
37
37
|
|
38
38
|
it "respects the ordering" do
|
@@ -6,7 +6,7 @@ describe "Document Templates" do
|
|
6
6
|
title: "Epic Example",
|
7
7
|
status: "published",
|
8
8
|
type: "epic",
|
9
|
-
|
9
|
+
features:[{
|
10
10
|
title: "A user wants to do something",
|
11
11
|
paragraph: "As a user I would like to do something so that I can succeed",
|
12
12
|
goal: "I can succeed",
|
@@ -35,7 +35,7 @@ describe "Document Templates" do
|
|
35
35
|
doc = Brief::Document.create_from_data(data)
|
36
36
|
content = doc.content
|
37
37
|
|
38
|
-
expect(content).to include("#
|
38
|
+
expect(content).to include("# Features")
|
39
39
|
expect(content).to include("# Epic Example")
|
40
40
|
expect(content).to include("## A user wants to do something")
|
41
41
|
expect(content).to include("## A user wants to do something else")
|
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.10.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-05-
|
11
|
+
date: 2015-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|
@@ -305,6 +305,7 @@ files:
|
|
305
305
|
- apps/blueprint/example/docs/diagrams/example-diagram.md
|
306
306
|
- apps/blueprint/models/diagram.rb
|
307
307
|
- apps/blueprint/models/epic.rb
|
308
|
+
- apps/blueprint/models/feature.rb
|
308
309
|
- apps/blueprint/models/milestone.rb
|
309
310
|
- apps/blueprint/models/outline.rb
|
310
311
|
- apps/blueprint/models/page.rb
|
@@ -313,7 +314,6 @@ files:
|
|
313
314
|
- apps/blueprint/models/release.rb
|
314
315
|
- apps/blueprint/models/roadmap.rb
|
315
316
|
- apps/blueprint/models/sitemap.rb
|
316
|
-
- apps/blueprint/models/user_story.rb
|
317
317
|
- apps/blueprint/models/wireframe.rb
|
318
318
|
- apps/blueprint/templates/epic.md.erb
|
319
319
|
- apps/blueprint/templates/milestone.md.erb
|
@@ -521,3 +521,4 @@ test_files:
|
|
521
521
|
- spec/lib/brief/template_spec.rb
|
522
522
|
- spec/spec_helper.rb
|
523
523
|
- spec/support/test_helpers.rb
|
524
|
+
has_rdoc:
|