Nephos/NephosRubyServer

View on GitHub
bin/nephos-generator

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby

require 'colorize'
require 'optparse'

require_relative '../lib/nephos-server/version'
require_relative '../lib/nephos-server/bin-helpers'

GEMFILE = <<EOF
source 'https://rubygems.org'

gem 'nephos'
EOF

ROUTE_RB = <<EOF
#get url: "/", controller: "MainController", method: "root"
#get url: "/add", controller: "MainController", method: "add_url"
#get url: "/rm", controller: "MainController", method: "rm_url"
EOF

def raise_invalid_appli
  if not Nephos::Bin.is_a_valid_application? and not $test
    raise BinError, "You are not in a valid application directory"
  end
end

module Nephos
  module Generator

    module Route
      def self.exists? line
        File.read("routes.rb").split("\n").include? line
      end

      def self.write! line
        File.open("routes.rb", "a") do |f|
          f.puts line
        end
        puts("Route created: ".green + line)
      end

      def self.generate!(verb, url, dest_c, dest_m=nil)
        raise_invalid_appli
        raise BinError, "\"#{verb}\" doesn't match with /\w+/" if not verb.to_s.match(/^\w+$/)
        raise BinError, "\"#{url}\" is not a valid url" if not url.match(/^\/?(:?\w+)(\/:?\w+)*\/?$/)
        raise BinError, "Option dest_c must match with \"controller#method\"" if not dest_c.match(/^\w+\#\w+$/) and dest_m.nil?
        raise BinError, "Option dest_c must match with \"controllerName\"" if not dest_m.nil? and not dest_c.match(/^\w+$/)
        raise BinError, "Option dest_m must match with \"methodName\"" if not dest_m.nil? and not dest_c.match(/^\w+$/)
        controller, method = dest_c, dest_m
        if dest_m.nil?
          controller = dest_c.split("#")[0]
          method = dest_c.split("#")[1]
        end
        verb = verb.upcase
        line = "add_route \"#{verb}\", url: \"#{url}\", controller: \"#{controller}\", method: \"#{method}\""
        if exists? line
          if $remove
            routes = File.read("routes.rb").split("\n")
            puts "Success: ".green + "Route deleted: " + routes.delete(line).to_s
            File.write("routes.rb", routes.join("\n") + "\n")
          else
            puts("Warning: ".yellow + "Route already exists: " + line)
          end
        else
          if $remove
            puts("Warning: ".yellow + "Route doesn't exists: " + line)
          else
            write!(line)
          end
        end
      end
    end

    module Controller
      def self.generate!(ctr)
        uname = "#{ctr[0].upcase}#{ctr[1..-1]}Controller".gsub(/ControllerController$/, "Controller")
        lname = uname.gsub(/([A-Z])/, '_\1')[1..-1].downcase
        file = "app/#{lname}.rb"
        raise_invalid_appli
        if $remove
          if File.exist?(file) and File.read(file).include? "class #{uname} < Nephos::Controller"
            File.delete(file)
            puts "Success: ".yellow + "\"#{file}\" removed"
          else
            raise BinError, "\"#{file}\" is not a valid Controller file."
          end
        else
          if File.exist? file
            print "Warning: ".yellow + "The file #{file} already exists. Are you sure to erase it ? (y/N) : "
            r = STDIN.gets.to_s.chomp
            raise BinError, "File #{file} already exists" unless r.match(/y(es)?/)
          end
          f = File.open(file, 'w')
          f << <<EOF
class #{uname} < Nephos::Controller
  def root
    return {plain: "index"}
  end
end
EOF
          puts "Success: ".green + "Controller \"#{uname}\" created at location \"#{file}\""
        end
      end
    end

    module Application
      def self.create_application_dir dir
        raise BinError, "Directory #{dir} already exists" if Dir.exist? dir and dir != "."
        Dir.mkdir dir
      end

      def self.move_to_application_dir dir
        Dir.chdir dir
      end

      def self.initialize!
        raise BinError, "Not an empty dir" unless Dir[File.expand_path "*"].empty?
        File.write "routes.rb", ROUTE_RB
        File.write "Gemfile", GEMFILE
        Dir.mkdir "app"
        begin
          `git init .`
          puts "Git repository initialized"
        rescue Errno::ENOENT => err
          puts "Git Init Error: ".yellow + "git repository not initialized"
        rescue => err
          puts "Git Init Error: ".yellow + " #{err.message}"
        end if $git
        exec("bundle install") if $build
      end
    end

    def self.main opt
      case $mode
      when :controller
        raise BinError, "Invalid Controller name" if not opt[0].to_s.match(/[\w\-\.]+/)
        Controller.generate!(opt[0])
      when :application
        if not opt[0].to_s.empty?
          Application.create_application_dir(opt[0])
          puts "Application #{opt[0]} created"
          Application.move_to_application_dir(opt[0])
        end
        Application.initialize!
        puts "Application initialized"
      when :route
        raise BinError, "Need more arguments (verb url controller method)" if opt.size < 3
        Route.generate!(*(opt[0..3]))
      else
        puts "nephos-generator --help"
      end
    end

  end
end

begin
  opt = OptionParser.new do |opts|
    opts.banner = "Usage<#{Nephos::VERSION}>: nephos-generator <options>"

    $git = true
    opts.on("--no-git", "Disable the git initialization when create new application") do
      $git = false
    end

    $build = true
    opts.on("--no-build", "Disable the `bundle install` execution when create new application") do
      $build = false
    end

    opts.on("--application", "-a", "Create new application") do
      $mode = :application
    end

    opts.on("--route", "-r", "Create and remove routes") do
      $mode = :route
    end

    opts.on("--controller", "-c", "Create and remove controller") do
      $mode = :controller
    end

    opts.on("--rm", "Remove") do
      $remove = true
    end

    opts.on("--debug", "Enable debugging mode") do
      $debug = true
    end

    opts.on("--test", "Enable testing mode (for nephos developpers)") do
      $test = true
    end
  end.parse!

  Nephos::Generator.main(opt)

rescue BinError => err
  puts "Error:".red + " #{err.message}"

rescue => err
  puts "Error:".red + " #{err.message}"
  puts err.backtrace
end