brief 1.9.11 → 1.9.12

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0df5a7957404e6281f7da3ea81daae61d24a2b42
4
- data.tar.gz: eab76b0724000e106e08579e415570fd474a8139
3
+ metadata.gz: 316633c274b953b641bfba353bd834ba968a22a7
4
+ data.tar.gz: db0f92002cd2c63c2e44dfb89972fec21f1ea9e7
5
5
  SHA512:
6
- metadata.gz: eabd297d3e1ee5ce7291156a91084a52e095aca03b798cbb1000c55fa1516c12801ceec9a8b1ec6d50f84b787057b4837d289efd67194bd967e47df262e53ae1
7
- data.tar.gz: aebc6b9b3dc5974beda9cc6ca301bc0e65fd2e9009721f728258fdef68820a83660e790a6d7e454c01616e86033b18f6ed35d0129b9abb75276ef2293547dbb4
6
+ metadata.gz: 716128ec26d9525c7eddca5c448ff4486a95ac0aff751ba2fd33e38c99981067015e13223cf4d93a07d332a9f7ae627c9a176748117033020c634c967b639a68
7
+ data.tar.gz: f72905da6879984d8b52b5252024cb1e876781f2fef27c5fb43c3c732332a942ba62337c28ff530ba5e55a114b910f8dd203a3bf27fd4d92e32191cc201da061
data/CHANGELOG.md CHANGED
@@ -134,3 +134,13 @@ attributes.
134
134
  - Cleaned up some implementations
135
135
  - Fully implemented the command set
136
136
  - CLI can be used to generate JSON data
137
+
138
+ ### 1.9.4
139
+ - Added support for including asset attachments inline as data
140
+
141
+ ### 1.9.10
142
+ - Added a websocket server for easy on the fly parsing / querying
143
+
144
+ ### 1.9.12
145
+ - Included ability to transform content using special markdown link syntax
146
+ - Included ability to inline svg assets
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- brief (1.9.11)
4
+ brief (1.9.12)
5
5
  activesupport (~> 4.0)
6
6
  commander (~> 4.3)
7
7
  em-websocket (= 0.5.1)
@@ -1,13 +1,7 @@
1
- # Blueprint Diagram
1
+ #### Blueprint Diagram
2
2
 
3
- The Diagram model is useful for combining notes with an SVG diagram.
3
+ The Diagram model is useful for combining notes with an SVG diagram.
4
4
 
5
- One workflow I like to use is building a UML Diagram in Google Draw, and
6
- exporting it as SVG. Then using a tool like Adobe Illustrator, I will
7
- group the elements of the diagram, and then assign IDs and Classes to
8
- them.
5
+ One workflow I like to use is building a UML Diagram in Google Draw, and exporting it as SVG. Then using a tool like Adobe Illustrator, I will group the elements of the diagram, and then assign IDs and Classes to them.
9
6
 
10
- The Diagram document allows for a section called Annotations. The
11
- Annotations section will be parsed, and treated as data. This allows
12
- for rendering the diagram document, along with the diagram itself, and
13
- displaying the annotations in a novel way.
7
+ The Diagram document allows for a section called Annotations. The Annotations section will be parsed, and treated as data. This allows for rendering the diagram document, along with the diagram itself, and displaying the annotations in a novel way.
@@ -1,10 +1,7 @@
1
- # Feature Epics
1
+ #### Feature Epics
2
2
 
3
- The Feature Epic model is a document that is used to document a bunch of
4
- related user stories related to a general feature category or group.
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.
5
4
 
6
- For example you might have a "3rd Party Integrations" Epic which has
7
- User Stories for LinkedIn, Facebook, Github, and Twitter.
5
+ For example you might have a "3rd Party Integrations" Epic which has User Stories for LinkedIn, Facebook, Github, and Twitter.
8
6
 
9
- The Epic Document can be used to describe the importance of the module
10
- as a whole at the same time that it captures the user stories.
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,4 +1,3 @@
1
- # Milestone
1
+ #### Milestone
2
2
 
3
- The milestone represents a due date for a release or delivery of
4
- software.
3
+ The milestone represents a due date for a release or delivery of software.
@@ -1,6 +1,3 @@
1
- # Outline
1
+ #### Outlines
2
2
 
3
- The Outline document can be used to create a summary page with links to
4
- a bunch of other pages.
5
-
6
- The outline model can be
3
+ The Outline document can be used to create a summary page with links to a bunch of other pages.
@@ -0,0 +1 @@
1
+ #### Pages
@@ -0,0 +1 @@
1
+ #### Personas
@@ -0,0 +1 @@
1
+ #### Projects
@@ -0,0 +1 @@
1
+ #### Releases
@@ -0,0 +1 @@
1
+ #### Roadmaps
@@ -0,0 +1 @@
1
+ #### Sitemaps
@@ -0,0 +1 @@
1
+ #### User Stories
@@ -0,0 +1 @@
1
+ #### Wireframes
data/lib/brief.rb CHANGED
@@ -112,6 +112,7 @@ require 'brief/document/rendering'
112
112
  require 'brief/document/front_matter'
113
113
  require 'brief/document/templating'
114
114
  require 'brief/document/content_extractor'
115
+ require 'brief/document/transformer'
115
116
  require 'brief/document/structure'
116
117
  require 'brief/document/section'
117
118
  require 'brief/document/section/mapping'
@@ -51,24 +51,31 @@ module Brief
51
51
  end
52
52
  end
53
53
 
54
- # TODO
55
- # The serialization of an entire briefcase at once
56
- # is important enough to be its own module
57
- def as_default(params={})
58
- params.symbolize_keys!
59
-
60
- base = {
54
+ def info_hash
55
+ {
56
+ BRIEF_VERSION: Brief::VERSION,
61
57
  views: Brief.views.keys,
62
58
  key: folder_name.to_s.parameterize,
63
59
  name: folder_name.to_s.titlecase,
64
60
  settings: settings,
65
61
  cache_key: cache_key,
66
62
  root: root.to_s,
67
- docs_path: docs_path.to_s,
68
- assets_path: assets_path.to_s,
69
- models_path: models_path.to_s,
70
- data_path: data_path.to_s
63
+ paths:{
64
+ docs_path: docs_path.to_s,
65
+ assets_path: assets_path.to_s,
66
+ models_path: models_path.to_s,
67
+ data_path: data_path.to_s
68
+ }
71
69
  }
70
+ end
71
+
72
+ # TODO
73
+ # The serialization of an entire briefcase at once
74
+ # is important enough to be its own module
75
+ def as_default(params={})
76
+ params.symbolize_keys!
77
+
78
+ base = info_hash
72
79
 
73
80
  if params[:include_data] || params[:data]
74
81
  base[:data] = data.as_json
@@ -93,7 +100,10 @@ module Brief
93
100
 
94
101
  all = all_models.compact
95
102
 
96
- base[:models] = all.map {|m| m.as_json(model_settings) }
103
+ base[:models] = all.map do |m|
104
+ m.document.refresh! if params[:refresh_models]
105
+ m.as_json(model_settings)
106
+ end
97
107
  end
98
108
 
99
109
  base
@@ -104,6 +114,7 @@ module Brief
104
114
  rendered: true,
105
115
  models: true,
106
116
  schema: true,
117
+ documentation: true,
107
118
  attachments: true)
108
119
  as_default(options)
109
120
  end
@@ -270,17 +270,37 @@ module Brief
270
270
  super || (data && data.respond_to?(method)) || (data && data.key?(method))
271
271
  end
272
272
 
273
+ # The structure analyzer of the document is responsible for grouping
274
+ # the content under the headings by wrapping them in divs, and creating
275
+ # relationships between the nodes. This is what lets us provide an easy
276
+ # iteration API on top of the parsed document
273
277
  def structure
274
278
  @structure_analyzer ||= Brief::Document::Structure.new(fragment, raw_content.lines.to_a)
275
279
  end
276
280
 
281
+ # The Parser wraps the rendered HTML in a nokogiri element so we can easily manipulate it.
282
+ # Prior to doing so, we use the structure analyzer to build more metadata into the markup
277
283
  def parser
278
284
  @parser ||= begin
279
285
  structure.prescan
280
- structure.create_wrappers
286
+
287
+ structure.create_wrappers.tap do |f|
288
+ transformer_for(f).all if data.transform
289
+ end
281
290
  end
282
291
  end
283
292
 
293
+ # The transformer is responsible for performing content modifications
294
+ # on the rendered document. This is useful for supporting extensions that
295
+ # are driven by the markdown language.
296
+ #
297
+ # TODO: This is hidden behind a feature flag, and requires the document
298
+ # to have metadata that specifies transform = true
299
+ def transformer_for(doc_fragment=nil)
300
+ doc_fragment ||= fragment
301
+ @transformer ||= Brief::Document::Transformer.new(doc_fragment, self)
302
+ end
303
+
284
304
  def fragment
285
305
  @fragment ||= Nokogiri::HTML.fragment(to_raw_html)
286
306
  end
@@ -1,16 +1,10 @@
1
1
  module GitHub
2
2
  class Markdown
3
-
4
3
  def self.render_gfm(content)
5
- html = self.to_html(content, :gfm)
6
- html = add_level_and_heading(html)
7
- html
8
- end
9
-
10
- def self.add_level_and_heading(html)
11
- html.gsub(/<h([1-6])>(.+?)<\/h\1>/,"<h\\1 data-level='\\1' data-heading='\\2'>\\2<\/h\\1>")
4
+ self.to_html(content, :gfm).tap do |html|
5
+ html.gsub!(/<h([1-6])>(.+?)<\/h\1>/,"<h\\1 data-level='\\1' data-heading='\\2'>\\2<\/h\\1>")
6
+ end
12
7
  end
13
-
14
8
  end
15
9
  end
16
10
 
@@ -0,0 +1,77 @@
1
+ module Brief
2
+ class Document::Transformer
3
+ attr_reader :document, :fragment
4
+
5
+ def initialize(fragment, document)
6
+ @fragment = fragment
7
+ @document = document
8
+ end
9
+
10
+ def all
11
+ transform_dynamic_links
12
+ inline_svg_content
13
+ end
14
+
15
+ def inline_svg_content
16
+ inline_svg_images.each do |img|
17
+ _, value = img['src'].to_s.split("=")
18
+
19
+ if asset = document.briefcase.find_asset(value)
20
+ img.replace("<div class='svg-wrapper'>#{ asset.read }</div>")
21
+ end
22
+ end
23
+ end
24
+
25
+ def transform_dynamic_links
26
+ dynamic_link_elements.each do |node|
27
+ attribute, value = node['href'].to_s.split("=")
28
+ instruction, strategy = node.text.to_s.split(':')
29
+
30
+ if instruction == "link" && attribute == "path"
31
+ begin
32
+ link_to_doc = document.briefcase.document_at(value)
33
+ text = link_to_doc.send(strategy)
34
+ node.inner_html = text
35
+ node['href'] = "brief://#{ link_to_doc.path }"
36
+ rescue
37
+ nil
38
+ end
39
+ end
40
+ end
41
+
42
+ include_link_elements.each do |node|
43
+ attribute, value = node['href'].to_s.split("=")
44
+ instruction, strategy = node.text.to_s.split(':')
45
+
46
+ if instruction == "include" && attribute == "path"
47
+ include_doc = document.briefcase.document_at(value)
48
+
49
+ replacement = nil
50
+
51
+ if strategy == "raw_content"
52
+ replacement = include_doc.unwrapped_html
53
+ elsif strategy == "content"
54
+ replacement = include_doc.to_html
55
+ end
56
+
57
+ node.replace(replacement) if replacement
58
+ end
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def inline_svg_images
65
+ fragment.css('img[alt="inline:svg"]')
66
+ end
67
+
68
+ def dynamic_link_elements(needle="link:")
69
+ fragment.css('a:contains("' + needle + '")')
70
+ end
71
+
72
+ def include_link_elements
73
+ dynamic_link_elements("include:")
74
+ end
75
+ end
76
+ end
77
+
data/lib/brief/dsl.rb CHANGED
@@ -10,6 +10,7 @@ module Brief
10
10
  Brief.views[name.to_sym] = block
11
11
  end
12
12
 
13
+ # Extends an existing class
13
14
  def extend(*args, &block)
14
15
  options = args.dup.extract_options!
15
16
  name = args.first
@@ -27,6 +28,7 @@ module Brief
27
28
  klass.definition.validate!
28
29
  end
29
30
 
31
+ # defines a new model class
30
32
  def define(*args, &block)
31
33
  options = args.dup.extract_options!
32
34
  name = args.first
data/lib/brief/model.rb CHANGED
@@ -142,18 +142,48 @@ module Brief
142
142
  rendered: model_doc.rendered
143
143
  }
144
144
  else
145
- {
146
- }
145
+ { }
146
+ end
147
+ end
148
+
149
+ def content_schema_summary
150
+ base = definition.content_schema.attributes
151
+
152
+ base.keys.inject({}) do |memo, key|
153
+ val = base[key]
154
+ args = Array(val[:args])
155
+ first = args.first
156
+ memo[key] = first if first
157
+ memo
158
+ end
159
+ end
160
+
161
+ def metadata_schema_summary
162
+ base = definition.metadata_schema
163
+
164
+ base.keys.inject({}) do |memo, key|
165
+ val = base[key]
166
+ args = Array(val[:args])
167
+ first = args.first.to_s
168
+
169
+ if args.length == 1 && first == key.to_s
170
+ memo[key] = "string"
171
+ elsif args.length >= 2
172
+ memo[key] = args.last
173
+ end
174
+
175
+ memo
147
176
  end
148
177
  end
149
178
 
150
179
  def to_schema
151
180
  {
152
181
  schema: {
153
- content: definition.content_schema,
154
- metadata: definition.metadata_schema,
182
+ content: content_schema_summary,
183
+ metadata: metadata_schema_summary,
155
184
  },
156
185
  documentation: to_documentation,
186
+ defined_in: defined_in,
157
187
  class_name: to_s,
158
188
  type_alias: type_alias,
159
189
  name: name,
data/lib/brief/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Brief
2
- VERSION = '1.9.11'
2
+ VERSION = '1.9.12'
3
3
  end
@@ -18,6 +18,12 @@ define "Release" do
18
18
  end
19
19
  end
20
20
 
21
+ define "Outline" do
22
+ meta do
23
+ title
24
+ end
25
+ end
26
+
21
27
  define "User Story" do
22
28
  meta do
23
29
  title
@@ -1,10 +1,6 @@
1
1
  ---
2
2
  type: concept
3
-
3
+ needle: bw3bg25pgdk1dmlcc0i7vgfx8azujn0k7p17
4
4
  ---
5
5
 
6
- # Modified Content sorqvyr5bygiotiqfp2jnj3ku0k240xhv8uf
7
-
8
- 1
9
-
10
- 1
6
+ # Modified Content v4lk5hmstxxb5abwdg1txe5utwwasdwhdhid
@@ -1,10 +1,16 @@
1
1
  ---
2
2
  type: outline
3
+ title: Table of Contents
4
+ transform: true
3
5
  ---
4
6
 
7
+ [include:content](path=user_story.html.md)
8
+
5
9
  # Table of contents
6
10
 
7
11
  ## Personas
12
+ - [link:title](path=persona.html.md)
13
+
8
14
  ## Epics
9
15
  ## Wireframes
10
16
  ## Concepts
@@ -2,4 +2,7 @@
2
2
  type: wireframe
3
3
  title: Blueprint Wireframe Example
4
4
  subheading: A key concept to the domain model
5
+ transform: true
5
6
  ---
7
+
8
+ ![inline:svg](path=diagrams/test.svg)
@@ -11,7 +11,7 @@ describe "Packaged Apps" do
11
11
 
12
12
  it "renders documentation for the app" do
13
13
  rendered = blueprint.render_documentation.epic.rendered
14
- expect(rendered).to include("h1")
14
+ expect(rendered).to include("Feature Epics")
15
15
  end
16
16
 
17
17
  it "should find the right path for an app name" do
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ describe "Content Transformation" do
4
+ let(:outline) { Brief.testcase.document_at("index.md") }
5
+ let(:wireframe) { Brief.testcase.document_at("wireframe.html.md") }
6
+
7
+ it "transforms the link tags based on the DSL" do
8
+ html = outline.to_html
9
+ expect(html).to include("Blueprint Persona Example")
10
+ expect(html).to include("brief://")
11
+ end
12
+
13
+ it "automatically inlines SVG content for us" do
14
+ html = wireframe.to_html
15
+ expect(html).to include("svg-wrapper")
16
+ expect(html).to include("svg version")
17
+ end
18
+ end
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.9.11
4
+ version: 1.9.12
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-13 00:00:00.000000000 Z
11
+ date: 2015-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -353,6 +353,7 @@ files:
353
353
  - lib/brief/document/section/mapping.rb
354
354
  - lib/brief/document/structure.rb
355
355
  - lib/brief/document/templating.rb
356
+ - lib/brief/document/transformer.rb
356
357
  - lib/brief/document_mapper.rb
357
358
  - lib/brief/dsl.rb
358
359
  - lib/brief/model.rb
@@ -404,6 +405,7 @@ files:
404
405
  - spec/lib/brief/apps_spec.rb
405
406
  - spec/lib/brief/attachments_spec.rb
406
407
  - spec/lib/brief/briefcase_spec.rb
408
+ - spec/lib/brief/content_transformation_spec.rb
407
409
  - spec/lib/brief/data_spec.rb
408
410
  - spec/lib/brief/document_spec.rb
409
411
  - spec/lib/brief/dsl_spec.rb
@@ -499,6 +501,7 @@ test_files:
499
501
  - spec/lib/brief/apps_spec.rb
500
502
  - spec/lib/brief/attachments_spec.rb
501
503
  - spec/lib/brief/briefcase_spec.rb
504
+ - spec/lib/brief/content_transformation_spec.rb
502
505
  - spec/lib/brief/data_spec.rb
503
506
  - spec/lib/brief/document_spec.rb
504
507
  - spec/lib/brief/dsl_spec.rb