brief 1.17.0 → 1.17.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/apps/blueprint/lib/epic_publisher.rb +11 -0
- data/apps/blueprint/lib/feature_publisher.rb +29 -0
- data/apps/blueprint/lib/milestone_publisher.rb +29 -0
- data/apps/blueprint/lib/project_publisher.rb +29 -0
- data/apps/blueprint/models/epic.rb +46 -1
- data/apps/blueprint/models/feature.rb +13 -2
- data/apps/blueprint/models/milestone.rb +10 -0
- data/apps/blueprint/models/project.rb +10 -0
- data/apps/blueprint/templates/feature.md.erb +0 -0
- data/lib/brief/document/source_map.rb +8 -3
- data/lib/brief/version.rb +1 -1
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d6d8f0dae8f7fc8a692782b2aa637724d54299b
|
4
|
+
data.tar.gz: 63459143af9c3b81c6c5624ea9713b5e6ac3652d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72b3c6b064a35c9561f17d0282dbd4c4d8fe575e267f0095c4b7c5a236a072687d3473fe834c8eab5e09bf667ebceb0926d75e80cf7e3aad072075d0d572c6f8
|
7
|
+
data.tar.gz: 81b53e8813875d7a708e4a9398cf5b579c6f5f4d61780e90913790a0fb9c30fa58bb39dece4d8d6cb62a1fa7e76c140da69ae721834683a1fcf3adb101aa6e66
|
data/Gemfile.lock
CHANGED
@@ -13,6 +13,17 @@ class BlueprintEpicPublisher
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
def self.syn(epic, options={})
|
17
|
+
via = (options.fetch(:via, :github) || :github)
|
18
|
+
|
19
|
+
if respond_to?("sync_via_#{via}")
|
20
|
+
send("sync_via_#{via}", epic,options)
|
21
|
+
else
|
22
|
+
raise "Invalid syncing source. Need to implement sync_via_#{via} method"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
16
27
|
# Epics get published to Pivotal
|
17
28
|
# directly as epics, since Epics have first class support in pivotal
|
18
29
|
def self.publish_via_pivotal(epic, options={})
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class BlueprintFeaturePublisher
|
2
|
+
def self.publish(epic, options={})
|
3
|
+
via = (options.fetch(:via, :github) || :github)
|
4
|
+
|
5
|
+
if respond_to?("publish_via_#{via}")
|
6
|
+
send("publish_via_#{via}", epic,options)
|
7
|
+
else
|
8
|
+
raise "Invalid publishing source. Need to implement publish_via_#{via} method"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.sync(epic, options={})
|
13
|
+
via = (options.fetch(:via, :github) || :github)
|
14
|
+
|
15
|
+
if respond_to?("sync_via_#{via}")
|
16
|
+
send("sync_via_#{via}", epic,options)
|
17
|
+
else
|
18
|
+
raise "Invalid syncing source. Need to implement sync_via_#{via} method"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.publish_via_pivotal(epic, options={})
|
23
|
+
raise "Not Implemented. Implement #{ name }.publish_via_pivotal"
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.publish_via_github(epic, options={})
|
27
|
+
raise "Not Implemented. Implement #{ name }.publish_via_github"
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class BlueprintMilestonePublisher
|
2
|
+
def self.publish(epic, options={})
|
3
|
+
via = (options.fetch(:via, :github) || :github)
|
4
|
+
|
5
|
+
if respond_to?("publish_via_#{via}")
|
6
|
+
send("publish_via_#{via}", epic,options)
|
7
|
+
else
|
8
|
+
raise "Invalid publishing source. Need to implement publish_via_#{via} method"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.sync(epic, options={})
|
13
|
+
via = (options.fetch(:via, :github) || :github)
|
14
|
+
|
15
|
+
if respond_to?("sync_via_#{via}")
|
16
|
+
send("sync_via_#{via}", epic,options)
|
17
|
+
else
|
18
|
+
raise "Invalid syncing source. Need to implement sync_via_#{via} method"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.publish_via_pivotal(epic, options={})
|
23
|
+
raise "Not Implemented. Implement #{ name }.publish_via_pivotal"
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.publish_via_github(epic, options={})
|
27
|
+
raise "Not Implemented. Implement #{ name }.publish_via_github"
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class BlueprintProjectPublisher
|
2
|
+
def self.publish(epic, options={})
|
3
|
+
via = (options.fetch(:via, :github) || :github)
|
4
|
+
|
5
|
+
if respond_to?("publish_via_#{via}")
|
6
|
+
send("publish_via_#{via}", epic,options)
|
7
|
+
else
|
8
|
+
raise "Invalid publishing source. Need to implement publish_via_#{via} method"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.sync(epic, options={})
|
13
|
+
via = (options.fetch(:via, :github) || :github)
|
14
|
+
|
15
|
+
if respond_to?("sync_via_#{via}")
|
16
|
+
send("sync_via_#{via}", epic,options)
|
17
|
+
else
|
18
|
+
raise "Invalid syncing source. Need to implement sync_via_#{via} method"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.publish_via_pivotal(epic, options={})
|
23
|
+
raise "Not Implemented. Implement #{ name }.publish_via_pivotal"
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.publish_via_github(epic, options={})
|
27
|
+
raise "Not Implemented. Implement #{ name }.publish_via_github"
|
28
|
+
end
|
29
|
+
end
|
@@ -58,6 +58,18 @@ class Brief::Apps::Blueprint::Epic
|
|
58
58
|
|
59
59
|
helpers do
|
60
60
|
def features
|
61
|
+
briefcase.features(project: project, epic: title)
|
62
|
+
end
|
63
|
+
|
64
|
+
def parent_project
|
65
|
+
briefcase.projects(project: project).first
|
66
|
+
end
|
67
|
+
|
68
|
+
def find_feature_by_title(feature_title)
|
69
|
+
briefcase.features(project: project, epic: title, title: feature_title)
|
70
|
+
end
|
71
|
+
|
72
|
+
def features_data
|
61
73
|
sections.features.items.map do |item|
|
62
74
|
item.components = Array(item.components)
|
63
75
|
|
@@ -68,8 +80,41 @@ class Brief::Apps::Blueprint::Epic
|
|
68
80
|
end
|
69
81
|
end
|
70
82
|
|
83
|
+
def generate_feature_content(feature_heading)
|
84
|
+
if feature_file_for(feature_heading).exist?
|
85
|
+
return feature_file_for(feature_heading).read
|
86
|
+
end
|
87
|
+
|
88
|
+
data = {
|
89
|
+
status: "published",
|
90
|
+
project: project,
|
91
|
+
epic: title,
|
92
|
+
title: feature_heading
|
93
|
+
}
|
94
|
+
|
95
|
+
content = raw_content_for_feature(feature_heading)
|
96
|
+
|
97
|
+
data.to_yaml + "\n---\n" + content
|
98
|
+
end
|
99
|
+
|
100
|
+
def feature_file_for(feature_heading)
|
101
|
+
folder = features_folder
|
102
|
+
filename = feature_heading.strip.parameterize
|
103
|
+
folder.join(filename)
|
104
|
+
end
|
105
|
+
|
106
|
+
def features_folder
|
107
|
+
briefcase.docs_path.join("features", project.parameterize, title.parameterize)
|
108
|
+
end
|
109
|
+
|
71
110
|
def raw_content_for_feature(feature_heading, include_heading=true)
|
72
|
-
document.content_under_heading(feature_heading, include_heading)
|
111
|
+
document.content_under_heading(feature_heading, include_heading).tap do |v|
|
112
|
+
|
113
|
+
# UGLY
|
114
|
+
# Promotes the h2 heading to an h1 for this document
|
115
|
+
v.gsub! "## #{ feature_heading }", "# #{ feature_heading }"
|
116
|
+
v.gsub! "###{ feature_heading }", "##{ feature_heading }"
|
117
|
+
end
|
73
118
|
end
|
74
119
|
|
75
120
|
def estimate_cli
|
@@ -11,7 +11,7 @@ class Brief::Apps::Blueprint::Feature
|
|
11
11
|
persona
|
12
12
|
goal
|
13
13
|
behavior
|
14
|
-
|
14
|
+
epic
|
15
15
|
remote_id
|
16
16
|
tags Array
|
17
17
|
end
|
@@ -26,7 +26,18 @@ class Brief::Apps::Blueprint::Feature
|
|
26
26
|
end
|
27
27
|
|
28
28
|
actions do
|
29
|
-
def
|
29
|
+
def publish
|
30
|
+
BlueprintFeaturePublisher.publish(self, via: briefcase.settings.try(:tracking_system))
|
31
|
+
end
|
32
|
+
|
33
|
+
def sync
|
34
|
+
BlueprintFeaturePublisher.sync(self, via: briefcase.settings.try(:tracking_system))
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
helpers do
|
39
|
+
def parent_epic
|
40
|
+
briefcase.epics(title: epic, project: data.project).first
|
30
41
|
end
|
31
42
|
end
|
32
43
|
end
|
@@ -18,4 +18,14 @@ class Brief::Apps::Blueprint::Milestone
|
|
18
18
|
paragraphs "p"
|
19
19
|
yaml_data "code.yaml:first-of-type", :serialize => :yaml, :hide => true
|
20
20
|
end
|
21
|
+
|
22
|
+
actions do
|
23
|
+
def publish
|
24
|
+
BlueprintMilestonePublisher.publish(self, via: briefcase.settings.try(:tracking_system))
|
25
|
+
end
|
26
|
+
|
27
|
+
def sync
|
28
|
+
BlueprintMilestonePublisher.sync(self, via: briefcase.settings.try(:tracking_system))
|
29
|
+
end
|
30
|
+
end
|
21
31
|
end
|
@@ -16,6 +16,16 @@ class Brief::Apps::Blueprint::Project
|
|
16
16
|
yaml_data "code.yaml:first-of-type", :serialize => :yaml, :hide => true
|
17
17
|
end
|
18
18
|
|
19
|
+
actions do
|
20
|
+
def publish
|
21
|
+
BlueprintProjectPublisher.publish(self, via: briefcase.settings.try(:tracking_system))
|
22
|
+
end
|
23
|
+
|
24
|
+
def sync
|
25
|
+
BlueprintProjectPublisher.sync(self, via: briefcase.settings.try(:tracking_system))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
19
29
|
def epics
|
20
30
|
briefcase.epics(project: title)
|
21
31
|
end
|
File without changes
|
@@ -34,15 +34,20 @@ module Brief::Document::SourceMap
|
|
34
34
|
def content_under_heading(heading_element, include_heading=true)
|
35
35
|
if heading_element.is_a?(String) && heading_element.length > 1
|
36
36
|
heading_element = heading_element_tags.find do |el|
|
37
|
-
el.attr('data-heading').include?(heading_element) || el.text.to_s.include?(heading_element)
|
37
|
+
el.attr('data-heading').include?(heading_element.strip.downcase) || el.text.to_s.strip.downcase.include?(heading_element.strip.downcase)
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
if heading_element.nil?
|
42
|
+
return nil
|
43
|
+
end
|
44
|
+
|
41
45
|
start_index = heading_element.attr('data-line-number').to_i
|
42
|
-
end_index = content.lines.length
|
43
46
|
|
44
47
|
if next_heading = next_sibling_heading_for(heading_element)
|
45
48
|
end_index = next_heading.attr('data-line-number').to_i
|
49
|
+
else
|
50
|
+
end_index = raw_content.lines.length + 1
|
46
51
|
end
|
47
52
|
|
48
53
|
end_index = end_index - start_index
|
@@ -50,6 +55,6 @@ module Brief::Document::SourceMap
|
|
50
55
|
|
51
56
|
lines = raw_content.lines.dup.slice(start_index - 1, end_index)
|
52
57
|
|
53
|
-
(include_heading ? lines : lines.slice(1, lines.length)).join("")
|
58
|
+
Array(include_heading ? lines : lines.slice(1, lines.length)).join("")
|
54
59
|
end
|
55
60
|
end
|
data/lib/brief/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brief
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.17.
|
4
|
+
version: 1.17.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Soeder
|
@@ -344,6 +344,9 @@ files:
|
|
344
344
|
- apps/blueprint/examples/wireframe.md
|
345
345
|
- apps/blueprint/extensions/middleman.rb
|
346
346
|
- apps/blueprint/lib/epic_publisher.rb
|
347
|
+
- apps/blueprint/lib/feature_publisher.rb
|
348
|
+
- apps/blueprint/lib/milestone_publisher.rb
|
349
|
+
- apps/blueprint/lib/project_publisher.rb
|
347
350
|
- apps/blueprint/models/concept.rb
|
348
351
|
- apps/blueprint/models/diagram.rb
|
349
352
|
- apps/blueprint/models/epic.rb
|
@@ -359,6 +362,7 @@ files:
|
|
359
362
|
- apps/blueprint/models/sitemap.rb
|
360
363
|
- apps/blueprint/models/wireframe.rb
|
361
364
|
- apps/blueprint/templates/epic.md.erb
|
365
|
+
- apps/blueprint/templates/feature.md.erb
|
362
366
|
- apps/blueprint/templates/milestone.md.erb
|
363
367
|
- apps/blueprint/templates/page.md.erb
|
364
368
|
- apps/blueprint/templates/persona.md.erb
|