brief 0.0.1 → 0.0.2
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 +5 -13
- data/Gemfile +4 -0
- data/Gemfile.lock +81 -0
- data/Guardfile +5 -0
- data/LICENSE.txt +22 -0
- data/README.md +71 -0
- data/Rakefile +11 -0
- data/bin/brief +35 -0
- data/brief-0.0.1.gem +0 -0
- data/brief.gemspec +33 -0
- data/examples/project_overview.md +23 -0
- data/lib/brief/cli/commands/config.rb +40 -0
- data/lib/brief/cli/commands/publish.rb +27 -0
- data/lib/brief/cli/commands/write.rb +26 -0
- data/lib/brief/configuration.rb +134 -0
- data/lib/brief/document.rb +68 -0
- data/lib/brief/dsl.rb +0 -0
- data/lib/brief/formatters/base.rb +12 -0
- data/lib/brief/formatters/github_milestone_rollup.rb +52 -0
- data/lib/brief/git.rb +19 -0
- data/lib/brief/github/wiki.rb +9 -0
- data/lib/brief/github.rb +78 -0
- data/lib/brief/github_client/authentication.rb +32 -0
- data/lib/brief/github_client/client.rb +86 -0
- data/lib/brief/github_client/commands.rb +5 -0
- data/lib/brief/github_client/issue_labels.rb +65 -0
- data/lib/brief/github_client/issues.rb +22 -0
- data/lib/brief/github_client/milestone_issues.rb +13 -0
- data/lib/brief/github_client/organization_activity.rb +9 -0
- data/lib/brief/github_client/organization_issues.rb +13 -0
- data/lib/brief/github_client/organization_repositories.rb +20 -0
- data/lib/brief/github_client/organization_users.rb +9 -0
- data/lib/brief/github_client/repository_events.rb +8 -0
- data/lib/brief/github_client/repository_issue_events.rb +9 -0
- data/lib/brief/github_client/repository_issues.rb +8 -0
- data/lib/brief/github_client/repository_labels.rb +18 -0
- data/lib/brief/github_client/repository_milestones.rb +9 -0
- data/lib/brief/github_client/request.rb +181 -0
- data/lib/brief/github_client/request_wrapper.rb +121 -0
- data/lib/brief/github_client/response_object.rb +50 -0
- data/lib/brief/github_client/single_repository.rb +9 -0
- data/lib/brief/github_client/user_activity.rb +16 -0
- data/lib/brief/github_client/user_gists.rb +9 -0
- data/lib/brief/github_client/user_info.rb +9 -0
- data/lib/brief/github_client/user_issues.rb +13 -0
- data/lib/brief/github_client/user_organizations.rb +9 -0
- data/lib/brief/github_client/user_repositories.rb +9 -0
- data/lib/brief/github_client.rb +43 -0
- data/lib/brief/handlers/base.rb +62 -0
- data/lib/brief/handlers/github_issue.rb +41 -0
- data/lib/brief/handlers/github_milestone.rb +37 -0
- data/lib/brief/handlers/github_wiki.rb +11 -0
- data/lib/brief/line.rb +69 -0
- data/lib/brief/parser.rb +354 -0
- data/lib/brief/publisher/handler_manager.rb +47 -0
- data/lib/brief/publisher.rb +142 -0
- data/lib/brief/tree.rb +42 -0
- data/lib/brief/version.rb +9 -0
- data/lib/brief.rb +56 -0
- data/lib/core_ext.rb +37 -0
- data/spec/fixtures/front_end_tutorial.md +33 -0
- data/spec/fixtures/generated/project_overview.json +0 -0
- data/spec/fixtures/generator_dsl_example.rb +22 -0
- data/spec/fixtures/project_overview.md +48 -0
- data/spec/fixtures/sample.md +19 -0
- data/spec/lib/brief/document_spec.rb +35 -0
- data/spec/lib/brief/dsl_spec.rb +21 -0
- data/spec/lib/brief/line_spec.rb +11 -0
- data/spec/lib/brief/parser_spec.rb +12 -0
- data/spec/spec_helper.rb +25 -0
- metadata +231 -9
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
OWU2NWMwZjRjZWJmMjgxMTM4ZjI3ZGYzMGFhMjI3ZDIyOGJkMWNjZA==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7c6f64e7e55cb875b980ad06e7dbd5e66d0757d7
|
4
|
+
data.tar.gz: a285a1c7344f503d47c10cec106fe4e18f9a8443
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
YTg5NjE3OTczN2Q2NTQwMGFmMjNkYzYwYjA5ZGJmMDRmZjUzM2ZkNTRmMzUy
|
11
|
-
YWFiY2M5OTM1NWU3Y2RhMWM5NzRjZTFjMmJkNTE1NTdlOTZiOWY=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ZDEwYWIyZDk0ZTE3ODI1MzU1MTE0YWVhODAxNDRlYzYyNjM2MWNlYzdmNjQ4
|
14
|
-
NzI0ZGI2NGJjZDFkNDY0NDVjNmQxYTljMWZmNGNkZTc0MThjZGMyNGVjOGY2
|
15
|
-
N2U0NjQzOTU4NDk5MmU2ODRkYmUwNTU1Mjg2ZTVmNzg5ZDg5ZDI=
|
6
|
+
metadata.gz: a97e7f32844a0e7494e619a83ac5d8d08a775331ed97b4083b4833cd5117ad8568c2623048e72c702324ba81c59d508f4a63124b13b431bf4e96e4ef20fc2003
|
7
|
+
data.tar.gz: 3e5ee5019ef3cf20c4740b1957553b403772b0158b99bb896e449b9649b77b214ccba53fe3008c80f98abebb397397b50680bc395619baa2437b2ffacd8575b0
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
brief (0.0.1)
|
5
|
+
active_support
|
6
|
+
colored
|
7
|
+
commander
|
8
|
+
hashie
|
9
|
+
i18n
|
10
|
+
|
11
|
+
GEM
|
12
|
+
remote: https://rubygems.org/
|
13
|
+
specs:
|
14
|
+
active_support (3.0.0)
|
15
|
+
activesupport (= 3.0.0)
|
16
|
+
activesupport (3.0.0)
|
17
|
+
celluloid (0.15.2)
|
18
|
+
timers (~> 1.1.0)
|
19
|
+
coderay (1.1.0)
|
20
|
+
colored (1.2)
|
21
|
+
commander (4.2.0)
|
22
|
+
highline (~> 1.6.11)
|
23
|
+
diff-lcs (1.2.5)
|
24
|
+
ffi (1.9.3)
|
25
|
+
formatador (0.2.5)
|
26
|
+
guard (2.6.1)
|
27
|
+
formatador (>= 0.2.4)
|
28
|
+
listen (~> 2.7)
|
29
|
+
lumberjack (~> 1.0)
|
30
|
+
pry (>= 0.9.12)
|
31
|
+
thor (>= 0.18.1)
|
32
|
+
guard-rspec (4.2.10)
|
33
|
+
guard (~> 2.1)
|
34
|
+
rspec (>= 2.14, < 4.0)
|
35
|
+
hashie (2.1.2)
|
36
|
+
highline (1.6.21)
|
37
|
+
i18n (0.6.9)
|
38
|
+
listen (2.7.9)
|
39
|
+
celluloid (>= 0.15.2)
|
40
|
+
rb-fsevent (>= 0.9.3)
|
41
|
+
rb-inotify (>= 0.9)
|
42
|
+
lumberjack (1.0.7)
|
43
|
+
method_source (0.8.2)
|
44
|
+
pry (0.9.12.6)
|
45
|
+
coderay (~> 1.0)
|
46
|
+
method_source (~> 0.8)
|
47
|
+
slop (~> 3.4)
|
48
|
+
pry-nav (0.2.3)
|
49
|
+
pry (~> 0.9.10)
|
50
|
+
rake (10.3.2)
|
51
|
+
rb-fsevent (0.9.4)
|
52
|
+
rb-inotify (0.9.5)
|
53
|
+
ffi (>= 0.5.0)
|
54
|
+
rspec (3.0.0)
|
55
|
+
rspec-core (~> 3.0.0)
|
56
|
+
rspec-expectations (~> 3.0.0)
|
57
|
+
rspec-mocks (~> 3.0.0)
|
58
|
+
rspec-core (3.0.2)
|
59
|
+
rspec-support (~> 3.0.0)
|
60
|
+
rspec-expectations (3.0.2)
|
61
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
62
|
+
rspec-support (~> 3.0.0)
|
63
|
+
rspec-mocks (3.0.2)
|
64
|
+
rspec-support (~> 3.0.0)
|
65
|
+
rspec-support (3.0.2)
|
66
|
+
slop (3.5.0)
|
67
|
+
thor (0.19.1)
|
68
|
+
timers (1.1.0)
|
69
|
+
|
70
|
+
PLATFORMS
|
71
|
+
ruby
|
72
|
+
|
73
|
+
DEPENDENCIES
|
74
|
+
brief!
|
75
|
+
bundler (~> 1.3)
|
76
|
+
guard
|
77
|
+
guard-rspec
|
78
|
+
pry
|
79
|
+
pry-nav
|
80
|
+
rake
|
81
|
+
rspec
|
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Jonathan Soeder
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
# Brief
|
2
|
+
|
3
|
+
Brief is a tool to make writing markdown more productive. You can think
|
4
|
+
of it like a preprocessor for markdown.
|
5
|
+
|
6
|
+
Brief converts raw markdown into a nested structure which can be
|
7
|
+
used to automate tasks and generate more specific content elements.
|
8
|
+
|
9
|
+
Based on which headings you use and how you nest them, brief
|
10
|
+
will allow you to define mappings to objects which can be used to
|
11
|
+
automate other tasks.
|
12
|
+
|
13
|
+
I personally use the brief tool to allow me to take a single markdown
|
14
|
+
file and create a project wiki page, with links to related milestones
|
15
|
+
and github issues.
|
16
|
+
|
17
|
+
Example:
|
18
|
+
|
19
|
+
```markdown
|
20
|
+
# Wiki Page Heading
|
21
|
+
|
22
|
+
Content. Will go on a wiki page. The content below here,
|
23
|
+
and the subheadings, will be replaced with a roll-up / summary
|
24
|
+
of the elements.
|
25
|
+
|
26
|
+
## Milestone Heading
|
27
|
+
|
28
|
+
This content will go in the milestone body. The wiki page
|
29
|
+
that this belongs to, will include a different kind of view of this
|
30
|
+
content.
|
31
|
+
|
32
|
+
### An issue title
|
33
|
+
|
34
|
+
This goes in the issue's body. The wiki page this belongs to will
|
35
|
+
possibly have a link to the issue and a label for its status.
|
36
|
+
|
37
|
+
### Another issue title
|
38
|
+
|
39
|
+
This goes in this issue's body. Same thing. It obviously belongs to the
|
40
|
+
milestone.
|
41
|
+
|
42
|
+
```
|
43
|
+
|
44
|
+
Given the example above, I run:
|
45
|
+
|
46
|
+
```
|
47
|
+
brief publish project overview /path/to/markdown
|
48
|
+
```
|
49
|
+
|
50
|
+
This will create a Github Wiki entry in the repo that I specify, and
|
51
|
+
this wiki entry will include links to the milestones and issues.
|
52
|
+
|
53
|
+
You can see a sample of this Wiki page here:
|
54
|
+
(TODO INSERT LINK)
|
55
|
+
|
56
|
+
### Publishing Briefs
|
57
|
+
|
58
|
+
Publishing a brief allows you to run some publishing tasks using raw
|
59
|
+
markdown input.
|
60
|
+
|
61
|
+
(TODO) show some examples of a publisher
|
62
|
+
|
63
|
+
### Writing Briefs
|
64
|
+
|
65
|
+
Writing a brief is as easy as running the brief command, with the name
|
66
|
+
of the template you intend to use. It will open up $EDITOR for you with
|
67
|
+
some example input.
|
68
|
+
|
69
|
+
```bash
|
70
|
+
brief write project overview #=> Opens up $EDITOR with some example content in it
|
71
|
+
```
|
data/Rakefile
ADDED
data/bin/brief
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
lib = File.join(File.dirname(__FILE__), '../lib')
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
begin
|
7
|
+
require "rubygems"
|
8
|
+
require 'colored'
|
9
|
+
require "commander/import"
|
10
|
+
require "pry"
|
11
|
+
require "brief"
|
12
|
+
end
|
13
|
+
|
14
|
+
program :name, 'Brief'
|
15
|
+
program :version, Brief::Version
|
16
|
+
program :description, 'Brief CLI'
|
17
|
+
|
18
|
+
command :inspect do |c|
|
19
|
+
c.syntax = 'brief inspect file [options]'
|
20
|
+
c.description = 'Debug the parsing of a brief'
|
21
|
+
|
22
|
+
c.action do |args, options|
|
23
|
+
path = Pathname(args.first)
|
24
|
+
path = path.relative? ? Brief.root.join(path) : path
|
25
|
+
doc = Brief::Document.new(path)
|
26
|
+
|
27
|
+
doc.elements do |el|
|
28
|
+
puts el.inspect
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Pathname(lib).join("brief","cli","commands").children.each do |f|
|
34
|
+
require(File.expand_path(f)) if f.file?
|
35
|
+
end
|
data/brief-0.0.1.gem
ADDED
Binary file
|
data/brief.gemspec
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "brief"
|
7
|
+
spec.version = '0.0.2'
|
8
|
+
spec.authors = ["Jonathan Soeder"]
|
9
|
+
spec.email = ["jonathan.soeder@gmail.com"]
|
10
|
+
spec.description = %q{Brief is a utility to make writing more productive for software architects. It allows you write to places like Github Wiki, The Github Issues API all from the command line and a single file.}
|
11
|
+
spec.summary = %q{Brief is a utility to make writing more productive for software architects.}
|
12
|
+
spec.homepage = "http://architects.io/brief"
|
13
|
+
spec.license = "MIT"
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_dependency 'hashie'
|
21
|
+
spec.add_dependency 'commander'
|
22
|
+
spec.add_dependency 'colored'
|
23
|
+
spec.add_dependency 'active_support'
|
24
|
+
spec.add_dependency 'i18n'
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
27
|
+
spec.add_development_dependency "rake"
|
28
|
+
spec.add_development_dependency "rspec"
|
29
|
+
spec.add_development_dependency "pry"
|
30
|
+
spec.add_development_dependency "pry-nav"
|
31
|
+
spec.add_development_dependency "guard"
|
32
|
+
spec.add_development_dependency "guard-rspec"
|
33
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
```settings
|
2
|
+
status: proposed
|
3
|
+
edited_by: jonathan soeder
|
4
|
+
```
|
5
|
+
|
6
|
+
# This is a project overview
|
7
|
+
|
8
|
+
A body paragraph or two here will be the content for a cover page. You can supply whatever background
|
9
|
+
info, domain knowledge requirements, processes, file dependencies and links, whatever.
|
10
|
+
|
11
|
+
The content for the nested milestones and issues below will be transformed into raw markdown
|
12
|
+
which will generate a status summary of the milestones and issues as they get created in the Github API.
|
13
|
+
|
14
|
+
## This is a milestone heading
|
15
|
+
|
16
|
+
A milestone is some logical way of grouping issues and attaching a date to them. You will write the body
|
17
|
+
of the individual issues and optionally assign them or label them by writing them below. When this brief
|
18
|
+
gets published, the issues will be created and added to the milestone.
|
19
|
+
|
20
|
+
### This is an issue that belongs to the above milestone
|
21
|
+
|
22
|
+
The content of your issue goes here. Normal github flavored markdown is supported.
|
23
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
command :config do |c|
|
2
|
+
c.syntax = 'brief config [options]'
|
3
|
+
c.description = 'manipulate brief configuration settings'
|
4
|
+
|
5
|
+
c.action do |args, options|
|
6
|
+
Brief::Configuration.initialize!
|
7
|
+
|
8
|
+
# Setting a value manually
|
9
|
+
if args.first == 'set'
|
10
|
+
args.slice(1, args.length).map(&:strip).each do |pair|
|
11
|
+
key, value = pair.split('=')
|
12
|
+
Brief.configuration.set(key, value, false)
|
13
|
+
end
|
14
|
+
|
15
|
+
Brief.configuration.save!
|
16
|
+
end
|
17
|
+
|
18
|
+
if args.empty? && !(Brief.config.github_username || Brief.config.github_token)
|
19
|
+
args.push "github"
|
20
|
+
end
|
21
|
+
|
22
|
+
if args.first == "github"
|
23
|
+
username = ask("What is your github username: ", String)
|
24
|
+
|
25
|
+
say "If you haven't generated a personal access token yet, do so here: https://github.com/settings/tokens/new"
|
26
|
+
access_token = ask("Enter your private access token: ")
|
27
|
+
|
28
|
+
if username
|
29
|
+
Brief.config.set "github_username", username
|
30
|
+
end
|
31
|
+
|
32
|
+
if access_token
|
33
|
+
# TODO
|
34
|
+
# We could validate the token for them.
|
35
|
+
Brief.config.set "github_token", access_token
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
command :publish do |c|
|
2
|
+
c.syntax = 'brief publish PUBLISHER [options]'
|
3
|
+
c.description = 'publish a brief file with whatever publisher template you want to use.'
|
4
|
+
|
5
|
+
c.option '--from FILE', 'Specify a file to read from. Otherwise we use $EDITOR'
|
6
|
+
|
7
|
+
c.action do |args, options|
|
8
|
+
path = case
|
9
|
+
when options.from
|
10
|
+
Pathname(options.from)
|
11
|
+
when (Pathname(args.last).exist? rescue false)
|
12
|
+
Pathname(args.pop)
|
13
|
+
end
|
14
|
+
|
15
|
+
document = Brief::Document.new(path: path)
|
16
|
+
|
17
|
+
publisher = if path && path.exist? && args.empty?
|
18
|
+
guess = path.basename.to_s.gsub(/\.\w+$/,'')
|
19
|
+
|
20
|
+
Brief::Publisher.find(guess)
|
21
|
+
else
|
22
|
+
Brief::Publisher.find(args)
|
23
|
+
end
|
24
|
+
|
25
|
+
document.publish(publisher)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
command :write do |c|
|
2
|
+
c.syntax = 'brief write PUBLISHER [options]'
|
3
|
+
|
4
|
+
c.option '--file FILE', 'Specify a file to read from. Otherwise we use $EDITOR'
|
5
|
+
|
6
|
+
c.action do |args, options|
|
7
|
+
path = case
|
8
|
+
when options.file
|
9
|
+
Pathname(options.file)
|
10
|
+
when (Pathname(args.last).exist? rescue false)
|
11
|
+
Pathname(args.pop)
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
publisher = Brief::Publisher.find(args)
|
16
|
+
|
17
|
+
content = ask_editor(publisher.sample)
|
18
|
+
|
19
|
+
if content == publisher.sample
|
20
|
+
say "Ignoring editor input, same as sample"
|
21
|
+
end
|
22
|
+
|
23
|
+
binding.pry
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require "singleton"
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
module Brief
|
5
|
+
class Configuration
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
DefaultSettings = {
|
9
|
+
github_username: "",
|
10
|
+
github_api_token: ""
|
11
|
+
}
|
12
|
+
|
13
|
+
def self.method_missing meth, *args, &block
|
14
|
+
if instance.respond_to?(meth)
|
15
|
+
return instance.send meth, *args, &block
|
16
|
+
end
|
17
|
+
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize!
|
22
|
+
FileUtils.mkdir_p home_config_path.dirname
|
23
|
+
end
|
24
|
+
|
25
|
+
def method_missing meth, *args, &block
|
26
|
+
if current.has_key?(meth.to_s)
|
27
|
+
return current.fetch(meth)
|
28
|
+
end
|
29
|
+
|
30
|
+
super
|
31
|
+
end
|
32
|
+
|
33
|
+
def current_github_repository
|
34
|
+
value = current.github_repository
|
35
|
+
|
36
|
+
return value if value
|
37
|
+
|
38
|
+
if value.nil?
|
39
|
+
if guess = Brief::Git.current_github_repository
|
40
|
+
set "github_repository", guess
|
41
|
+
return guess
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
current.github_repository
|
46
|
+
end
|
47
|
+
|
48
|
+
def current
|
49
|
+
@current ||= begin
|
50
|
+
home_config.merge(cwd_config)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def current_config
|
55
|
+
cwd_config_path.exist? ? cwd_config : home_config
|
56
|
+
end
|
57
|
+
|
58
|
+
def set setting, value, persist=true
|
59
|
+
current_config[setting] = value
|
60
|
+
save! if persist == true
|
61
|
+
value
|
62
|
+
end
|
63
|
+
|
64
|
+
def unset setting, persist=true
|
65
|
+
current_config.delete(setting)
|
66
|
+
save! if persist == true
|
67
|
+
end
|
68
|
+
|
69
|
+
def current
|
70
|
+
Hashie::Mash.new(home_config.merge(cwd_config).merge(applied_config))
|
71
|
+
end
|
72
|
+
|
73
|
+
def apply_config_from_path path
|
74
|
+
path = Pathname(path)
|
75
|
+
parsed = JSON.parse(path.read) rescue {}
|
76
|
+
applied_config.merge!(parsed)
|
77
|
+
nil
|
78
|
+
end
|
79
|
+
|
80
|
+
def save!
|
81
|
+
save_home_config
|
82
|
+
save_cwd_config
|
83
|
+
end
|
84
|
+
|
85
|
+
def save_cwd_config
|
86
|
+
return nil unless cwd_config_path.exist?
|
87
|
+
|
88
|
+
File.open(cwd_config_path,'w+') do |fh|
|
89
|
+
fh.write JSON.generate(cwd_config.to_hash)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def save_home_config
|
94
|
+
File.open(home_config_path,'w+') do |fh|
|
95
|
+
fh.write JSON.generate(home_config.to_hash)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Applied config is configuration values passed in context
|
100
|
+
# usually from the cli, but also in the unit tests
|
101
|
+
def applied_config
|
102
|
+
@applied_config ||= {}
|
103
|
+
end
|
104
|
+
|
105
|
+
def cwd_config
|
106
|
+
@cwd_config ||= begin
|
107
|
+
(cwd_config_path.exist? rescue false) ? JSON.parse(cwd_config_path.read) : {}
|
108
|
+
rescue
|
109
|
+
{}
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def home_config
|
114
|
+
@home_config ||= begin
|
115
|
+
(home_config_path.exist? rescue false) ? JSON.parse(home_config_path.read) : {}
|
116
|
+
rescue
|
117
|
+
{}
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def home_folder
|
122
|
+
Pathname(ENV['HOME']).join('.brief')
|
123
|
+
end
|
124
|
+
|
125
|
+
def home_config_path
|
126
|
+
Pathname(ENV['HOME']).join('.brief','config.json')
|
127
|
+
end
|
128
|
+
|
129
|
+
def cwd_config_path
|
130
|
+
Pathname(Dir.pwd).join('.briefrc')
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
|
2
|
+
module Brief
|
3
|
+
class Document
|
4
|
+
attr_reader :content, :options
|
5
|
+
|
6
|
+
def initialize(options)
|
7
|
+
@options = options
|
8
|
+
|
9
|
+
case
|
10
|
+
when options.is_a?(String)
|
11
|
+
@content = options
|
12
|
+
when options.is_a?(Pathname)
|
13
|
+
@content = options.read
|
14
|
+
when options.is_a?(Hash)
|
15
|
+
@content = options[:path].read
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def write using
|
20
|
+
using.run_before_hooks(:write) do
|
21
|
+
write
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def publish using=nil
|
26
|
+
using ||= publisher
|
27
|
+
|
28
|
+
document = self
|
29
|
+
using.run_before_hooks(:publish) do
|
30
|
+
process(document)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def publisher
|
35
|
+
@publisher ||= Brief::Publisher.find(options[:publisher] || "default")
|
36
|
+
end
|
37
|
+
|
38
|
+
def method_missing meth, *args, &block
|
39
|
+
if parser.respond_to?(meth)
|
40
|
+
return parser.send(meth, *args, &block)
|
41
|
+
end
|
42
|
+
|
43
|
+
super
|
44
|
+
end
|
45
|
+
|
46
|
+
def checksum
|
47
|
+
@checksum ||= Digest::MD5.hexdigest(content)
|
48
|
+
end
|
49
|
+
|
50
|
+
def parser
|
51
|
+
@parser ||= Brief::Parser.new(content, checksum: checksum)
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
def settings
|
56
|
+
parser.front_matter
|
57
|
+
end
|
58
|
+
|
59
|
+
def elements
|
60
|
+
parser.send(:elements)
|
61
|
+
end
|
62
|
+
|
63
|
+
def tree
|
64
|
+
parser.send(:tree)
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
data/lib/brief/dsl.rb
ADDED
File without changes
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# The GithubMilestoneRollup formatter takes the raw input markdown
|
2
|
+
# which specifies a relationship between the milestone and its child
|
3
|
+
# issues with all of the necessary detail, and replaces it with a
|
4
|
+
# bulleted list of links to the issues on github, with their titles,
|
5
|
+
# assignee relationship, and current status
|
6
|
+
#
|
7
|
+
# So for example, given the raw input:
|
8
|
+
#
|
9
|
+
# --- BEGIN RAW INPUT
|
10
|
+
#
|
11
|
+
# ## Milestone Heading
|
12
|
+
#
|
13
|
+
# Content for the milestone description.
|
14
|
+
#
|
15
|
+
# ### Nested Issue One
|
16
|
+
#
|
17
|
+
# Detail for nested issue one.
|
18
|
+
# Blah blah blah
|
19
|
+
#
|
20
|
+
# ### Nested Issue Two
|
21
|
+
#
|
22
|
+
# Detail for nested issue two
|
23
|
+
#
|
24
|
+
# --- END RAW INPUT ---
|
25
|
+
#
|
26
|
+
# We should get:
|
27
|
+
#
|
28
|
+
# --- BEGIN FORMATTED OUTPUT ---
|
29
|
+
#
|
30
|
+
# ## (Milestone Heading)[https://github.com/datapimp/brief/milestones/1]
|
31
|
+
#
|
32
|
+
# Content for milestone description
|
33
|
+
#
|
34
|
+
# ### (Nested Issue One)[https://github.com/datapimp/brief/issues/1]
|
35
|
+
# Assigned To|Last Updated|Status
|
36
|
+
# ---|---|---
|
37
|
+
# datapimp|July 4, 2014|open
|
38
|
+
#
|
39
|
+
# ### (Nested Issue Two)[https://github.com/datapimp/brief/issues/2]
|
40
|
+
# Assigned To|Last Updated|Status
|
41
|
+
# ---|---|---
|
42
|
+
# datapimp|July 4, 2014|open
|
43
|
+
#
|
44
|
+
# --- END FORMATTED OUTPUT ---
|
45
|
+
#
|
46
|
+
module Brief
|
47
|
+
module Formatters
|
48
|
+
class GithubMilestoneRollup < Base
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|