bunto-compose 1.0.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2a4719b3f94e4602b6613f7defe5376caa3e85b0
4
+ data.tar.gz: a1c4dfe36598a5a526300a52ea1f8459dabcfdd8
5
+ SHA512:
6
+ metadata.gz: 06800c16c6c6eed4693bed4117ab02ea01b2b114991085b3cf6b8ece88598c263330818dadcd3adf4a676e1188da09fdee1aa6cb8881d55e363ecb759aa6c004
7
+ data.tar.gz: 27e2ec49303058a96f27c7f44e59fdd003aeae4cf42c8efc9e74a810f2a969a8b256ccc1325d6a1ab20d5cd1839095ccd24c5792c37555f9258feef7aefb9242
@@ -0,0 +1,18 @@
1
+ require "bunto-compose/version"
2
+ require "bunto-compose/arg_parser"
3
+ require "bunto-compose/movement_arg_parser"
4
+ require "bunto-compose/file_creator"
5
+ require "bunto-compose/file_mover"
6
+ require "bunto-compose/file_info"
7
+
8
+ module Bunto
9
+ module Compose
10
+ DEFAULT_TYPE = "md"
11
+ DEFAULT_LAYOUT = "post"
12
+ DEFAULT_LAYOUT_PAGE = "page"
13
+ end
14
+ end
15
+
16
+ %w{draft post publish unpublish page}.each do |file|
17
+ require File.expand_path("bunto/commands/#{file}.rb", File.dirname(__FILE__))
18
+ end
@@ -0,0 +1,27 @@
1
+ class Bunto::Compose::ArgParser
2
+ attr_reader :args, :options
3
+ def initialize(args, options)
4
+ @args = args
5
+ @options = options
6
+ end
7
+
8
+ def validate!
9
+ raise ArgumentError.new('You must specify a name.') if args.empty?
10
+ end
11
+
12
+ def type
13
+ type = options["extension"] || Bunto::Compose::DEFAULT_TYPE
14
+ end
15
+
16
+ def layout
17
+ layout = options["layout"] || Bunto::Compose::DEFAULT_LAYOUT
18
+ end
19
+
20
+ def title
21
+ args.join ' '
22
+ end
23
+
24
+ def force?
25
+ !!options["force"]
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ module Bunto
2
+ module Compose
3
+ class FileCreator
4
+ attr_reader :file, :force
5
+ def initialize(fileInfo, force = false)
6
+ @file = fileInfo
7
+ @force = force
8
+ end
9
+
10
+ def create!
11
+ validate_should_write!
12
+ ensure_directory_exists
13
+ write_file
14
+ end
15
+
16
+ private
17
+
18
+ def validate_should_write!
19
+ raise ArgumentError.new("A #{file.resource_type} already exists at #{file.path}") if File.exist?(file.path) and !force
20
+ end
21
+
22
+ def ensure_directory_exists
23
+ dir = File.dirname file.path
24
+ Dir.mkdir(dir) unless Dir.exist?(dir)
25
+ end
26
+
27
+ def write_file
28
+ File.open(file.path, "w") do |f|
29
+ f.puts(file.content)
30
+ end
31
+
32
+ puts "New #{file.resource_type} created at #{file.path}."
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,20 @@
1
+ class Bunto::Compose::FileInfo
2
+ attr_reader :params
3
+ def initialize(params)
4
+ @params = params
5
+ end
6
+
7
+ def file_name
8
+ name = Bunto::Utils.slugify params.title
9
+ "#{name}.#{params.type}"
10
+ end
11
+
12
+ def content
13
+ front_matter = YAML.dump({
14
+ 'layout' => params.layout,
15
+ 'title' => params.title,
16
+ })
17
+
18
+ front_matter + "---\n"
19
+ end
20
+ end
@@ -0,0 +1,34 @@
1
+ module Bunto
2
+ module Compose
3
+ class FileMover
4
+ attr_reader :movement
5
+ def initialize(movement)
6
+ @movement = movement
7
+ end
8
+
9
+ def resource_type
10
+ 'file'
11
+ end
12
+
13
+ def move
14
+ validate_source
15
+ ensure_directory_exists
16
+ move_file
17
+ end
18
+
19
+ def validate_source
20
+ raise ArgumentError.new("There was no #{resource_type} found at '#{movement.from}'.") unless File.exist? movement.from
21
+ end
22
+
23
+ def ensure_directory_exists
24
+ dir = File.dirname movement.to
25
+ Dir.mkdir(dir) unless Dir.exist?(dir)
26
+ end
27
+
28
+ def move_file
29
+ FileUtils.mv(movement.from, movement.to)
30
+ puts "#{resource_type.capitalize} #{movement.from} was moved to #{movement.to}"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,19 @@
1
+ module Bunto
2
+ module Compose
3
+ class MovementArgParser
4
+ attr_reader :args, :options
5
+ def initialize(args, options)
6
+ @args = args
7
+ @options = options
8
+ end
9
+
10
+ def validate!
11
+ raise ArgumentError.new("You must specify a #{resource_type} path.") if args.empty?
12
+ end
13
+
14
+ def path
15
+ args.join ' '
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,5 @@
1
+ module Bunto
2
+ module Compose
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,44 @@
1
+ module Bunto
2
+ module Commands
3
+ class Draft < Command
4
+ def self.init_with_program(prog)
5
+ prog.command(:draft) do |c|
6
+ c.syntax 'draft NAME'
7
+ c.description 'Creates a new draft post with the given NAME'
8
+
9
+ options.each {|opt| c.option *opt }
10
+
11
+ c.action { |args, options| process args, options }
12
+ end
13
+ end
14
+
15
+ def self.options
16
+ [
17
+ ['extension', '-x EXTENSION', '--extension EXTENSION', 'Specify the file extension'],
18
+ ['layout', '-l LAYOUT', '--layout LAYOUT', "Specify the draft layout"],
19
+ ['force', '-f', '--force', 'Overwrite a draft if it already exists']
20
+ ]
21
+ end
22
+
23
+
24
+ def self.process(args = [], options = {})
25
+ params = Compose::ArgParser.new args, options
26
+ params.validate!
27
+
28
+ draft = DraftFileInfo.new params
29
+
30
+ Compose::FileCreator.new(draft, params.force?).create!
31
+ end
32
+
33
+ class DraftFileInfo < Compose::FileInfo
34
+ def resource_type
35
+ 'draft'
36
+ end
37
+
38
+ def path
39
+ "_drafts/#{file_name}"
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,48 @@
1
+ module Bunto
2
+ module Commands
3
+ class Page < Command
4
+ def self.init_with_program(prog)
5
+ prog.command(:page) do |c|
6
+ c.syntax 'page NAME'
7
+ c.description 'Creates a new page with the given NAME'
8
+
9
+ options.each {|opt| c.option *opt }
10
+
11
+ c.action { |args, options| process args, options }
12
+ end
13
+ end
14
+
15
+ def self.options
16
+ [
17
+ ['extension', '-x EXTENSION', '--extension EXTENSION', 'Specify the file extension'],
18
+ ['layout', '-l LAYOUT', '--layout LAYOUT', "Specify the page layout"],
19
+ ['force', '-f', '--force', 'Overwrite a page if it already exists']
20
+ ]
21
+ end
22
+
23
+ def self.process(args = [], options = {})
24
+ params = PageArgParser.new args, options
25
+ params.validate!
26
+
27
+ page = PageFileInfo.new params
28
+
29
+ Compose::FileCreator.new(page, params.force?).create!
30
+ end
31
+
32
+ class PageArgParser < Compose::ArgParser
33
+ def layout
34
+ layout = options["layout"] || Bunto::Compose::DEFAULT_LAYOUT_PAGE
35
+ end
36
+ end
37
+
38
+ class PageFileInfo < Compose::FileInfo
39
+ def resource_type
40
+ 'page'
41
+ end
42
+
43
+ alias_method :path, :file_name
44
+
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,59 @@
1
+ module Bunto
2
+ module Commands
3
+ class Post < Command
4
+ def self.init_with_program(prog)
5
+ prog.command(:post) do |c|
6
+ c.syntax 'post NAME'
7
+ c.description 'Creates a new post with the given NAME'
8
+
9
+ options.each {|opt| c.option *opt }
10
+
11
+ c.action { |args, options| process args, options }
12
+ end
13
+ end
14
+
15
+ def self.options
16
+ [
17
+ ['extension', '-x EXTENSION', '--extension EXTENSION', 'Specify the file extension'],
18
+ ['layout', '-l LAYOUT', '--layout LAYOUT', "Specify the post layout"],
19
+ ['force', '-f', '--force', 'Overwrite a post if it already exists'],
20
+ ['date', '-d DATE', '--date DATE', 'Specify the post date']
21
+ ]
22
+ end
23
+
24
+ def self.process(args = [], options = {})
25
+ params = PostArgParser.new args, options
26
+ params.validate!
27
+
28
+ post = PostFileInfo.new params
29
+
30
+ Compose::FileCreator.new(post, params.force?).create!
31
+ end
32
+
33
+
34
+ class PostArgParser < Compose::ArgParser
35
+ def date
36
+ options["date"].nil? ? Time.now : DateTime.parse(options["date"])
37
+ end
38
+ end
39
+
40
+ class PostFileInfo < Compose::FileInfo
41
+ def resource_type
42
+ 'post'
43
+ end
44
+
45
+ def path
46
+ "_posts/#{file_name}"
47
+ end
48
+
49
+ def file_name
50
+ "#{_date_stamp}-#{super}"
51
+ end
52
+
53
+ def _date_stamp
54
+ @params.date.strftime '%Y-%m-%d'
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,65 @@
1
+ module Bunto
2
+ module Commands
3
+ class Publish < Command
4
+ def self.init_with_program(prog)
5
+ prog.command(:publish) do |c|
6
+ c.syntax 'publish DRAFT_PATH'
7
+ c.description 'Moves a draft into the _posts directory and sets the date'
8
+
9
+ c.option 'date', '-d DATE', '--date DATE', 'Specify the post date'
10
+
11
+ c.action do |args, options|
12
+ Bunto::Commands::Publish.process(args, options)
13
+ end
14
+ end
15
+ end
16
+
17
+ def self.process(args = [], options = {})
18
+ params = PublishArgParser.new args, options
19
+ params.validate!
20
+
21
+ movement = DraftMovementInfo.new params
22
+
23
+ mover = DraftMover.new movement
24
+ mover.move
25
+ end
26
+
27
+ end
28
+
29
+ class PublishArgParser < Compose::MovementArgParser
30
+ def resource_type
31
+ "draft"
32
+ end
33
+
34
+ def date
35
+ options["date"].nil? ? Date.today : Date.parse(options["date"])
36
+ end
37
+
38
+ def name
39
+ File.basename path
40
+ end
41
+ end
42
+
43
+ class DraftMovementInfo
44
+ attr_reader :params
45
+ def initialize(params)
46
+ @params = params
47
+ end
48
+
49
+ def from
50
+ params.path
51
+ end
52
+
53
+ def to
54
+ date_stamp = params.date.strftime '%Y-%m-%d'
55
+ "_posts/#{date_stamp}-#{params.name}"
56
+ end
57
+ end
58
+
59
+ class DraftMover < Compose::FileMover
60
+ def resource_type
61
+ 'draft'
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,58 @@
1
+ module Bunto
2
+ module Commands
3
+ class Unpublish < Command
4
+ def self.init_with_program(prog)
5
+ prog.command(:unpublish) do |c|
6
+ c.syntax 'unpublish POST_PATH'
7
+ c.description 'Moves a post back into the _drafts directory'
8
+
9
+ c.action do |args, options|
10
+ process(args, options)
11
+ end
12
+ end
13
+ end
14
+
15
+ def self.process(args = [], options = {})
16
+ params = UnpublishArgParser.new args, options
17
+ params.validate!
18
+
19
+ movement = PostMovementInfo.new params
20
+
21
+ mover = PostMover.new movement
22
+ mover.move
23
+ end
24
+
25
+ end
26
+
27
+ class UnpublishArgParser < Compose::MovementArgParser
28
+ def resource_type
29
+ 'post'
30
+ end
31
+
32
+ def name
33
+ File.basename(path).sub /\d{4}-\d{2}-\d{2}-/, ''
34
+ end
35
+ end
36
+
37
+ class PostMovementInfo
38
+ attr_reader :params
39
+ def initialize(params)
40
+ @params = params
41
+ end
42
+
43
+ def from
44
+ params.path
45
+ end
46
+
47
+ def to
48
+ "_drafts/#{params.name}"
49
+ end
50
+ end
51
+
52
+ class PostMover < Compose::FileMover
53
+ def resource_type
54
+ 'post'
55
+ end
56
+ end
57
+ end
58
+ end
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bunto-compose
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Parker Moore
8
+ - Suriyaa Kudo
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-03-31 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.0
20
+ name: bunto
21
+ prerelease: false
22
+ type: :runtime
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 1.0.0
28
+ - !ruby/object:Gem::Dependency
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
34
+ name: bundler
35
+ prerelease: false
36
+ type: :development
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.5'
42
+ - !ruby/object:Gem::Dependency
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ name: rake
49
+ prerelease: false
50
+ type: :development
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '10.0'
56
+ - !ruby/object:Gem::Dependency
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ name: rspec
63
+ prerelease: false
64
+ type: :development
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.0'
70
+ description: Streamline your writing in Bunto with these commands.
71
+ email:
72
+ - parkrmoore@gmail.com
73
+ - SuriyaaKudoIsc@users.noreply.github.com
74
+ executables: []
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - lib/bunto-compose.rb
79
+ - lib/bunto-compose/arg_parser.rb
80
+ - lib/bunto-compose/file_creator.rb
81
+ - lib/bunto-compose/file_info.rb
82
+ - lib/bunto-compose/file_mover.rb
83
+ - lib/bunto-compose/movement_arg_parser.rb
84
+ - lib/bunto-compose/version.rb
85
+ - lib/bunto/commands/draft.rb
86
+ - lib/bunto/commands/page.rb
87
+ - lib/bunto/commands/post.rb
88
+ - lib/bunto/commands/publish.rb
89
+ - lib/bunto/commands/unpublish.rb
90
+ homepage: https://github.com/bunto/bunto-compose
91
+ licenses:
92
+ - MIT
93
+ metadata: {}
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 2.4.8
111
+ signing_key:
112
+ specification_version: 4
113
+ summary: Streamline your writing in Bunto with these commands.
114
+ test_files: []