duraki/devist

View on GitHub
bin/devist

Summary

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

require 'devist'
require 'colorize'

##############################################################
#
# bin/devist
# Halis Duraki <duraki.halis@nsoft.ba>
#
##############################################################

# bin/devist
# This file is a part of the devist package (2017).  
#
# This is the main entry point of the Devist. It creates a binary instance and 
# parse, execute and work with actions based on given arguments.
class Binary

    def print_start
    puts <<EOL 

  Use --help for details.

  $ #{"devist init".blue} to initialize a new changelog

EOL
    end

  def logo
    puts <<EOL
         __          _      __ 
    ____/ /__ _   __(_)____/ /_
   / __  / _ \\ | / / / ___/ __/
  / /_/ /  __/ |/ / (__  ) /_  
  \\__,_/\\___/|___/_/____/\\__/ 

EOL
  end

  def print_about
    puts <<EOL
- Release notes generator.
  #{"https://devist.io".yellow} - Halis Duraki <duraki@linuxmail.org>
  
EOL
  end

  # Print small about / info msg
  def print_info
    puts <<EOL
  Use devist to keep & export beautiful release notes. Use syntax 
  defined by devist or keepachangelog standards. Various integration 
  supported, including `git` and `deployment` hooks. 

EOL
  end

  # Print help menu.
  def print_help
    print_info

    puts <<EOL

  # To initialize a new changelog use:
  
  $ #{"devist init".green}
    
  -
  # Other commands:
  $ #{"devist".green}          | run devist cli
  $ #{"devist --cmd".green}    | usage / commands
  $ #{"devist --help".green}   | usage / this menu
  $ #{"devist --v".green}      | show current version
  
  - 
  # Generate HTML output:
  $ #{"devist [CHANGELOG] [THEME]".green}

  Example:
  $ #{"devist changelog".green}
  $ #{"devist changelog polar".green}

EOL
  end

  # Entry point. Main.
  def ep (arguments)
    @arguments = arguments

    logo
    print_about

    # Recieved filename + theme as args
    if @arguments.count.equal?(2)
      return theme
    end

    if @arguments[0].nil?
      print_info
      print_start
    end

    # Check other arguments
    case @arguments[0]
    when '--h', '--help', '--cmd'
      print_help
    when '--v', '--version'
      version
    when '--new', 'init'
      create # Deperecated version
    else
      default # Try to export with filename and default theme
      return
    end

  end

  # Generate with default theme.
  def default
    file_name = @arguments[0]

    unless file_name.nil?
      decompile(file_name)
    end
  end

  # Generate with specific theme file.
  def theme
    file_name = @arguments[0]
    theme_name = @arguments[1]

    unless file_name.nil?
      decompile(file_name, theme_name)
    end
  end

  # Display devist version.
  def version
    print "  * devist version: #{Devist::VERSION}\n"
  end

  # Create new changelog.
  def create
    print "  * Generating CHANGELOG.md ...\n"

    if File.file?(Dir.pwd + '/CHANGELOG.md')
      print "  * File CHANGELOG.md already exists. Backup it, remove, and try again.\n"
      print "  * You may try to run '#{"devist changelog".blue}' to try generate the export.\n"
      abort
    end

    new = File.new(Dir.pwd + '/CHANGELOG.md', 'w')
    print "  * Output .devist as a way of thinkering ...\n"
    thinkering(new)
    print "  -\n"
    print "  ** All done! Continue editing CHANGELOG.md.\n"
  end

  def name
    `git config --global user.name`
  end

  def email
    `git config --global user.email`
  end

  def origtoweb
    remote = `git config --get remote.origin.url`
    remote  = 'git@github.com:duraki/devist.git'

    web = remote[/@(.*?):/m, 1]
    if web.empty?  
        web = "https://github.com/" 
    end

    user = remote[/:(.*?)\//m, 1]
    if user.empty?  
        user = "<username>"
    end

    project = remote[/\/(.*?)\./m, 1]
    if project.empty?  
        project = "#{File.basename(Dir.pwd)}"
    end

    "https://#{web}/#{user}/#{project}"
  end

  # Fill new changelog.
  def thinkering(new)
    new.puts("@project: #{File.basename(Dir.pwd)} ")
    new.puts("@author: #{name.strip} <#{email.strip}>  ")
    new.puts("@homepage: #{origtoweb}  ")
    new.puts('')
    new.puts("### Version 1.0.0 of #{Time.now.strftime("%d %b %Y")}")
    new.puts('+ #added: something goes here')
    new.puts('')
    new.puts('.devist')
    new.close
  end

  # Decompile
  def decompile(file_name, theme_name = 'default')
    print "  * devist will try to generate export for file '#{file_name}' with theme '#{theme_name}'\n"

    @devist = Devist.new(file_name, theme_name)
    @devist.decompile
    @devist.recompile
  end

end

# Create new bin/ep with argv
devistbin = Binary.new
devistbin.ep(ARGV)