startling 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/bin/wip +9 -0
- data/lib/generators/startling/configuration_generator.rb +4 -4
- data/lib/startling/command.rb +27 -27
- data/lib/startling/commands/check_wip.rb +30 -0
- data/lib/startling/commands/create_branch.rb +1 -1
- data/lib/startling/configuration.rb +4 -2
- data/lib/startling/github/pull_request.rb +4 -1
- data/lib/startling/time_format_helpers.rb +48 -0
- data/lib/startling/version.rb +1 -1
- data/lib/startling/work.rb +47 -0
- data/lib/startling/work_printer.rb +53 -0
- data/spec/startling/command_spec.rb +85 -0
- data/spec/startling/commands/create_branch_spec.rb +2 -2
- data/spec/startling/configuration_spec.rb +65 -3
- data/spec/startling/github/pull_request_spec.rb +30 -18
- data/spec/startling/time_format_helpers_spec.rb +42 -0
- data/spec/startling_spec.rb +4 -4
- data/spec/support/vcr.rb +0 -3
- data/startling.gemspec +1 -1
- metadata +14 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: b26b3cd09c416dd020682a1731d63bcf931d8c56
         | 
| 4 | 
            +
              data.tar.gz: bd084e7429476ee0fee565fc0f74701875727f04
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: ccda655ad497e3ab4b4ef1fb944cdc30e3dc1ccd8ab7a145002280e2040b42633e4ad17266c9b28c49e4c029d9f5d058258aa8b20bf993382c62d65c11784d40
         | 
| 7 | 
            +
              data.tar.gz: 70f5f05b33ea24147babfc561eabfc5e5d2e1ca05db3c4ef630ba4095be2318782fb8824c4ef81cbac6a76ce3fa7a417a1c6457f386d4339921dd431685f9934
         | 
    
        data/README.md
    CHANGED
    
    | @@ -28,11 +28,11 @@ Startling.configure do |config| | |
| 28 28 | 
             
              # WIP Limit
         | 
| 29 29 | 
             
              # config.wip_limit = 4
         | 
| 30 30 |  | 
| 31 | 
            -
              #  | 
| 32 | 
            -
              # config. | 
| 31 | 
            +
              # Labels for WIP pull requests
         | 
| 32 | 
            +
              # config.wip_labels = ["WIP", "REVIEW"]
         | 
| 33 33 |  | 
| 34 | 
            -
              #  | 
| 35 | 
            -
              # config. | 
| 34 | 
            +
              # Repos to check against for WIP limit
         | 
| 35 | 
            +
              # config.repos << "substantial/startling"
         | 
| 36 36 |  | 
| 37 37 | 
             
              # Commands to be run before a story is stared
         | 
| 38 38 | 
             
              # config.hook_commands.before_story_start = [:check_wip]
         | 
    
        data/bin/wip
    ADDED
    
    | @@ -0,0 +1,9 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require_relative '../lib/startling'
         | 
| 4 | 
            +
            require_relative '../lib/startling/work'
         | 
| 5 | 
            +
            require_relative '../lib/startling/work_printer'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Startling::Configuration.load_configuration
         | 
| 8 | 
            +
            wip = Startling::Work.in_progress
         | 
| 9 | 
            +
            Startling::WorkPrinter.new.print wip
         | 
| @@ -25,11 +25,11 @@ Startling.configure do |config| | |
| 25 25 | 
             
              # WIP Limit
         | 
| 26 26 | 
             
              # config.wip_limit = 4
         | 
| 27 27 |  | 
| 28 | 
            -
              #  | 
| 29 | 
            -
              # config. | 
| 28 | 
            +
              # Labels for WIP pull requests
         | 
| 29 | 
            +
              # config.wip_labels = ["WIP", "REVIEW"]
         | 
| 30 30 |  | 
| 31 | 
            -
              #  | 
| 32 | 
            -
              # config. | 
| 31 | 
            +
              # Repos to check against for WIP limit
         | 
| 32 | 
            +
              # config.repos << "substantial/startling"
         | 
| 33 33 |  | 
| 34 34 | 
             
              # Commands to be run before a story is stared
         | 
| 35 35 | 
             
              # config.hook_commands.before_story_start = [:check_wip]
         | 
    
        data/lib/startling/command.rb
    CHANGED
    
    | @@ -23,45 +23,45 @@ module Startling | |
| 23 23 | 
             
                end
         | 
| 24 24 |  | 
| 25 25 | 
             
                def execute
         | 
| 26 | 
            -
                  Commands::CheckForLocalMods.run(git: git)
         | 
| 27 26 | 
             
                  command_args = cli_options.merge(git: git)
         | 
| 28 27 |  | 
| 29 | 
            -
                   | 
| 30 | 
            -
             | 
| 28 | 
            +
                  check_for_local_mods
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  run_hook_commands(hook: :before_story_start, command_args: command_args)
         | 
| 31 | 
            +
                  start_story(command_args)
         | 
| 32 | 
            +
                  run_hook_commands(hook: :after_story_start, command_args: command_args)
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  run_hook_commands(hook: :before_pull_request, command_args: command_args)
         | 
| 35 | 
            +
                  create_pull_request(command_args)
         | 
| 36 | 
            +
                  run_hook_commands(hook: :after_pull_request, command_args: command_args)
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def git
         | 
| 40 | 
            +
                  @git ||= GitLocal.new
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                private
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                def check_for_local_mods
         | 
| 46 | 
            +
                  Commands::CheckForLocalMods.run(git: git)
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def run_hook_commands(hook:, command_args:)
         | 
| 50 | 
            +
                  Startling.hook_commands.send(hook).map do |command|
         | 
| 31 51 | 
             
                    command_class(command).send(RUN, command_args)
         | 
| 32 52 | 
             
                  end
         | 
| 53 | 
            +
                end
         | 
| 33 54 |  | 
| 34 | 
            -
             | 
| 55 | 
            +
                def start_story(command_args)
         | 
| 35 56 | 
             
                  story = command_class(Startling.story_handler)
         | 
| 36 57 | 
             
                    .send(RUN, command_args) if Startling.story_handler
         | 
| 37 58 | 
             
                  command_args.merge!(story: story)
         | 
| 59 | 
            +
                end
         | 
| 38 60 |  | 
| 39 | 
            -
             | 
| 40 | 
            -
                  Startling.hook_commands.after_story_start.map do |command|
         | 
| 41 | 
            -
                    command_class(command)
         | 
| 42 | 
            -
                      .send(RUN, command_args)
         | 
| 43 | 
            -
                  end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                  #Before Pull Request Creation
         | 
| 46 | 
            -
                  Startling.hook_commands.before_pull_request.map do |command|
         | 
| 47 | 
            -
                    command_class(command)
         | 
| 48 | 
            -
                      .send(RUN, command_args)
         | 
| 49 | 
            -
                  end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                  # Create pull request
         | 
| 61 | 
            +
                def create_pull_request(command_args)
         | 
| 52 62 | 
             
                  pull_request = command_class(:create_pull_request)
         | 
| 53 63 | 
             
                    .send(RUN, command_args)
         | 
| 54 64 | 
             
                  command_args.merge!(pull_request: pull_request)
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                  # After Pull Request Creation
         | 
| 57 | 
            -
                  Startling.hook_commands.after_pull_request.map do |command|
         | 
| 58 | 
            -
                    command_class(command)
         | 
| 59 | 
            -
                      .send(RUN, command_args)
         | 
| 60 | 
            -
                  end
         | 
| 61 | 
            -
                end
         | 
| 62 | 
            -
             | 
| 63 | 
            -
                def git
         | 
| 64 | 
            -
                  @git ||= GitLocal.new
         | 
| 65 65 | 
             
                end
         | 
| 66 66 | 
             
              end
         | 
| 67 67 | 
             
            end
         | 
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            require 'highline/import'
         | 
| 2 | 
            +
            require_relative 'base'
         | 
| 3 | 
            +
            require_relative '../colorize_string'
         | 
| 4 | 
            +
            require_relative '../work'
         | 
| 5 | 
            +
            require_relative '../work_printer'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module Startling
         | 
| 8 | 
            +
              module Commands
         | 
| 9 | 
            +
                class CheckWip < Base
         | 
| 10 | 
            +
                  using ColorizeString
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def execute
         | 
| 13 | 
            +
                    puts "Checking WIP..."
         | 
| 14 | 
            +
                    wip = Work.in_progress
         | 
| 15 | 
            +
                    if wip.count >= Startling.wip_limit
         | 
| 16 | 
            +
                      WorkPrinter.new.print wip
         | 
| 17 | 
            +
                      puts
         | 
| 18 | 
            +
                      question = [
         | 
| 19 | 
            +
                        "Would you like to start anyway (",
         | 
| 20 | 
            +
                        'anything but "yes" will abort'.underline,
         | 
| 21 | 
            +
                        ")? "
         | 
| 22 | 
            +
                      ].map { |string| string.yellow }.join
         | 
| 23 | 
            +
                      confirm = ask(question)
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                      exit unless confirm == "yes"
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            require 'startling/git_local'
         | 
| 2 2 | 
             
            require 'startling/github'
         | 
| 3 3 | 
             
            require 'startling/colorize_string'
         | 
| 4 | 
            +
            require 'startling/commands/check_wip'
         | 
| 4 5 | 
             
            require 'startling/commands/label_pull_request'
         | 
| 5 6 | 
             
            require 'startling/handlers/default_pull_request_handler'
         | 
| 6 7 |  | 
| @@ -17,7 +18,7 @@ module Startling | |
| 17 18 | 
             
                  'Startlingfile.rb'
         | 
| 18 19 | 
             
                ].freeze
         | 
| 19 20 |  | 
| 20 | 
            -
                attr_accessor :cache_dir, :root_dir, :wip_limit, :repos, :story_handler,
         | 
| 21 | 
            +
                attr_accessor :cache_dir, :root_dir, :wip_limit, :wip_labels, :repos, :story_handler,
         | 
| 21 22 | 
             
                  :validate_branch_name, :pull_request_body, :pull_request_handler,
         | 
| 22 23 | 
             
                  :pull_request_labels, :pull_request_commit_message, :cli_options
         | 
| 23 24 |  | 
| @@ -25,7 +26,8 @@ module Startling | |
| 25 26 | 
             
                  @cache_dir = Dir.pwd
         | 
| 26 27 | 
             
                  @root_dir = Dir.pwd
         | 
| 27 28 | 
             
                  @wip_limit = DEFAULT_WIP_LIMIT
         | 
| 28 | 
            -
                  @ | 
| 29 | 
            +
                  @wip_labels = []
         | 
| 30 | 
            +
                  @repos = [GitLocal.new.repo_name]
         | 
| 29 31 | 
             
                  @story_handler = nil
         | 
| 30 32 | 
             
                  @validate_branch_name = nil
         | 
| 31 33 | 
             
                  @pull_request_handler = nil
         | 
| @@ -22,7 +22,9 @@ module Startling | |
| 22 22 | 
             
                  end
         | 
| 23 23 |  | 
| 24 24 | 
             
                  def in_progress?
         | 
| 25 | 
            -
                     | 
| 25 | 
            +
                    return true if Startling.wip_labels.empty?
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    (label_names & Startling.wip_labels).size > 0
         | 
| 26 28 | 
             
                  end
         | 
| 27 29 |  | 
| 28 30 | 
             
                  def label_names
         | 
| @@ -46,6 +48,7 @@ module Startling | |
| 46 48 | 
             
                  end
         | 
| 47 49 |  | 
| 48 50 | 
             
                  private
         | 
| 51 | 
            +
             | 
| 49 52 | 
             
                  def prefetch_data
         | 
| 50 53 | 
             
                    author
         | 
| 51 54 | 
             
                  end
         | 
| @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            require 'tzinfo'
         | 
| 2 | 
            +
            require 'business_time'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Startling
         | 
| 5 | 
            +
              module TimeFormatHelpers
         | 
| 6 | 
            +
                def business_time_ago(time)
         | 
| 7 | 
            +
                  days = pdt(time).to_date.business_days_until(pdt(Time.now).to_date)
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  case days
         | 
| 10 | 
            +
                  when 0
         | 
| 11 | 
            +
                    hours_ago(time)
         | 
| 12 | 
            +
                  else
         | 
| 13 | 
            +
                    "#{pluralize(days, "day")} ago"
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def hours_ago(time)
         | 
| 18 | 
            +
                  total_seconds = Time.now - time
         | 
| 19 | 
            +
                  time_suffix = total_seconds >= 0 ? 'ago' : 'from now'
         | 
| 20 | 
            +
                  total_seconds = total_seconds.abs
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  hours = (total_seconds / (60 * 60)).floor
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  if hours < 1
         | 
| 25 | 
            +
                    pretty_time = "less than an hour"
         | 
| 26 | 
            +
                  else
         | 
| 27 | 
            +
                    pretty_time = pluralize(hours, 'hour')
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  "#{pretty_time} #{time_suffix}"
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                def pluralize(n, singular, plural=nil)
         | 
| 34 | 
            +
                  if n == 1
         | 
| 35 | 
            +
                    "1 #{singular}"
         | 
| 36 | 
            +
                  elsif plural
         | 
| 37 | 
            +
                    "#{n} #{plural}"
         | 
| 38 | 
            +
                  else
         | 
| 39 | 
            +
                    "#{n} #{singular}s"
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def pdt(time)
         | 
| 44 | 
            +
                  tz = TZInfo::Timezone.get('America/Los_Angeles')
         | 
| 45 | 
            +
                  tz.utc_to_local(time)
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
            end
         | 
    
        data/lib/startling/version.rb
    CHANGED
    
    
| @@ -0,0 +1,47 @@ | |
| 1 | 
            +
            require 'parallel'
         | 
| 2 | 
            +
            require_relative 'github'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Startling
         | 
| 5 | 
            +
              class Work
         | 
| 6 | 
            +
                using ColorizeString
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                attr_reader :pull_requests, :branch
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def initialize(branch, pull_requests)
         | 
| 11 | 
            +
                  @branch = branch
         | 
| 12 | 
            +
                  @pull_requests = pull_requests
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def in_progress?
         | 
| 16 | 
            +
                  pull_requests.any?(&:in_progress?)
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def to_s
         | 
| 20 | 
            +
                  "#{authors.join(", ").blue} - #{branch.to_s.yellow}\n" +
         | 
| 21 | 
            +
                    pull_requests.map { |p| "    #{p}"}.join("\n")
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def authors
         | 
| 25 | 
            +
                  pull_requests.map(&:author).uniq.sort
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                def started_at
         | 
| 29 | 
            +
                  pull_requests.map(&:created_at).min
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def self.all
         | 
| 33 | 
            +
                  repos = Startling.repos.map { |name| Github.repo(name) }
         | 
| 34 | 
            +
                  pull_requests = Parallel.map(repos, in_threads: repos.count, &:pull_requests).flatten
         | 
| 35 | 
            +
                  from_pull_requests(pull_requests)
         | 
| 36 | 
            +
                end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                def self.from_pull_requests(pull_requests)
         | 
| 39 | 
            +
                  work = pull_requests.group_by(&:branch)
         | 
| 40 | 
            +
                  work.map { |branch, pulls| new(branch, pulls) }
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def self.in_progress
         | 
| 44 | 
            +
                  all.select(&:in_progress?)
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
              end
         | 
| 47 | 
            +
            end
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            require 'paint'
         | 
| 2 | 
            +
            require_relative 'colorize_string'
         | 
| 3 | 
            +
            require_relative 'time_format_helpers'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Startling
         | 
| 6 | 
            +
              class WorkPrinter
         | 
| 7 | 
            +
                using ColorizeString
         | 
| 8 | 
            +
                include TimeFormatHelpers
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def print(works)
         | 
| 11 | 
            +
                  puts works.sort_by(&:started_at).map { |work| format_work(work) }.join("\n\n")
         | 
| 12 | 
            +
                  puts "\nThere is currently #{count(works)} out of #{Startling.wip_limit.to_s.yellow} WIP."
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def format_pull_request(pull_request)
         | 
| 16 | 
            +
                  "#{format_pull_request_labels(pull_request)}: #{pull_request.title}\n" +
         | 
| 17 | 
            +
                    "  Started #{ago pull_request.created_at}, last updated #{ago pull_request.updated_at}\n" +
         | 
| 18 | 
            +
                    "  #{pull_request.url.cyan.underline}"
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def format_work(work)
         | 
| 22 | 
            +
                  "#{work.authors.join(", ").green} - #{work.branch.to_s.yellow}\n".yellow +
         | 
| 23 | 
            +
                    indent(work.pull_requests.sort_by(&:created_at).map { |p| format_pull_request(p) }.join("\n"))
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def indent(string)
         | 
| 27 | 
            +
                  string.split("\n").map {|s| "  #{s}"}.join("\n")
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def ago(time)
         | 
| 31 | 
            +
                  business_time_ago(time).yellow
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def count(works)
         | 
| 35 | 
            +
                  count = works.count
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  if count > Startling.wip_limit
         | 
| 38 | 
            +
                    count.to_s.red
         | 
| 39 | 
            +
                  elsif count == Startling.wip_limit
         | 
| 40 | 
            +
                    count.to_s.yellow
         | 
| 41 | 
            +
                  else
         | 
| 42 | 
            +
                    count.to_s.blue
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                private
         | 
| 47 | 
            +
                def format_pull_request_labels(pull_request)
         | 
| 48 | 
            +
                  pull_request.labels.map do |label|
         | 
| 49 | 
            +
                    Paint[label[:name], :black, label[:color]]
         | 
| 50 | 
            +
                  end.join(", ")
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end
         | 
| @@ -0,0 +1,85 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'startling/command'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            describe Startling::Command do
         | 
| 6 | 
            +
              let(:command) { Startling::Command.new }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              describe '#execute' do
         | 
| 9 | 
            +
                before do
         | 
| 10 | 
            +
                  allow(Startling::Commands::CheckForLocalMods).to receive(Startling::Command::RUN)
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  allow(Startling)
         | 
| 13 | 
            +
                    .to receive_message_chain(:hook_commands, :before_story_start) { [] }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  allow(Startling)
         | 
| 16 | 
            +
                    .to receive_message_chain(:hook_commands, :after_story_start) { [] }
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  allow(Startling)
         | 
| 19 | 
            +
                    .to receive_message_chain(:hook_commands, :before_pull_request) { [] }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  allow(Startling)
         | 
| 22 | 
            +
                    .to receive_message_chain(:hook_commands, :after_pull_request) { [] }
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  allow(Startling).to receive(:story_handler) { nil }
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  allow(Startling::Commands::CreatePullRequest).to receive(Startling::Command::RUN)
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                it 'should check for local modifications' do
         | 
| 30 | 
            +
                  expect(Startling::Commands::CheckForLocalMods).to receive(Startling::Command::RUN)
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  command.execute
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                it 'should run before story start commands' do
         | 
| 36 | 
            +
                  allow(Startling)
         | 
| 37 | 
            +
                    .to receive_message_chain(:hook_commands, :before_story_start) { [:create_branch] }
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  expect(Startling::Commands::CreateBranch).to receive(Startling::Command::RUN)
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  command.execute
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                it 'should start the story if a story handler is defined' do
         | 
| 45 | 
            +
                  allow(Startling).to receive(:story_handler) { Startling::Commands::CreateBranch }
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  expect(Startling::Commands::CreateBranch).to receive(Startling::Command::RUN)
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  command.execute
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                it 'should run after story start commands' do
         | 
| 53 | 
            +
                  allow(Startling)
         | 
| 54 | 
            +
                    .to receive_message_chain(:hook_commands, :after_story_start) { [:create_branch] }
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  expect(Startling::Commands::CreateBranch).to receive(Startling::Command::RUN)
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  command.execute
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                it 'should run before pull request commands' do
         | 
| 62 | 
            +
                  allow(Startling)
         | 
| 63 | 
            +
                    .to receive_message_chain(:hook_commands, :before_pull_request) { [:create_branch] }
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  expect(Startling::Commands::CreateBranch).to receive(Startling::Command::RUN)
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                  command.execute
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                it 'should create the pull request' do
         | 
| 71 | 
            +
                  expect(Startling::Commands::CreatePullRequest).to receive(Startling::Command::RUN)
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  command.execute
         | 
| 74 | 
            +
                end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                it 'should run after pull request commands' do
         | 
| 77 | 
            +
                  allow(Startling)
         | 
| 78 | 
            +
                    .to receive_message_chain(:hook_commands, :after_pull_request) { [:create_branch] }
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  expect(Startling::Commands::CreateBranch).to receive(Startling::Command::RUN)
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                  command.execute
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
              end
         | 
| 85 | 
            +
            end
         | 
| @@ -61,13 +61,13 @@ describe Startling::Commands::CreateBranch do | |
| 61 61 | 
             
                  end
         | 
| 62 62 |  | 
| 63 63 | 
             
                  it 'returns the branch entered through the prompt' do
         | 
| 64 | 
            -
                     | 
| 64 | 
            +
                    allow_any_instance_of(Startling::Commands::CreateBranch).to receive(:ask) { 'entered branch' }
         | 
| 65 65 |  | 
| 66 66 | 
             
                    expect(subject).to eq('entered-branch')
         | 
| 67 67 | 
             
                  end
         | 
| 68 68 |  | 
| 69 69 | 
             
                  it 'returns the current branch when no branch is entered through the prompt' do
         | 
| 70 | 
            -
                     | 
| 70 | 
            +
                    allow_any_instance_of(Startling::Commands::CreateBranch).to receive(:ask) { '' }
         | 
| 71 71 | 
             
                    allow(git).to receive(:current_branch) { 'current-branch' }
         | 
| 72 72 |  | 
| 73 73 | 
             
                    expect(subject).to eq('current-branch')
         | 
| @@ -4,6 +4,11 @@ require 'startling' | |
| 4 4 | 
             
            module Startling
         | 
| 5 5 | 
             
              describe Configuration do
         | 
| 6 6 | 
             
                let(:configuration) { Configuration.new }
         | 
| 7 | 
            +
                let(:current_repo) { 'current' }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                before do
         | 
| 10 | 
            +
                  allow_any_instance_of(GitLocal).to receive(:repo_name) { current_repo }
         | 
| 11 | 
            +
                end
         | 
| 7 12 |  | 
| 8 13 | 
             
                describe "Default settings" do
         | 
| 9 14 | 
             
                  it "sets the default cache_dir to pwd" do
         | 
| @@ -19,8 +24,29 @@ module Startling | |
| 19 24 | 
             
                      .to eql(Configuration::DEFAULT_WIP_LIMIT)
         | 
| 20 25 | 
             
                  end
         | 
| 21 26 |  | 
| 22 | 
            -
                  it "sets the  | 
| 23 | 
            -
                    expect(configuration. | 
| 27 | 
            +
                  it "sets the WIP labels to empty" do
         | 
| 28 | 
            +
                    expect(configuration.wip_labels).to eql([])
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  it "sets the default repos to the current repo" do
         | 
| 32 | 
            +
                    expect(configuration.repos).to eql([current_repo])
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  it "sets the default story handler to nil" do
         | 
| 36 | 
            +
                    expect(configuration.story_handler).to eql(nil)
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  it "sets the default branch name validator to nil" do
         | 
| 40 | 
            +
                    expect(configuration.validate_branch_name).to eql(nil)
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  it "sets the default pull request handler to nil" do
         | 
| 44 | 
            +
                    expect(configuration.pull_request_handler).to eql(nil)
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  it "sets the default pull request body" do
         | 
| 48 | 
            +
                    expect(configuration.pull_request_body)
         | 
| 49 | 
            +
                      .to eql(Configuration::DEFAULT_BODY)
         | 
| 24 50 | 
             
                  end
         | 
| 25 51 |  | 
| 26 52 | 
             
                  it "sets the default pull request commit message" do
         | 
| @@ -54,10 +80,46 @@ module Startling | |
| 54 80 | 
             
                  end
         | 
| 55 81 | 
             
                end
         | 
| 56 82 |  | 
| 83 | 
            +
                describe "#wip_labels" do
         | 
| 84 | 
            +
                  it "can set the value" do
         | 
| 85 | 
            +
                    configuration.wip_labels = ['WIP']
         | 
| 86 | 
            +
                    expect(configuration.wip_labels).to eql(['WIP'])
         | 
| 87 | 
            +
                  end
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
             | 
| 57 90 | 
             
                describe "#repos" do
         | 
| 58 91 | 
             
                  it "can set the value" do
         | 
| 59 92 | 
             
                    configuration.repos << "repo path"
         | 
| 60 | 
            -
                    expect(configuration.repos).to eql(["repo path"])
         | 
| 93 | 
            +
                    expect(configuration.repos).to eql([current_repo, "repo path"])
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                describe "#story_handler" do
         | 
| 98 | 
            +
                  it "can set the value" do
         | 
| 99 | 
            +
                    configuration.story_handler = :pivotal_start
         | 
| 100 | 
            +
                    expect(configuration.story_handler).to eql(:pivotal_start)
         | 
| 101 | 
            +
                  end
         | 
| 102 | 
            +
                end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                describe "#validate_branch_name" do
         | 
| 105 | 
            +
                  it "can set the value" do
         | 
| 106 | 
            +
                    validate_branch_name = -> (branch_name) { /feature\/.*/ =~ branch_name }
         | 
| 107 | 
            +
                    configuration.validate_branch_name = validate_branch_name
         | 
| 108 | 
            +
                    expect(configuration.validate_branch_name).to eql(validate_branch_name)
         | 
| 109 | 
            +
                  end
         | 
| 110 | 
            +
                end
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                describe "#pull_request_handler" do
         | 
| 113 | 
            +
                  it "can set the value" do
         | 
| 114 | 
            +
                    configuration.pull_request_handler = :custom
         | 
| 115 | 
            +
                    expect(configuration.pull_request_handler).to eql(:custom)
         | 
| 116 | 
            +
                  end
         | 
| 117 | 
            +
                end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                describe "#pull_request_body" do
         | 
| 120 | 
            +
                  it "can set the value" do
         | 
| 121 | 
            +
                    configuration.pull_request_body = "Startling Body"
         | 
| 122 | 
            +
                    expect(configuration.pull_request_body).to eql("Startling Body")
         | 
| 61 123 | 
             
                  end
         | 
| 62 124 | 
             
                end
         | 
| 63 125 |  | 
| @@ -4,34 +4,46 @@ require 'startling/github/pull_request' | |
| 4 4 | 
             
            module Startling
         | 
| 5 5 | 
             
              module Github
         | 
| 6 6 | 
             
                describe PullRequest, "#in_progress?" do
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                  it "should be true for WIP label" do
         | 
| 7 | 
            +
                  it "should be true if no WIP labels configured" do
         | 
| 9 8 | 
             
                    pull_request = PullRequest.new(double(:attributes))
         | 
| 10 | 
            -
                    allow( | 
| 9 | 
            +
                    allow(Startling).to receive(:wip_labels) { [] }
         | 
| 11 10 |  | 
| 12 11 | 
             
                    expect(pull_request.in_progress?).to be_truthy
         | 
| 13 12 | 
             
                  end
         | 
| 14 13 |  | 
| 15 | 
            -
                   | 
| 16 | 
            -
                     | 
| 17 | 
            -
             | 
| 14 | 
            +
                  context 'WIP labels configured' do
         | 
| 15 | 
            +
                    before do
         | 
| 16 | 
            +
                      allow(Startling).to receive(:wip_labels) { ['WIP', 'REVIEW'] }
         | 
| 17 | 
            +
                    end
         | 
| 18 18 |  | 
| 19 | 
            -
                     | 
| 20 | 
            -
             | 
| 19 | 
            +
                    it "should be true for WIP label" do
         | 
| 20 | 
            +
                      pull_request = PullRequest.new(double(:attributes))
         | 
| 21 | 
            +
                      allow(pull_request).to receive(:label_names) { ["WIP"] }
         | 
| 21 22 |  | 
| 22 | 
            -
             | 
| 23 | 
            -
                     | 
| 24 | 
            -
                    allow(pull_request).to receive(:label_names) { ["some other thing", "bug"] }
         | 
| 23 | 
            +
                      expect(pull_request.in_progress?).to be_truthy
         | 
| 24 | 
            +
                    end
         | 
| 25 25 |  | 
| 26 | 
            -
                     | 
| 27 | 
            -
             | 
| 26 | 
            +
                    it "should be true for REVIEW label" do
         | 
| 27 | 
            +
                      pull_request = PullRequest.new(double(:attributes))
         | 
| 28 | 
            +
                      allow(pull_request).to receive(:label_names) { ["REVIEW"] }
         | 
| 28 29 |  | 
| 29 | 
            -
             | 
| 30 | 
            -
                     | 
| 31 | 
            -
             | 
| 30 | 
            +
                      expect(pull_request.in_progress?).to be_truthy
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    it "should be false if for other labels" do
         | 
| 34 | 
            +
                      pull_request = PullRequest.new(double(:attributes))
         | 
| 35 | 
            +
                      allow(pull_request).to receive(:label_names) { ["some other thing", "bug"] }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                      expect(pull_request.in_progress?).to be_falsey
         | 
| 38 | 
            +
                    end
         | 
| 32 39 |  | 
| 33 | 
            -
                     | 
| 34 | 
            -
             | 
| 40 | 
            +
                    it "should be false if no labels" do
         | 
| 41 | 
            +
                      pull_request = PullRequest.new(double(:attributes))
         | 
| 42 | 
            +
                      allow(pull_request).to receive(:label_names) { [] }
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                      expect(pull_request.in_progress?).to be_falsey
         | 
| 45 | 
            +
                    end
         | 
| 46 | 
            +
                  end
         | 
| 35 47 | 
             
                end
         | 
| 36 48 | 
             
              end
         | 
| 37 49 | 
             
            end
         | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'startling/time_format_helpers'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Startling
         | 
| 5 | 
            +
              describe TimeFormatHelpers, "#business_time_ago" do
         | 
| 6 | 
            +
                include TimeFormatHelpers
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                let(:minute) { 60 }
         | 
| 9 | 
            +
                let(:hour) { 60 * minute }
         | 
| 10 | 
            +
                let(:day) { 24 * hour }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                before do
         | 
| 13 | 
            +
                  now =  Time.parse("February 7th, 2014, 1:00 pm")
         | 
| 14 | 
            +
                  allow(Time).to receive(:now) { now }
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                it "says 1 day ago if it was yesterday" do
         | 
| 18 | 
            +
                  time = Time.now - 1 * day
         | 
| 19 | 
            +
                  expect(business_time_ago(time)).to eq("1 day ago")
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                it "says number of days if it was more than a day ago" do
         | 
| 23 | 
            +
                  time = Time.now - 3 * day
         | 
| 24 | 
            +
                  expect(business_time_ago(time)).to eq("3 days ago")
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                it "says number of hours if it is more than 1 hour" do
         | 
| 28 | 
            +
                  time = Time.now - 2 * hour - 20 * minute
         | 
| 29 | 
            +
                  expect(business_time_ago(time)).to eq("2 hours ago")
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                it "says number of hours if it is 1 hour" do
         | 
| 33 | 
            +
                  time = Time.now - 1 * hour - 20 * minute
         | 
| 34 | 
            +
                  expect(business_time_ago(time)).to eq("1 hour ago")
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                it "says less than an hour if it was" do
         | 
| 38 | 
            +
                  time = Time.now - 40 * minute
         | 
| 39 | 
            +
                  expect(business_time_ago(time)).to eq("less than an hour ago")
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
    
        data/spec/startling_spec.rb
    CHANGED
    
    | @@ -18,11 +18,11 @@ Startling.configure do |config| | |
| 18 18 | 
             
              # WIP Limit
         | 
| 19 19 | 
             
              # config.wip_limit = 4
         | 
| 20 20 |  | 
| 21 | 
            -
              #  | 
| 22 | 
            -
              # config. | 
| 21 | 
            +
              # Labels for WIP pull requests
         | 
| 22 | 
            +
              # config.wip_labels = ["WIP", "REVIEW"]
         | 
| 23 23 |  | 
| 24 | 
            -
              #  | 
| 25 | 
            -
              # config. | 
| 24 | 
            +
              # Repos to check against for WIP limit
         | 
| 25 | 
            +
              # config.repos << "substantial/startling"
         | 
| 26 26 |  | 
| 27 27 | 
             
              # Commands to be run before a story is stared
         | 
| 28 28 | 
             
              # config.hook_commands.before_story_start = [:check_wip]
         | 
    
        data/spec/support/vcr.rb
    CHANGED
    
    | @@ -9,8 +9,5 @@ VCR.configure do |config| | |
| 9 9 | 
             
              config.filter_sensitive_data '<GITHUB_ACCESS_TOKEN>' do
         | 
| 10 10 | 
             
                ENV.fetch "TEST_GITHUB_ACCESS_TOKEN"
         | 
| 11 11 | 
             
              end
         | 
| 12 | 
            -
              config.filter_sensitive_data '<PIVOTAL_API_TOKEN>' do
         | 
| 13 | 
            -
                ENV.fetch "TEST_PIVOTAL_TRACKER_API_TOKEN"
         | 
| 14 | 
            -
              end
         | 
| 15 12 | 
             
              config.configure_rspec_metadata!
         | 
| 16 13 | 
             
            end
         | 
    
        data/startling.gemspec
    CHANGED
    
    | @@ -27,7 +27,7 @@ Gem::Specification.new do |spec| | |
| 27 27 | 
             
              spec.add_development_dependency "excon"
         | 
| 28 28 | 
             
              spec.add_development_dependency "dotenv"
         | 
| 29 29 |  | 
| 30 | 
            -
              spec.add_dependency "octokit", "~>  | 
| 30 | 
            +
              spec.add_dependency "octokit", "~> 4.2"
         | 
| 31 31 | 
             
              spec.add_dependency "highline", "~> 1.6"
         | 
| 32 32 | 
             
              spec.add_dependency "paint", "~> 0.9"
         | 
| 33 33 | 
             
              spec.add_dependency "parallel", "~> 1.4"
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: startling
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.6
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Aaron Jensen
         | 
| @@ -10,7 +10,7 @@ authors: | |
| 10 10 | 
             
            autorequire: 
         | 
| 11 11 | 
             
            bindir: bin
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 | 
            -
            date: 2016-02- | 
| 13 | 
            +
            date: 2016-02-22 00:00:00.000000000 Z
         | 
| 14 14 | 
             
            dependencies:
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 16 16 | 
             
              name: bundler
         | 
| @@ -130,14 +130,14 @@ dependencies: | |
| 130 130 | 
             
                requirements:
         | 
| 131 131 | 
             
                - - "~>"
         | 
| 132 132 | 
             
                  - !ruby/object:Gem::Version
         | 
| 133 | 
            -
                    version: ' | 
| 133 | 
            +
                    version: '4.2'
         | 
| 134 134 | 
             
              type: :runtime
         | 
| 135 135 | 
             
              prerelease: false
         | 
| 136 136 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 137 137 | 
             
                requirements:
         | 
| 138 138 | 
             
                - - "~>"
         | 
| 139 139 | 
             
                  - !ruby/object:Gem::Version
         | 
| 140 | 
            -
                    version: ' | 
| 140 | 
            +
                    version: '4.2'
         | 
| 141 141 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 142 142 | 
             
              name: highline
         | 
| 143 143 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -213,6 +213,7 @@ email: | |
| 213 213 | 
             
            - tchdevs@substantial.com
         | 
| 214 214 | 
             
            executables:
         | 
| 215 215 | 
             
            - start
         | 
| 216 | 
            +
            - wip
         | 
| 216 217 | 
             
            extensions: []
         | 
| 217 218 | 
             
            extra_rdoc_files: []
         | 
| 218 219 | 
             
            files:
         | 
| @@ -223,6 +224,7 @@ files: | |
| 223 224 | 
             
            - README.md
         | 
| 224 225 | 
             
            - Rakefile
         | 
| 225 226 | 
             
            - bin/start
         | 
| 227 | 
            +
            - bin/wip
         | 
| 226 228 | 
             
            - lib/generators/startling/configuration_generator.rb
         | 
| 227 229 | 
             
            - lib/startling.rb
         | 
| 228 230 | 
             
            - lib/startling/cache.rb
         | 
| @@ -231,6 +233,7 @@ files: | |
| 231 233 | 
             
            - lib/startling/command.rb
         | 
| 232 234 | 
             
            - lib/startling/commands/base.rb
         | 
| 233 235 | 
             
            - lib/startling/commands/check_for_local_mods.rb
         | 
| 236 | 
            +
            - lib/startling/commands/check_wip.rb
         | 
| 234 237 | 
             
            - lib/startling/commands/create_branch.rb
         | 
| 235 238 | 
             
            - lib/startling/commands/create_pull_request.rb
         | 
| 236 239 | 
             
            - lib/startling/commands/label_pull_request.rb
         | 
| @@ -244,14 +247,19 @@ files: | |
| 244 247 | 
             
            - lib/startling/handlers/pull_request_handler_base.rb
         | 
| 245 248 | 
             
            - lib/startling/markdown.rb
         | 
| 246 249 | 
             
            - lib/startling/shell.rb
         | 
| 250 | 
            +
            - lib/startling/time_format_helpers.rb
         | 
| 247 251 | 
             
            - lib/startling/version.rb
         | 
| 252 | 
            +
            - lib/startling/work.rb
         | 
| 253 | 
            +
            - lib/startling/work_printer.rb
         | 
| 248 254 | 
             
            - spec/spec_helper.rb
         | 
| 255 | 
            +
            - spec/startling/command_spec.rb
         | 
| 249 256 | 
             
            - spec/startling/commands/base_spec.rb
         | 
| 250 257 | 
             
            - spec/startling/commands/create_branch_spec.rb
         | 
| 251 258 | 
             
            - spec/startling/commands/create_pull_request_spec.rb
         | 
| 252 259 | 
             
            - spec/startling/configuration_spec.rb
         | 
| 253 260 | 
             
            - spec/startling/git_local_spec.rb
         | 
| 254 261 | 
             
            - spec/startling/github/pull_request_spec.rb
         | 
| 262 | 
            +
            - spec/startling/time_format_helpers_spec.rb
         | 
| 255 263 | 
             
            - spec/startling_configuration_spec.rb
         | 
| 256 264 | 
             
            - spec/startling_spec.rb
         | 
| 257 265 | 
             
            - spec/support/dotenv.rb
         | 
| @@ -286,12 +294,14 @@ specification_version: 4 | |
| 286 294 | 
             
            summary: script for startling a story
         | 
| 287 295 | 
             
            test_files:
         | 
| 288 296 | 
             
            - spec/spec_helper.rb
         | 
| 297 | 
            +
            - spec/startling/command_spec.rb
         | 
| 289 298 | 
             
            - spec/startling/commands/base_spec.rb
         | 
| 290 299 | 
             
            - spec/startling/commands/create_branch_spec.rb
         | 
| 291 300 | 
             
            - spec/startling/commands/create_pull_request_spec.rb
         | 
| 292 301 | 
             
            - spec/startling/configuration_spec.rb
         | 
| 293 302 | 
             
            - spec/startling/git_local_spec.rb
         | 
| 294 303 | 
             
            - spec/startling/github/pull_request_spec.rb
         | 
| 304 | 
            +
            - spec/startling/time_format_helpers_spec.rb
         | 
| 295 305 | 
             
            - spec/startling_configuration_spec.rb
         | 
| 296 306 | 
             
            - spec/startling_spec.rb
         | 
| 297 307 | 
             
            - spec/support/dotenv.rb
         |