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 @@
1 1
 #!/usr/bin/env ruby
2 2
 
3 3
 ################################################################################
4
-require('ostruct')
5
-require('optparse')
6 4
 require('edify')
7 5
 
8 6
 ################################################################################
@@ -39,9 +37,46 @@ class CommandRunner
39 37
   def run
40 38
     if @options.version
41 39
       $stdout.puts("Edify #{Edify::VERSION}")
42
-      exit
40
+    elsif @options.list
41
+      list_commands
42
+    else
43
+      execute_command
43 44
     end
44 45
   end
46
+  
47
+  ##############################################################################
48
+  private
49
+  
50
+  ##############################################################################
51
+  def list_commands
52
+    Dir.foreach(COMMANDS_DIR) do |file|
53
+      next if !file.match(/\.rb$/)
54
+      require(File.join(COMMANDS_DIR, file))
55
+    end
56
+    
57
+    commands = Edify::Command.commands.inject({}) do |h, cmd|
58
+      h[cmd.name] = cmd; h
59
+    end
60
+    
61
+    max = commands.keys.max {|a,b| a.size <=> b.size}.size
62
+
63
+    commands.keys.sort.each do |name|
64
+      $stdout.puts(name.rjust(max+2, ' ') + ': ' + commands[name].description)
65
+    end
66
+  end
67
+  
68
+  ##############################################################################
69
+  def execute_command
70
+    command = ARGV.shift
71
+    name    = ABBREVIATIONS.has_key?(command) ? ABBREVIATIONS[command] : command
72
+    file    = File.join(COMMANDS_DIR, name + '.rb')
73
+    
74
+    raise("no such command: #{command}") if !File.exist?(file)
75
+    require(file)
76
+    
77
+    klass = Edify::Command.commands.first || raise("WTF!")
78
+    klass.new(ARGV).run
79
+  end
45 80
 end
46 81
 
47 82
 ################################################################################

+ 57
- 0
commands/generate.rb View File

@@ -0,0 +1,57 @@
1
+class Generate < Edify::Command
2
+  
3
+  ##############################################################################
4
+  TEMPLATES = File.expand_path('../templates', File.dirname(__FILE__))
5
+  
6
+  ##############################################################################
7
+  PLACEMENT = {
8
+    'article' => 'articles/%Y/%m',
9
+  }
10
+  
11
+  ##############################################################################
12
+  description('Generate files from templates')
13
+  
14
+  ##############################################################################
15
+  def run
16
+    parse_command_line do |p|
17
+      p.banner = 'Usage: edify generate [type] [slug or name]'
18
+      p.separator('')
19
+      p.separator('Example: edify generate article git-workflow')
20
+    end
21
+    
22
+    assert_argv
23
+    generate
24
+  end
25
+  
26
+  ##############################################################################
27
+  private
28
+  
29
+  ##############################################################################
30
+  def assert_argv
31
+    raise("missing type or slug, see --help") if @argv.size != 2
32
+    raise("#{@argv.first} isn't a supported type") if !File.exist?(File.join(TEMPLATES, @argv.first))
33
+    raise("WTF, I don't know where to put #{@argv.first}") if !PLACEMENT.has_key?(@argv.first)
34
+  end
35
+  
36
+  ##############################################################################
37
+  def generate
38
+    what = OpenStruct.new(:kind => @argv.first, :slug => @argv.last)
39
+    place_template = ERB.new(Time.now.strftime(PLACEMENT[what.kind]))
40
+
41
+    what.where = File.expand_path(place_template.result(what.send(:binding)))
42
+    FileUtils.mkdir_p(what.where)
43
+    
44
+    Dir.foreach(File.join(TEMPLATES, what.kind)) do |file|
45
+      next if file.match(/^\./)
46
+      
47
+      dest = file.sub('slug', what.slug)
48
+      dest = File.join(what.where, dest.sub('.erb', ''))
49
+      
50
+      template = File.read(File.join(TEMPLATES, what.kind, file))
51
+      content = ERB.new(template).result(what.send(:binding))
52
+
53
+      File.open(dest, 'w') {|f| f.write(content)}
54
+      $stdout.puts('==> ' + dest.sub(File.expand_path('.') + '/', ''))
55
+    end
56
+  end
57
+end

+ 20
- 0
commands/tags.rb View File

@@ -0,0 +1,20 @@
1
+class Tags < Edify::Command
2
+  
3
+  ##############################################################################
4
+  description('List all tags from a live site')
5
+  
6
+  ##############################################################################
7
+  def run
8
+    parse_command_line
9
+    list_tags
10
+  end
11
+  
12
+  ##############################################################################
13
+  private
14
+  
15
+  ##############################################################################
16
+  def list_tags
17
+    tags = fetch_tags_from_host
18
+    puts tags.inspect
19
+  end
20
+end

edify.gemspec → config/edify.gemspec View File


+ 13
- 0
lib/edify.rb View File

@@ -1,2 +1,15 @@
1
+################################################################################
2
+module Edify; end
3
+
4
+################################################################################
5
+require('ostruct')
6
+require('optparse')
7
+require('erb')
8
+require('yaml')
9
+require('fileutils')
10
+require('restclient')
11
+require('json')
12
+
1 13
 ################################################################################
2 14
 require('edify/version')
15
+require('edify/command')

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

@@ -0,0 +1,64 @@
1
+class Edify::Command
2
+  
3
+  ##############################################################################
4
+  GLOBAL_OPTIONS = {
5
+    :host => 'www.devalot.com',
6
+  }
7
+  
8
+  ##############################################################################
9
+  attr_reader(:argv, :options)
10
+  
11
+  ##############################################################################
12
+  def self.inherited (klass)
13
+    commands << klass
14
+  end
15
+  
16
+  ##############################################################################
17
+  def self.commands
18
+    class << self; self; end.instance_eval {@commands ||= []}
19
+  end
20
+  
21
+  ##############################################################################
22
+  def self.description (string=nil)
23
+    class << self; self; end.instance_eval do
24
+      @description ||= ''
25
+      @description = string if string
26
+      @description
27
+    end
28
+  end
29
+  
30
+  ##############################################################################
31
+  def self.name
32
+    to_s.downcase
33
+  end
34
+  
35
+  ##############################################################################
36
+  def initialize (argv)
37
+    @argv    = argv
38
+    @options = GLOBAL_OPTIONS.dup
39
+  end
40
+  
41
+  ##############################################################################
42
+  private
43
+  
44
+  ##############################################################################
45
+  def parse_command_line (&block)
46
+    @options = OpenStruct.new(@options)
47
+
48
+    OptionParser.new do |p|
49
+      p.banner = "Usage: edify #{self.class.name} [options]"
50
+      p.on('-h', '--help', 'This message') {$stdout.puts(p); exit}
51
+      p.on('--host=NAME', 'The name of the host running didactic') {|h| @options.host = h}
52
+      block.call(p) if block
53
+    end.parse!(@argv)
54
+  end
55
+  
56
+  ##############################################################################
57
+  def fetch_tags_from_host
58
+    response = RestClient.get("http://#{options.host}/tags.json")
59
+    tags     = JSON.parse(response.body)
60
+
61
+    raise("Whoa, I expected a tags array") unless tags.is_a?(Array)
62
+    tags
63
+  end
64
+end

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

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

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

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

Loading…
Cancel
Save