class Amy::Parser

Constants

OPTIONS_FILE

Public Class Methods

new(base_dir = "doc/") click to toggle source
# File lib/amy/parser.rb, line 10
def initialize(base_dir = "doc/")
  @generator = Amy::Generator.new base_dir
  @options   = load_options_file
  @mode      = @options['mode'] || 'file'
end

Public Instance Methods

execute(dir) click to toggle source
# File lib/amy/parser.rb, line 18
def execute(dir)
  specs  = load_specs dir
  if (@mode == "code")
    specs['links'] = @options['links']
    specs['base_url'] = @options['base_url']
    specs['api_version'] = @options['api_version']
  end
  compile_json_specs_with dir, specs
  generate_main_page_with specs
  copy_styles_and_js
  true
end

Private Instance Methods

build_resource(dir, specs) click to toggle source
# File lib/amy/parser.rb, line 43
def build_resource(dir, specs)
 resources = Dir.new(dir)
 to_skip   = [ '.', '..', 'resource.def' ]
 record    = specs['config']
 resources.entries.each do |entry|
    next if to_skip.include?(entry)
    content = IO.read File.join(resources.path, entry)
    method  = File.basename(entry, File.extname(entry)).upcase
    doc     = Maruku.new(content)
    record[method.downcase]['content'] = doc.to_html
 end
 record
end
compile_json_specs_with(dir, specs) click to toggle source
# File lib/amy/parser.rb, line 33
def compile_json_specs_with(dir, specs)
  specs['resources'].each_pair { |resource, options|
     resource_spec = JSON.parse(IO.read(File.join(File.join(dir, options['dir']),"resource.def")))
     options['config'] = build_resource File.join(dir, options['dir']), resource_spec
  } if (@mode == "file")
  File.open("#{Amy::BASE_DIR}/views/js/data.json", 'w') do |f|
    f.write(specs.to_json)
  end
end
copy_styles_and_js() click to toggle source
# File lib/amy/parser.rb, line 114
def copy_styles_and_js
  base_dir = @generator.base_dir
  Dir.mkdir("#{base_dir}/js")
  FileUtils.cp("#{Amy::BASE_DIR}/views/js/amy.min.js", "#{base_dir}/js/amy.js")
  FileUtils.cp("#{Amy::BASE_DIR}/views/js/data.json", "#{base_dir}/data.json")      
  Dir.mkdir("#{base_dir}/style")
  FileUtils.cp("#{Amy::BASE_DIR}/views/style/style.css", "#{base_dir}/style/style.css")
end
generate_main_page_with(specs) click to toggle source
# File lib/amy/parser.rb, line 57
def generate_main_page_with(specs)
  main_page = Amy::Model::Main.new
  specs['resources'].each_pair { |resource, options|
     main_page.add_resource( { 'resource' => resource, 'title' => options['title'] } )
  }
  main_page.set_links    specs['links'] || []
  main_page.set_version  specs['api_version']
  main_page.set_base_url specs['base_url']
  @generator.do("#{Amy::BASE_DIR}/views/main.erb.html", main_page)
end
load_options_file() click to toggle source
# File lib/amy/parser.rb, line 123
def load_options_file
  return {} unless File.exist?(OPTIONS_FILE)
  YAML::load(File.open(OPTIONS_FILE))
end
load_specs(dir) click to toggle source
# File lib/amy/parser.rb, line 68
def load_specs(dir)
  if "file" == @mode then
    JSON.parse(IO.read(File.join(dir,"/specs.def")))
  elsif "code" == @mode then
    { 'resources' => parse_source_code(dir) }
  end
end
parse_source_code(dir) click to toggle source
# File lib/amy/parser.rb, line 76
def parse_source_code(dir)
  parser = ::Parser::Parser.new
  data   = {}
  Dir.foreach(dir) do |file|
    next if [".", ".."].include?(file)
    path = File.join(dir, file)
    if (File.directory?(path)) then
      parse_source_code(path).each_pair do |key, val|
        if data[key].nil? then
           data[key] = val
        else
          data[key].merge!(val)
        end
      end
    else
      defs = parser.parse(path)
      if not defs.empty? then
        defs.each do |_def|
          data[_def.url] = { 'title' => '', 'config' => {} } if data[_def.url].nil?
          record = { 'url' => _def.url, 'title' => _def.get_props["@title"], 'content' => '' }
          if _def.get_props['@params'] then
            record['params'] = []
            _def.get_props['@params'].each_pair do |k,v|
              record['params'] << [k,v]
            end
          end
          record['content'] = _def.get_props['@content'].gsub(/\n/,'<br/>') if _def.get_props['@content']
          if _def.get_props['@description'] then
            data[_def.url]['title'] = _def.get_props['@description']
          end
          data[_def.url]['config'][_def.method] = record
        end
      end
    end
  end
  return data
end