brief 1.17.9 → 1.17.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: faf6fee908cd26f6c56e6b7666a69a54cdd485c4
4
- data.tar.gz: 601462587977651e9c5836442448cc18a71030b9
3
+ metadata.gz: 29b72df28a6667259acc1ee62242da76037e02fa
4
+ data.tar.gz: bbd15b759f0b16bfd3f70fd3cf323f35133db188
5
5
  SHA512:
6
- metadata.gz: 07b3796eecb3fa04b0368696d0dc83e337af1e9b0c4d037d13bb10e23f228330e9dbc85158eb3f107dff2c3479ab88e7b9c75c0bac3740a69a665f1a9bac2085
7
- data.tar.gz: 538b9687ac9dbe8b1a240fee5484ab417347c802b9a7e37c8f0e1886b397eeda94d4eb01a11c10c404c718cc44a090a28195bb38f785dfe735deea308fb9c9e8
6
+ metadata.gz: 73d62db93d1df6b6c47fcac79acdd1ee12b8a77f0752fe2731e5632b2060074cecc2d04630c5f72ef26f5431e52cae10ba8b0cdde19a8671a51c05610fcb81a2
7
+ data.tar.gz: b48a215e6ecfef573bb611f0423546db4f0298efddaac410104884b266dc07d557568ac57b323c1e6fd06f978f3bec6d0dee1c0b3eeb841fddf7be353f64d481
@@ -15,7 +15,7 @@
15
15
  patterns = [
16
16
  '.png', '.gif', '.jpg', '.jpeg', '.svg', # Images
17
17
  '.eot', '.otf', '.svc', '.woff', '.ttf', # Fonts
18
- '.js', '.slim', '.erb', '.md', # Javascript
18
+ '.js', '.slim', '.erb', '.md', '.psd' # Javascript
19
19
  ].map { |e| File.join(blueprint.assets_path, "**", "*#{e}" ) }
20
20
 
21
21
  sprockets.prepend_path(blueprint.assets_path)
@@ -0,0 +1,3 @@
1
+ # Advanced Features
2
+
3
+ Here I'll cover advanced features such as YAML serialization.
@@ -0,0 +1,4 @@
1
+ # Application Interfaces
2
+
3
+ Here I'll document the REST Interface and the Websocket Interface for
4
+ the Brief Gem.
@@ -0,0 +1,5 @@
1
+ # Brief Apps
2
+
3
+ Here I'll talk about the concept of the Brief app as a tool for defining
4
+ re-usable model definitions that can be documented, shipped with
5
+ examples, templates, and other useful features.
data/docs/brief-cli.md ADDED
@@ -0,0 +1,5 @@
1
+ # Brief Command Line Interface
2
+
3
+ Here I'll describe the way the Brief gem lets use manipulate documents
4
+ or render them and export them in other formats using the built in
5
+ command line interface.
@@ -0,0 +1,4 @@
1
+ # Brief Models
2
+
3
+ Here I'll document the behavior of the Brief Model, and specific
4
+ settings.
File without changes
@@ -0,0 +1,3 @@
1
+ # Briefcase Structure
2
+
3
+ Here I'll talk about the organization structure within a briefcase, including how documents are organized and how assets can be included.
@@ -0,0 +1,5 @@
1
+ # Briefcase Renderers
2
+
3
+ Here I'll discuss the use of different rendering systems for a
4
+ briefcase, such as a middleman application, react.js application, or a
5
+ PDF
File without changes
data/docs/index.md ADDED
@@ -0,0 +1,15 @@
1
+ # Brief Documentation
2
+
3
+ - Intro
4
+ - Briefcase Folder Structure
5
+ - Brief Model Classes
6
+ - Briefcase Document Structure
7
+ - Brief Command Line Interface
8
+ - Views and Commands
9
+ - Markdown Extensions
10
+ - Brief Apps
11
+ - Briefcase Renderers
12
+ - Application Interfaces
13
+ - Advanced Features
14
+ - Real world examples
15
+
data/docs/intro.md ADDED
@@ -0,0 +1,122 @@
1
+ # A Brief Introduction to Brief
2
+
3
+ Brief provides an object / relational data layer on top of collections of markdown documents.
4
+
5
+ It lets you use normal writing that occurs in files and folders with a person's favorite text editor
6
+ as your application's main user interface.
7
+
8
+ A Briefcase is a folder which contains Markdown documents. These
9
+ Markdown documents may contain YAML Frontmatter and/or Github Flavored
10
+ Markdown.
11
+
12
+ Through either the `type` value that is specified as YAML in the header,
13
+ or through the name of the folder it belongs to, a document can be
14
+ assigned a specific `Brief::Model` class which can give the document
15
+ and writing the same kind of special powers we give to a row in a SQL
16
+ table.
17
+
18
+ ### What is a Brief Model
19
+
20
+ The Model class acts as a specification for that type of document.
21
+
22
+ The specification defines the metadata it expects to see, and the
23
+ general structure the document should follow. It then lets the
24
+ programmer treat each individual document as an object, and do whatever
25
+ you want with it.
26
+
27
+ A document turned into a Brief object model will determine its state and
28
+ attributes in one of two ways:
29
+
30
+ 1) YAML Frontmatter that gets embedded in the header of the document
31
+ 2) Content extracted from the rendered markdown using a system of simple
32
+ CSS selectors
33
+
34
+ ### Why is this valuable?
35
+
36
+ I think this is great because a collection of markdown documents that
37
+ exists on Github is more than sufficient as a database of record for a
38
+ lot of different projects, and you get a lot of great features this way
39
+ for free such as audit trails, branching, discussions, task management,
40
+ etc.
41
+
42
+ Blogs are the most obvious example, but using Brief to write your blog
43
+ would be overkill. Brief is made to power much more ambitious kinds of
44
+ applications, and making it easier to use text editors and written
45
+ language as one of the primary interfaces.
46
+
47
+ ### An Example Brief Model
48
+
49
+ ```ruby
50
+ class Post
51
+ include Brief::Model
52
+
53
+ meta do
54
+ title
55
+ subtitle
56
+ status :default => "draft"
57
+ end
58
+
59
+ content do
60
+ title "h1:first-of-type"
61
+ subtitle "h2:first-of-type"
62
+ excerpt "h3#excerpt p", hide: true
63
+ end
64
+
65
+ actions do
66
+ def publish
67
+ set(state:"published", published_at: Time.now)
68
+ save
69
+ end
70
+ end
71
+ end
72
+ ```
73
+
74
+ In this specification for the `Post` model, we declared some acceptable
75
+ values in the YAML frontmatter, such as the title and subtitle of the
76
+ post.
77
+
78
+ We also say that the same values can be extracted from the document's h1
79
+ and h2 tags.
80
+
81
+ An example document might look like:
82
+
83
+ ```markdown
84
+ ---
85
+ type: post
86
+ title: Introduction to Brief
87
+ ---
88
+
89
+ ### Excerpt
90
+
91
+ We're going to go over some basics about the Brief gem. This content
92
+ won't be rendered in the final output, but will be extracted into an
93
+ excerpt attribute for the model.
94
+
95
+ # Brief
96
+ ## An introduction to brief
97
+
98
+ This content will get rendered.
99
+ ```
100
+
101
+ The Post model will turn this document into an object, and let us do
102
+ different things with it in our code.
103
+
104
+ A post model can be used as application data in a Ruby app.
105
+
106
+ ```ruby
107
+ post = Post.where(:title.matches => "Intro")
108
+ post.title # "Introduction to Brief"
109
+ post.status # "draft"
110
+ ```
111
+
112
+ Or interacted with from the command line:
113
+
114
+ ```bash
115
+ brief publish post docs/posts/introduction-to-brief.md
116
+ ```
117
+
118
+ ### The rest is up to you.
119
+
120
+ There is more to the gem which we will cover later, but this is
121
+ a very powerful way to build applications which are powered primarily by
122
+ structured writing.
@@ -0,0 +1,5 @@
1
+ # Markdown Extensions
2
+
3
+ Here I'll discuss some of the syntax enhancements we've made to markdown
4
+ to make documents linkable within a briefcase, or to embed another
5
+ documents content or embed an SVG asset inline as XML.
File without changes
@@ -0,0 +1,3 @@
1
+ # Views And Commands
2
+
3
+ Here I'll document how the briefcase can be rendered in alternative formats using views, and how the briefcase can define commands to run on a briefcase level
data/lib/brief.rb CHANGED
@@ -10,6 +10,7 @@ require 'yaml'
10
10
  require 'erb'
11
11
  require 'hike'
12
12
  require 'pry'
13
+ require 'logger'
13
14
 
14
15
  module Brief
15
16
  # When packaging this up through the traveling ruby system
@@ -1,3 +1,14 @@
1
+ # A Briefcase is a repository of markdown documents which are turned into active-record like model objects.
2
+ #
3
+ # Special behaviors can be built into these documents by assigning them a `type` value. Doing this is done either
4
+ # by
5
+ #
6
+ # A Briefcase contains a query interface for different Brief::Documents. A Brief::Document takes YAML frontmatter,
7
+ # and rendered markdown, and builds key / value attribute pairs for the document. Each document expects to be able
8
+ # to determine its type by accessing the type field contained in the YAML frontmatter
9
+ #
10
+ # The Briefcase allows you to treat each markdown document as
11
+ #
1
12
  module Brief
2
13
  class Briefcase
3
14
  include Brief::DSL
@@ -9,9 +20,25 @@ module Brief
9
20
  attr_accessor :asset_finder,
10
21
  :href_builder
11
22
 
23
+ # Creates a new briefcase
24
+ #
25
+ # options:
26
+ # - root: (required) the root folder of the briefcase project. will default to PWD
27
+ #
28
+ # - app: (optional) the name of the app this briefcase should use
29
+ #
30
+ # - logger: a logger instance, will default to Logger.new(STDOUT)
31
+ #
32
+ # - href_builder: (optional) reference to a block which will be used to post-process any generated
33
+ # href values for the documents in this briefcase. This will generally be used by
34
+ # apps which render the briefcase content.
35
+ # - asset_finder: (optional) reference to a block which will be used to find assets when used as attachments
36
+ # or when embedding inline:svg through the special image markdown syntax
12
37
  def initialize(options = {})
13
38
  @options = options.to_mash
14
39
 
40
+ debug "Created briefcase instance #{ object_id } at #{ root }"
41
+
15
42
  load_configuration
16
43
  use(:app, options[:app]) if options[:app]
17
44
 
@@ -26,15 +53,34 @@ module Brief
26
53
 
27
54
  Brief.cases[root.basename.to_s] ||= self
28
55
 
56
+ @logger = options.fetch(:logger, nil)
57
+
58
+ debug "Loading briefcase lib entries"
29
59
  load_briefcase_lib_entries()
30
60
  end
31
61
 
62
+ def logger
63
+ @logger ||= Logger.new(STDOUT)
64
+ end
65
+
66
+ def log message
67
+ logger.info(message)
68
+ end
69
+
70
+ def debug message
71
+ logger.debug(message) if debug?
72
+ end
73
+
74
+ def debug?
75
+ options.fetch(:debug, nil) || ENV['BRIEF_DEBUG']
76
+ end
77
+
32
78
  def load_briefcase_lib_entries
33
79
  begin
34
80
  etc = Dir[briefcase_lib_path.join("**/*.rb")]
35
81
  etc.each {|f| require(f) } if briefcase_lib_path.exist?
36
- rescue
37
-
82
+ rescue => e
83
+ debug "Error while loading briefcase entries: #{ e.message }"
38
84
  end
39
85
  end
40
86
 
data/lib/brief/model.rb CHANGED
@@ -11,11 +11,12 @@ module Brief
11
11
  include Virtus.model(finalize: false)
12
12
  include Initializers
13
13
  include AccessorMethods
14
+ include LoggerMethods
14
15
  include Persistence
15
16
  include Serializers
16
17
  include Reports
17
18
 
18
- class_attribute :models, :after_initialization_hooks
19
+ class_attribute :models, :after_initialization_hooks, :logger
19
20
 
20
21
  self.models = Array(models).to_set
21
22
 
@@ -29,6 +30,20 @@ module Brief
29
30
  Brief::Model.classes << self
30
31
  end
31
32
 
33
+ module LoggerMethods
34
+ def log message
35
+ (!briefcase.nil? && briefcase.log(message))
36
+ end
37
+
38
+ def debug message
39
+ (!briefcase.nil? && briefcase.debug(message))
40
+ end
41
+
42
+ def puts message
43
+ (!briefcase.nil? && briefcase.log(message)) || super
44
+ end
45
+ end
46
+
32
47
  module AccessorMethods
33
48
  def title
34
49
  document_title
data/spec/spec_helper.rb CHANGED
@@ -2,6 +2,8 @@ require 'pry'
2
2
  require 'rack/test'
3
3
  require 'brief'
4
4
 
5
+ ENV['BRIEF_DEBUG'] = "true"
6
+
5
7
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
6
8
 
7
9
  module Brief
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.17.9
4
+ version: 1.17.10
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-07-12 00:00:00.000000000 Z
11
+ date: 2015-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -386,6 +386,20 @@ files:
386
386
  - bin/brief
387
387
  - bin/console
388
388
  - brief.gemspec
389
+ - docs/advanced-features.md
390
+ - docs/application-interfaces.md
391
+ - docs/brief-apps.md
392
+ - docs/brief-cli.md
393
+ - docs/brief-model-classes.md
394
+ - docs/briefcase-document-structure.md
395
+ - docs/briefcase-folder-structure.md
396
+ - docs/briefcase-renderers.md
397
+ - docs/document-sections.md
398
+ - docs/index.md
399
+ - docs/intro.md
400
+ - docs/markdown-extensions.md
401
+ - docs/real-world-examples.md
402
+ - docs/views-and-commands.md
389
403
  - examples/blog/brief.rb
390
404
  - examples/blog/docs/posts/this-is-my-first-post.md
391
405
  - lib/brief.rb