bunto-compose 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []