class Octopress::Ink::Commands::New

Public Class Methods

add_assets() click to toggle source
# File lib/octopress-ink/commands/new.rb, line 154
def self.add_assets
  dirs = %w{docs images fonts pages templates files layouts includes stylesheets javascripts}.map do |asset|
    File.join(@settings[:path], 'assets', asset)
  end
  create_empty_dirs dirs

  # Add Jekyll configuration file
  #
  FileUtils.touch File.join(@settings[:path], 'assets', 'config.yml')
end
add_dependency() click to toggle source

Add Octopress Ink dependency to Gemspec

# File lib/octopress-ink/commands/new.rb, line 122
def self.add_dependency
  pos = @settings[:gemspec].rindex("end")
  @settings[:gemspec] = insert_before(@settings[:gemspec], pos, indent(dependencies))

  File.open(@settings[:gemspec_path], 'w+') {|f| f.write(@settings[:gemspec]) }
end
add_plugin() click to toggle source

Add Octopress Ink plugin to core module file

# File lib/octopress-ink/commands/new.rb, line 144
def self.add_plugin
  # Grab the module directory from the version.rb require.
  # If a gem is created with dashes e.g. "some-gem", Bundler puts the module file at lib/some/gem.rb
  file = File.join(@settings[:path], @settings[:module_path])
  mod = File.open(file).read
  mod = add_simple_plugin mod

  File.open(file, 'w+') {|f| f.write(mod) }
end
add_simple_plugin(mod) click to toggle source

New plugin uses a simple configuration hash

# File lib/octopress-ink/commands/new.rb, line 167
def self.add_simple_plugin(mod)
  mod  = "#{@settings[:require_version]}\n"
  mod += "require 'octopress-ink'\n"
  if @settings[:type] == 'theme'
    mod += "\nOctopress::Ink.add_theme({\n#{indent(plugin_config)}\n})\n"
  else
    mod += "\nOctopress::Ink.add_plugin({\n#{indent(plugin_config)}\n})\n"
  end
end
add_to_gitignore() click to toggle source
# File lib/octopress-ink/commands/new.rb, line 94
        def self.add_to_gitignore
          path = File.join @settings[:path], '.gitignore'
          content = File.open(path).read << <<-HERE
.*-cache
_site
          HERE

          File.open(path, 'w+') do |f|
            f.write(content)
          end
        end
create_empty_dirs(dirs) click to toggle source
# File lib/octopress-ink/commands/new.rb, line 206
def self.create_empty_dirs(dirs)
  dirs.each do |d|
    dir = File.join(d)
    action = Dir.exist?(dir) ? "exists".rjust(12).blue.bold : "create".rjust(12).green.bold
    FileUtils.mkdir_p dir
    puts "#{action}  #{dir.sub("#{Dir.pwd}/", '')}/"
  end
end
create_gem(name) click to toggle source

Create a new gem with Bundle’s gem command

# File lib/octopress-ink/commands/new.rb, line 108
def self.create_gem(name)
  begin
    require 'bundler'
    require 'bundler/cli'
    Bundler::CLI.start(['gem', name])

  rescue LoadError
    raise "To use this feature you'll need to install the bundler gem with `gem install bundler`."
  end

end
dependencies() click to toggle source

Returns lines which need to be added as a dependency

spec_var - variable used to assign gemspec attributes, e.g. “spec” as in spec.name = “gem name”

# File lib/octopress-ink/commands/new.rb, line 134
def self.dependencies
  minor_version = VERSION.scan(/\d+\.\d/)[0]
  current_patch_version = VERSION.sub(/\.(alpha|rc).*/i, '')
  d  = "#{@settings[:spec_var]}.add_development_dependency \"octopress\"\n\n"
  d  = "#{@settings[:spec_var]}.add_development_dependency \"clash\"\n\n"
  d += "#{@settings[:spec_var]}.add_runtime_dependency \"octopress-ink\", \"~> #{minor_version}\"\n"
end
fix_name(path) click to toggle source
# File lib/octopress-ink/commands/new.rb, line 54
def self.fix_name(path)
  name = @options['name'].gsub(/-/,'_')
  path = rename('./', name)

  rename(path, "lib/#{name}")

  gemspec = rename(path, "#{name}.gemspec")
  gem_file = rename(path, "lib/#{name}.rb")

  rewrite_name(gemspec, name)
  rewrite_name(gem_file, name)
  rewrite_name(File.join(path, 'README.md'), name)
  rewrite_name(File.join(path, 'Gemfile'), name)

  action = "rename".rjust(12).green.bold
  puts "#{action}  #{name} to #{@options['name']}"
end
fix_spec_files() click to toggle source
# File lib/octopress-ink/commands/new.rb, line 88
def self.fix_spec_files
  @settings[:gemspec].sub! /(#{@settings[:spec_var]}\.files\s+=\s+)(.+)$/ do
    $1+"`git ls-files -z`.split(\"\\x0\").grep(%r{^(bin/|lib/|assets/|changelog|readme|license)}i)"
  end.sub!(/\s*#{@settings[:spec_var]}\.test_files.+$/, '') 
end
format_name(name) click to toggle source

Add spaces between capital letters

# File lib/octopress-ink/commands/new.rb, line 245
def self.format_name(name)
  name.scan(/.*?[a-z](?=[A-Z]|$)/).join(' ')
end
gem_settings(gem_path) click to toggle source

Read gem settings from the gemspec

# File lib/octopress-ink/commands/new.rb, line 217
def self.gem_settings(gem_path)
  gemspec_path = Dir.glob(File.join(gem_path, "/*.gemspec")).first

  if gemspec_path.nil?
    raise "No gemspec file found at #{gem_path}/. To create a new plugin use `octopress ink new <PLUGIN_NAME>`"
  end

  gemspec = File.open(gemspec_path).read
  require_version = gemspec.scan(/require.+version.+$/)[0]
  module_subpath = require_version.scan(/['"](.+)\/version/).flatten[0]
  version = gemspec.scan(/version.+=\s+(.+)$/).flatten[0]
  module_name = format_name(version.split('::')[-2])

  {
    path: gem_path,
    gemspec: gemspec,
    gemspec_path: gemspec_path,
    spec_var: gemspec.scan(/(\w+)\.name/).flatten[0],
    name: gemspec.scan(/name.+['"](.+)['"]/).flatten[0],
    version: version,
    require_version: require_version,
    module_path: File.join('lib', module_subpath + '.rb'),
    module_name: module_name
  }
end
indent(input, level=1) click to toggle source

Indent each line of a string

# File lib/octopress-ink/commands/new.rb, line 251
def self.indent(input, level=1)
  input.gsub(/^/, '  ' * level)
end
insert_before(str, pos, input) click to toggle source

Insert a string before a position

# File lib/octopress-ink/commands/new.rb, line 257
def self.insert_before(str, pos, input)
  if pos
    str[0..(pos - 1)] + input + str[pos..-1]
  else
    str
  end
end
new_plugin() click to toggle source
# File lib/octopress-ink/commands/new.rb, line 24
def self.new_plugin
  path = @options['path'] ||= Dir.pwd
  gem_name = @options['name']
  path_to_gem = File.join(path, gem_name)

  if !File.exist?(path)
    raise "Directory not found: #{File.expand_path(path)}."
  end

  Dir.chdir(path) do
    if Dir.exist?(gem_name) && !Dir["#{gem_name}/*"].empty?
      raise "Directory not empty: #{File.expand_path(gem_name)}."
    end

    name = gem_name.gsub(/-/,'_')
    create_gem(name)

    fix_name(gem_name) if name != gem_name

    @settings = gem_settings(gem_name)
    @settings[:type] = @options['theme'] ? 'theme' : 'plugin'

    fix_spec_files
    add_to_gitignore
    add_dependency
    add_plugin
    add_assets
  end
end
plugin_config() click to toggle source

Return an Ink Plugin configuration hash desinged for this gem

# File lib/octopress-ink/commands/new.rb, line 180
        def self.plugin_config
          depth = @settings[:module_path].count('/')
          assets_path = ("../" * depth) + 'assets'

          config = <<-HERE
name:          "#{@settings[:module_name]}",
slug:          "#{@settings[:type] == 'theme' ? 'theme' : @settings[:name]}",
gem:           "#{@settings[:name]}",
path:          File.expand_path(File.join(File.dirname(__FILE__), "..")),
version:       #{@settings[:version]},
description:   "",                                # What does your theme/plugin do?
source_url:    "https://github.com/user/project", # <- Update info
website:       ""                                 # Optional project website
          HERE
          config.rstrip
        end
process_command(p) click to toggle source
# File lib/octopress-ink/commands/new.rb, line 5
def self.process_command(p)
  p.command(:new) do |c|
    c.syntax "new <PLUGIN_NAME> [options]"
    c.description "Create a new Octopress Ink plugin with Ruby gem scaffolding."
    c.option "theme", "--theme", "Create a new theme."
    c.option "path", "--path PATH", "Create a plugin at a specified path (defaults to current directory)."

    c.action do |args, options|
      if args.empty?
        raise "Please provide a plugin name, e.g. my_awesome_plugin."
      else
        @options = options
        @options['name'] = args[0]
        new_plugin
      end
    end
  end
end
rename(path, target) click to toggle source
# File lib/octopress-ink/commands/new.rb, line 81
def self.rename(path, target)
  old = File.join(path, target)
  new = File.join(path, target.gsub(/_/, '-'))
  FileUtils.mv(old, new)
  new
end
rewrite_name(path, name) click to toggle source
# File lib/octopress-ink/commands/new.rb, line 72
def self.rewrite_name(path, name)
  new_name = name.gsub(/_/, '-')
  content = File.read(path).gsub(name, new_name)

  File.open(path, 'w+') do |f|
    f.write(content)
  end
end
write(path, contents) click to toggle source
# File lib/octopress-ink/commands/new.rb, line 197
def self.write(path, contents)
  action = File.exist?(path) ? "written".rjust(12).blue.bold : "create".rjust(12).green.bold

  File.open(path, 'w+') do |f| 
    f.write(contents)
  end
  puts "#{action}  #{path.sub("#{Dir.pwd}/", '')}"
end