class Cuki

Constants

CONFIG_PATH
DEFAULT_CONTAINER
FEATURE_HEADER
FLAGS
PRIMARY_HEADER
SCENARIO_HEADER

Public Class Methods

invoke(args) click to toggle source
# File lib/cuki.rb, line 23
def self.invoke(args)
  new(args)
end
new(args) click to toggle source
# File lib/cuki.rb, line 27
def initialize(args)
  @args = args
  validate_args
  read_config
  configure_http_client
  @link_builder = LinkBuilder.new(@config['host'])
  action = args.first
  if args.include?(FLAGS[:skip_autoformat])
    args.delete_if { |arg| FLAGS[:skip_autoformat] == arg }
    @skip_autoformat = true
  end
  configure_pull_stubs
  verify_project
  file = args[1]
  if file
    id = mappings.invert[file]
    terminate "could not get id for #{file}" unless id
    pull_feature id, file
  else
    Parallel.map(mappings, :in_processes => 4) do |id, filepath|
      pull_feature id, filepath
    end
  end
  autoformat!
end

Private Instance Methods

autoformat!() click to toggle source
# File lib/cuki.rb, line 86
def autoformat!
  unless @skip_autoformat
    `cucumber -a . --dry-run -P`
    puts "Running autoformat"
  end
end
configure_http_client() click to toggle source
# File lib/cuki.rb, line 69
def configure_http_client
  @client = HTTPClient.new
  @client.ssl_config.set_trust_ca(ENV['CER']) if ENV['CER']
  @client.ssl_config.set_client_cert_file(ENV['PEM'], ENV['PEM']) if ENV['PEM']
end
container() click to toggle source
# File lib/cuki.rb, line 82
def container
  @config['container'] ||= DEFAULT_CONTAINER
end
handle_multi(response_body, id) click to toggle source
# File lib/cuki.rb, line 93
def handle_multi response_body, id
  confluence_page = ConfluencePage.new(response_body)

  full_content = confluence_page.content

  terminate "Could not find acceptance criteria container" unless full_content.match(container)

  acceptance_criteria = full_content.split(container).last
  
  if acceptance_criteria.include?(PRIMARY_HEADER)
    acceptance_criteria = acceptance_criteria.split(/#{PRIMARY_HEADER}/).first
  end

  terminate "Could not match #{container} in #{id}" unless acceptance_criteria

  scenario_titles = acceptance_criteria.scan(/#{FEATURE_HEADER} (.*)/).flatten
  scenario_blocks = acceptance_criteria.split(/#{FEATURE_HEADER} .*/)
  scenario_blocks.shift

  puts "Warning: No scenarios found in doc #{id}" if scenario_titles.empty?

  pretext = acceptance_criteria.split(/#{FEATURE_HEADER}/).first

  combined = {}
  scenario_titles.each_with_index do |title, index|
    combined[title] = scenario_blocks[index].gsub(/h\d. ([Scenario|Scenario Outline].*)/, '\1')
  end

  combined.each do |title, content|

    feature_filename = title.parameterize
    dirpath = mappings[id]
    FileUtils.mkdir_p(dirpath)

    fname = "#{dirpath}/#{feature_filename.gsub("\r", '').parameterize}.feature"
    puts "Writing #{fname}"
    File.open(fname, 'w') do |f|
      if @config['tags']
        @config['tags'].each do |tag, token|
          f.write "@#{tag}\n" if pretext.include?(token)
        end
      end
      if @config['tags']
        @config['tags'].each do |tag, token|
          content.gsub!(token, "@#{tag}\n")
        end
      end
      f.write "Feature: #{title}\n\n"
      f.write @link_builder.view(id, confluence_page.title, title)
      f.write content
    end
  end
end
mappings() click to toggle source
# File lib/cuki.rb, line 153
def mappings
  @config['mappings']
end
pull_feature(id, filepath) click to toggle source
# File lib/cuki.rb, line 75
def pull_feature(id, filepath)
  wiki_edit_link = @link_builder.edit(id)
  puts "Downloading #{wiki_edit_link}"
  response = @client.get wiki_edit_link
  handle_multi response.body, id
end
read_config() click to toggle source
# File lib/cuki.rb, line 62
def read_config
  terminate "No config file found at #{CONFIG_PATH}" unless File.exist?(CONFIG_PATH)
  @config = YAML::load( File.open( CONFIG_PATH ) )
  terminate "Host not found in #{CONFIG_PATH}" unless @config["host"]
  terminate "Mappings not found in #{CONFIG_PATH}" unless @config["mappings"]
end
terminate(message) click to toggle source
# File lib/cuki.rb, line 157
def terminate(message)
  puts message
  exit(1)
end
validate_args() click to toggle source
# File lib/cuki.rb, line 147
def validate_args
  terminate "No action given" if @args.empty?
  command = @args.first
  terminate "Unknown action '#{@args.first}'" unless 'pull' == command
end
verify_project() click to toggle source
# File lib/cuki.rb, line 55
def verify_project
  terminate "features folder not found" unless File.exists?('features')
  puts "Verifying existing features"
  `cucumber --dry-run -P`
  terminate "Validation of existing features failed" unless 0 == $? 
end