class SoupCMS::CLI::Model::Base

Constants

SEVERITY_COLOR_MAP

Attributes

file[R]

Public Class Methods

create_model(file) click to toggle source
# File lib/soupcms/cli/model/base.rb, line 12
def self.create_model(file)
  type = File.basename(file).split('.').last
  model = file.path.split('/')[2]
  case type
    when 'json'
      SoupCMS::CLI::Model::Base.new(file).create
    when 'yml'
      SoupCMS::CLI::Model::Yaml.new(file).create
    when 'md'
      case model
        when 'posts'
          SoupCMS::CLI::Model::Post.new(file).create
        when 'chapters'
          SoupCMS::CLI::Model::Chapter.new(file).create
        when 'pages'
          SoupCMS::CLI::Model::Page.new(file).create
        else
          SoupCMS::CLI::Model::Markdown.new(file).create
      end
  end
end
new(file) click to toggle source
# File lib/soupcms/cli/model/base.rb, line 35
def initialize(file);
  @file = file;
  @logger = Logger.new(STDOUT)
  @logger.level = ENV['verbose'] == 'true' ? Logger::DEBUG : Logger::INFO
  @logger.formatter = proc do |severity, datetime, progname, msg|
    "#{severity}: #{msg}\n".colorize(SEVERITY_COLOR_MAP[severity] || :red)
  end
end

Public Instance Methods

app_name() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 68
def app_name;
  file.path.split('/')[1]
end
build() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 103
def build
  doc['doc_id'] = doc_name unless doc['doc_id']

  timestamp = file.mtime.to_i

  doc['publish_datetime'] = doc['publish_datetime'].to_i || timestamp
  doc['version'] = timestamp unless doc['version']
  doc['locale'] = 'en_US' unless doc['locale']
  doc['update_datetime'] = timestamp
  doc['create_datetime'] = (old_doc.empty? ? timestamp : old_doc['create_datetime'])
  doc['create_by'] = 'seed' unless doc['create_by']

  doc['state'] = publish_in_future? ? 'draft' : 'published' unless doc['state']
  doc['latest'] = true unless doc['latest']

  doc['slug'] = slug unless doc['slug']
  doc['hero_image'] = {'url' => hero_image} if hero_image
end
coll() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 76
def coll;
  db[model]
end
conn() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 46
def conn
  return @conn if @conn
  mongo_uri = ENV["MONGODB_URI_#{app_name}"] || ENV["MONGOLAB_URI"] || "mongodb://localhost:27017/#{app_name}"
  @conn = Mongo::MongoClient.from_uri(mongo_uri)
end
create() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 126
def create
  build
  if doc['update_datetime'] == old_doc['update_datetime']
    @logger.debug "Skipping document '#{file.path}' since no changes"
  else
    @logger.info "Inserting document '#{file.path}'"
    @logger.debug "\n #{JSON.pretty_generate(doc)}"
    coll.insert(doc)
    update_old_doc
  end
  conn.close
end
db() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 72
def db;
  conn.db
end
doc() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 86
def doc;
  @doc ||= parse_file
end
doc_name() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 52
def doc_name;
  File.basename(file).split('.').first
end
hero_image() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 80
def hero_image
  image_path = File.join('public', app_name, model, "images/#{doc_name}.*")
  hero_image = Dir.glob(image_path).to_a
  return File.join('/assets', app_name, model, 'images', File.basename(hero_image[0])) unless hero_image.empty?
end
model() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 64
def model;
  file.path.split('/')[2]
end
old_doc() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 95
def old_doc
  @old_doc ||= (coll.find({'doc_id' => doc['doc_id'], 'latest' => true}).to_a[0] || {})
end
parse_file() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 90
def parse_file
  document_hash = JSON.parse(file.read)
  SoupCMS::CLI::ResolveFileReference.new(File.dirname(file)).parse(document_hash)
end
publish_in_future?() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 122
def publish_in_future?
  doc['publish_datetime'] > Time.now.to_i
end
slug() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 56
def slug;
  doc['slug'] || doc_name
end
type() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 60
def type;
  File.basename(file).split('.').last
end
update_old_doc() click to toggle source
# File lib/soupcms/cli/model/base.rb, line 99
def update_old_doc
  coll.update({'_id' => old_doc['_id']}, {'$set' => {'latest' => false, 'state' => 'published_archive'}}) unless old_doc.empty?
end