Browse Source

Add the tags and generate commands

master
Peter J. Jones 7 years ago
parent
commit
cec89f759c
8 changed files with 195 additions and 3 deletions
  1. 38
    3
      bin/edify
  2. 57
    0
      commands/generate.rb
  3. 20
    0
      commands/tags.rb
  4. 0
    0
      config/edify.gemspec
  5. 13
    0
      lib/edify.rb
  6. 64
    0
      lib/edify/command.rb
  7. 1
    0
      templates/article/slug.md.erb
  8. 2
    0
      templates/article/slug.yml.erb

+ 38
- 3
bin/edify View File

@@ -1,8 +1,6 @@
#!/usr/bin/env ruby

################################################################################
require('ostruct')
require('optparse')
require('edify')

################################################################################
@@ -39,9 +37,46 @@ class CommandRunner
def run
if @options.version
$stdout.puts("Edify #{Edify::VERSION}")
exit
elsif @options.list
list_commands
else
execute_command
end
end
##############################################################################
private
##############################################################################
def list_commands
Dir.foreach(COMMANDS_DIR) do |file|
next if !file.match(/\.rb$/)
require(File.join(COMMANDS_DIR, file))
end
commands = Edify::Command.commands.inject({}) do |h, cmd|
h[cmd.name] = cmd; h
end
max = commands.keys.max {|a,b| a.size <=> b.size}.size

commands.keys.sort.each do |name|
$stdout.puts(name.rjust(max+2, ' ') + ': ' + commands[name].description)
end
end
##############################################################################
def execute_command
command = ARGV.shift
name = ABBREVIATIONS.has_key?(command) ? ABBREVIATIONS[command] : command
file = File.join(COMMANDS_DIR, name + '.rb')
raise("no such command: #{command}") if !File.exist?(file)
require(file)
klass = Edify::Command.commands.first || raise("WTF!")
klass.new(ARGV).run
end
end

################################################################################

+ 57
- 0
commands/generate.rb View File

@@ -0,0 +1,57 @@
class Generate < Edify::Command
##############################################################################
TEMPLATES = File.expand_path('../templates', File.dirname(__FILE__))
##############################################################################
PLACEMENT = {
'article' => 'articles/%Y/%m',
}
##############################################################################
description('Generate files from templates')
##############################################################################
def run
parse_command_line do |p|
p.banner = 'Usage: edify generate [type] [slug or name]'
p.separator('')
p.separator('Example: edify generate article git-workflow')
end
assert_argv
generate
end
##############################################################################
private
##############################################################################
def assert_argv
raise("missing type or slug, see --help") if @argv.size != 2
raise("#{@argv.first} isn't a supported type") if !File.exist?(File.join(TEMPLATES, @argv.first))
raise("WTF, I don't know where to put #{@argv.first}") if !PLACEMENT.has_key?(@argv.first)
end
##############################################################################
def generate
what = OpenStruct.new(:kind => @argv.first, :slug => @argv.last)
place_template = ERB.new(Time.now.strftime(PLACEMENT[what.kind]))

what.where = File.expand_path(place_template.result(what.send(:binding)))
FileUtils.mkdir_p(what.where)
Dir.foreach(File.join(TEMPLATES, what.kind)) do |file|
next if file.match(/^\./)
dest = file.sub('slug', what.slug)
dest = File.join(what.where, dest.sub('.erb', ''))
template = File.read(File.join(TEMPLATES, what.kind, file))
content = ERB.new(template).result(what.send(:binding))

File.open(dest, 'w') {|f| f.write(content)}
$stdout.puts('==> ' + dest.sub(File.expand_path('.') + '/', ''))
end
end
end

+ 20
- 0
commands/tags.rb View File

@@ -0,0 +1,20 @@
class Tags < Edify::Command
##############################################################################
description('List all tags from a live site')
##############################################################################
def run
parse_command_line
list_tags
end
##############################################################################
private
##############################################################################
def list_tags
tags = fetch_tags_from_host
puts tags.inspect
end
end

edify.gemspec → config/edify.gemspec View File


+ 13
- 0
lib/edify.rb View File

@@ -1,2 +1,15 @@
################################################################################
module Edify; end

################################################################################
require('ostruct')
require('optparse')
require('erb')
require('yaml')
require('fileutils')
require('restclient')
require('json')

################################################################################
require('edify/version')
require('edify/command')

+ 64
- 0
lib/edify/command.rb View File

@@ -0,0 +1,64 @@
class Edify::Command
##############################################################################
GLOBAL_OPTIONS = {
:host => 'www.devalot.com',
}
##############################################################################
attr_reader(:argv, :options)
##############################################################################
def self.inherited (klass)
commands << klass
end
##############################################################################
def self.commands
class << self; self; end.instance_eval {@commands ||= []}
end
##############################################################################
def self.description (string=nil)
class << self; self; end.instance_eval do
@description ||= ''
@description = string if string
@description
end
end
##############################################################################
def self.name
to_s.downcase
end
##############################################################################
def initialize (argv)
@argv = argv
@options = GLOBAL_OPTIONS.dup
end
##############################################################################
private
##############################################################################
def parse_command_line (&block)
@options = OpenStruct.new(@options)

OptionParser.new do |p|
p.banner = "Usage: edify #{self.class.name} [options]"
p.on('-h', '--help', 'This message') {$stdout.puts(p); exit}
p.on('--host=NAME', 'The name of the host running didactic') {|h| @options.host = h}
block.call(p) if block
end.parse!(@argv)
end
##############################################################################
def fetch_tags_from_host
response = RestClient.get("http://#{options.host}/tags.json")
tags = JSON.parse(response.body)

raise("Whoa, I expected a tags array") unless tags.is_a?(Array)
tags
end
end

+ 1
- 0
templates/article/slug.md.erb View File

@@ -0,0 +1 @@
# Your Article Title Here

+ 2
- 0
templates/article/slug.yml.erb View File

@@ -0,0 +1,2 @@
tags_comma_string: Tag One, Tag Two
published_at: <%= Time.now.to_yaml.sub(/^--- /, '').chomp %>

Loading…
Cancel
Save