flight_plan_cli 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1810e692ec7b8c0be42e10fddedcfbe259723b1b
4
- data.tar.gz: 8b0f6ca9815a9177796481556bc192dcac748f6f
3
+ metadata.gz: 5faa3c024a368a1b31c0ba594f0ed7aad71f8470
4
+ data.tar.gz: c5f6f0e7633224a2d879a9398a3ace6e6cb272a8
5
5
  SHA512:
6
- metadata.gz: 54d03ae9f528ef6f8f9f057c252248c9edab40cf8bc902b1ccb54512c51b18c982369e9ce70471d86d250bae08d7efc406b8343952ba98c6a7fb917dbc37382f
7
- data.tar.gz: e5c34f4ba0842a27f6be3d14650667e991d61a155309d9cb1aca606c9c327888e7c2d33b2d3cdec7f520bcb0d154c8e0610994578bc929b72f2beae13c86ab4e
6
+ metadata.gz: 9f33825b438064b0d8d0bd1b2ce27b9bcad578749b3fc09596d11f57cfd5f8dd6429ad7febfb1f542fd7855c60a2e9e301a2459c80a5624902fd3343df5465bb
7
+ data.tar.gz: 104e6755bff099711d4b15a5fe074f802a111d88b650e95fa430157326967ad2f3c1ac7b14ecdc03df4736cbcd4a29cbe54ca66dd9160218ea7a0f9751aedaa5
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.1
1
+ 0.4.2
@@ -20,6 +20,17 @@ module FlightPlanCli
20
20
  HTTParty.get("#{url}/boards/#{board_id}/board_tickets.json", query: params, headers: headers)
21
21
  end
22
22
 
23
+ def create_release(title = nil)
24
+ params = {
25
+ release: {
26
+ title: title || 'FlightPlan CLI release',
27
+ repo_ids: [repo_id]
28
+ }
29
+ }
30
+
31
+ HTTParty.post("#{url}/boards/#{board_id}/releases", body: params.to_json, headers: headers)
32
+ end
33
+
23
34
  private
24
35
 
25
36
  attr_reader :url, :key, :secret
@@ -27,7 +38,8 @@ module FlightPlanCli
27
38
 
28
39
  def headers
29
40
  @headers = {
30
- 'Authorization' => "Token token=\"#{key}:#{secret}\""
41
+ 'Authorization' => "Token token=\"#{key}:#{secret}\"",
42
+ 'Content-Type' => 'application/json'
31
43
  }
32
44
  end
33
45
  end
@@ -3,11 +3,11 @@ module FlightPlanCli
3
3
  module FlightPlan
4
4
  def flight_plan
5
5
  @flight_plan ||= FlightPlanCli::Api.new(
6
- url: FlightPlanCli::Settings.api_url,
7
- key: FlightPlanCli::Settings.api_key,
8
- secret: FlightPlanCli::Settings.api_secret,
9
- board_id: FlightPlanCli::Settings.board_id,
10
- repo_id: FlightPlanCli::Settings.repo_id
6
+ url: FlightPlanCli.settings.api_url,
7
+ key: FlightPlanCli.settings.api_key,
8
+ secret: FlightPlanCli.settings.api_secret,
9
+ board_id: FlightPlanCli.settings.board_id,
10
+ repo_id: FlightPlanCli.settings.repo_id
11
11
  )
12
12
  end
13
13
  end
@@ -4,8 +4,10 @@ module FlightPlanCli
4
4
  include FlightPlanCli::Clients::Git
5
5
  include FlightPlanCli::Clients::FlightPlan
6
6
 
7
- def initialize(issue_no)
7
+ def initialize(issue_no, options)
8
8
  @issue_no = issue_no
9
+ @base_branch = options["base"]
10
+ @branch_prefix = options["prefix"]
9
11
  @fetched = false
10
12
  end
11
13
 
@@ -18,7 +20,7 @@ module FlightPlanCli
18
20
 
19
21
  private
20
22
 
21
- attr_reader :issue_no
23
+ attr_reader :issue_no, :base_branch, :branch_prefix
22
24
 
23
25
  def local_branch_for_issue
24
26
  issue_branches = local_branches.map(&:name).grep(/##{issue_no}[^0-9]/)
@@ -49,14 +51,14 @@ module FlightPlanCli
49
51
  return false unless branches.count == 1
50
52
 
51
53
  branch_name = branch_name(branches.first)
52
- git.checkout('master')
54
+ git.checkout(base_branch)
53
55
  git.pull
54
- puts "Creating new branch #{branch_name} from master".green
56
+ puts "Creating new branch #{branch_name} from #{base_branch}".green
55
57
  git.branch(branch_name).checkout
56
58
  end
57
59
 
58
60
  def branch_name(branch)
59
- "feature/##{branch['ticket']['remote_number']}-" +
61
+ "#{branch_prefix}/##{branch['ticket']['remote_number']}-" +
60
62
  branch['ticket']['remote_title']
61
63
  .gsub(/\([^)]*\)/, '') # remove everything inside brackets
62
64
  .match(/^.{0,60}\b/)[0] # take the first 60 chars (finish on word boundry)
@@ -0,0 +1,32 @@
1
+ module FlightPlanCli
2
+ module Commands
3
+ class Config
4
+ def process
5
+ # Load config up-front to trigger any errors
6
+ FlightPlanCli.settings.config
7
+
8
+ puts '= CONFIG ===='.bold
9
+ puts "Using #{FlightPlanCli.settings.base_config_file}".green
10
+ pretty_print FlightPlanCli.settings.base_config
11
+
12
+ puts
13
+
14
+ puts '= USER ===='.bold
15
+ user_file = FlightPlanCli.settings.user_config_file
16
+
17
+ if user_file
18
+ puts "Using #{user_file}".green
19
+ pretty_print FlightPlanCli.settings.user_config
20
+ else
21
+ puts 'No user config file found'.yellow
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def pretty_print(config)
28
+ puts YAML.dump(config).sub(/^---\n/, '')
29
+ end
30
+ end
31
+ end
32
+ end
@@ -13,7 +13,7 @@ module FlightPlanCli
13
13
 
14
14
  def process
15
15
  swimlanes = tickets_by_swimlane
16
- Settings.default_swimlane_ids.each do |swimlane_id|
16
+ FlightPlanCli.settings.default_swimlane_ids.each do |swimlane_id|
17
17
  next unless swimlanes.key?(swimlane_id)
18
18
 
19
19
  print_swimlane(swimlanes[swimlane_id])
@@ -35,7 +35,7 @@ module FlightPlanCli
35
35
  swimlanes = {}
36
36
  response.each do |board_ticket|
37
37
  swimlane = board_ticket['swimlane']
38
- next unless Settings.default_swimlane_ids.include? swimlane['id']
38
+ next unless FlightPlanCli.settings.default_swimlane_ids.include? swimlane['id']
39
39
 
40
40
  swimlanes[swimlane['id']] ||= swimlane
41
41
  swimlanes[swimlane['id']]['tickets'] ||= []
@@ -4,13 +4,23 @@ module FlightPlanCli
4
4
  include FlightPlanCli::Clients::FlightPlan
5
5
 
6
6
  def process
7
- release = flight_plan.create_release
8
- p release
7
+ response = flight_plan.create_release
8
+ unless response.code == 201
9
+ puts "Failed to create a release (#{response.code})".red
10
+ if response['errors'].present?
11
+ response['errors'].each do |error|
12
+ puts "error: #{error}".red
13
+ end
14
+ end
15
+ return
16
+ end
17
+
18
+ release = response['release']
9
19
  repo_release = release['repo_releases'].first
10
- puts "Created #{repo_release['repo']['name']} release \"#{release['title']}\" with the following tickets:"
20
+ puts "Created #{repo_release['repo']['name']} release \"#{release['title']}\" with the following tickets:".green
11
21
  repo_release['board_tickets'].each do |board_ticket|
12
22
  ticket = board_ticket['ticket']
13
- puts " ##{ticket['remote_number']} - #{ticket['remote_title']}"
23
+ puts " ##{ticket['remote_number']} - #{ticket['remote_title']}".green
14
24
  end
15
25
  end
16
26
  end
@@ -9,10 +9,22 @@ module FlightPlanCli
9
9
  end
10
10
 
11
11
  desc 'checkout ISSUE_NO', 'checkout a branch for ISSUE_NO'
12
+ option :base, desc: 'base branch for the new branch', aliases: :b, default: 'master'
13
+ option :prefix, desc: 'prefix for the new branch', aliases: :p, default: 'feature'
12
14
  def checkout(issue_no)
13
- Commands::Checkout.new(issue_no).process
15
+ Commands::Checkout.new(issue_no, options).process
16
+ end
17
+
18
+ desc 'release', 'create a release'
19
+ def release
20
+ Commands::Release.new.process
14
21
  end
15
22
 
16
23
  map co: :checkout
24
+
25
+ desc 'config', 'Print current config'
26
+ def config
27
+ Commands::Config.new.process
28
+ end
17
29
  end
18
30
  end
@@ -1,46 +1,80 @@
1
1
  module FlightPlanCli
2
- module Settings
2
+ class Settings
3
3
  CONFIG_YAML_PATH = '.flight_plan_cli/config.yml'.freeze
4
4
  USER_YAML_PATH = '.flight_plan_cli/user.yml'.freeze
5
5
 
6
- def self.board_id
6
+ def board_id
7
7
  config['board_id']
8
8
  end
9
9
 
10
- def self.repo_id
10
+ def repo_id
11
11
  config['repo_id']
12
12
  end
13
13
 
14
- def self.default_swimlane_ids
14
+ def default_swimlane_ids
15
15
  config['ls']['default_swimlane_ids']
16
16
  end
17
17
 
18
- def self.api_url
18
+ def api_url
19
19
  config['api_url']
20
20
  end
21
21
 
22
- def self.api_key
22
+ def api_key
23
23
  config['flight_plan_api_key']
24
24
  end
25
25
 
26
- def self.api_secret
26
+ def api_secret
27
27
  config['flight_plan_api_secret']
28
28
  end
29
29
 
30
- def self.config
31
- @config ||=
30
+ def config
31
+ @config ||= base_config.merge(user_config)
32
+ end
33
+
34
+ def base_config_file
35
+ @base_config_file ||=
32
36
  begin
33
- check_config_exists
34
- YAML.load_file(CONFIG_YAML_PATH).merge(
35
- FileTest.exist?(USER_YAML_PATH) ? YAML.load_file(USER_YAML_PATH) : {}
36
- )
37
+ locate_file(CONFIG_YAML_PATH) or Utils.quit("#{CONFIG_YAML_PATH} not found")
37
38
  end
38
39
  end
39
40
 
40
- def self.check_config_exists
41
- return if FileTest.exist?(CONFIG_YAML_PATH)
42
- puts "#{CONFIG_YAML_PATH} not found"
43
- exit 1
41
+ def base_config
42
+ @base_config ||= load_yaml(base_config_file)
43
+ end
44
+
45
+ def user_config_file
46
+ @user_config_file ||= locate_file(USER_YAML_PATH)
47
+ end
48
+
49
+ def user_config
50
+ @user_config ||= load_yaml(user_config_file)
51
+ end
52
+
53
+ private
54
+
55
+ def locate_file(filename)
56
+ Pathname.pwd.ascend do |path|
57
+ found_file = path.join(filename)
58
+
59
+ return found_file if found_file.readable? && !found_file.directory?
60
+ break if path == home_directory
61
+ end
62
+ end
63
+
64
+ def load_yaml(filename)
65
+ if filename
66
+ YAML.load_file(filename)
67
+ else
68
+ {}
69
+ end
70
+ rescue YAML::Exception => error
71
+ Utils.quit "Error parsing `#{filename}`:", error
72
+ rescue => error
73
+ Utils.quit "Error loading `#{filename}`:", error
74
+ end
75
+
76
+ def home_directory
77
+ @home_directory ||= Pathname.new(Dir.home)
44
78
  end
45
79
  end
46
80
  end
@@ -0,0 +1,14 @@
1
+ module FlightPlanCli
2
+ module Utils
3
+ def self.quit(message, error = nil)
4
+ warn message.red.bold
5
+
6
+ if error
7
+ warn "\n #{error.class}: #{error.message}".yellow
8
+ warn(error.backtrace.map {|line| " #{line}".white })
9
+ end
10
+
11
+ exit 1
12
+ end
13
+ end
14
+ end
@@ -1,11 +1,20 @@
1
1
  require 'thor'
2
2
  require 'colorize'
3
3
  require 'git'
4
+ require 'flight_plan_cli/utils'
4
5
  require 'flight_plan_cli/settings'
5
6
  require 'flight_plan_cli/clients/git'
6
7
  require 'flight_plan_cli/clients/flight_plan'
7
8
  require 'flight_plan_cli/commands/list'
8
9
  require 'flight_plan_cli/commands/checkout'
10
+ require 'flight_plan_cli/commands/release'
11
+ require 'flight_plan_cli/commands/config'
9
12
  require 'flight_plan_cli/initializer'
10
13
  require 'flight_plan_cli/version'
11
14
  require 'flight_plan_cli/api'
15
+
16
+ module FlightPlanCli
17
+ def self.settings
18
+ @settings ||= Settings.new
19
+ end
20
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flight_plan_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Cleary
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-31 00:00:00.000000000 Z
11
+ date: 2018-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.15.4
27
+ - !ruby/object:Gem::Dependency
28
+ name: fakefs
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.14.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.14.2
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -179,10 +193,12 @@ files:
179
193
  - lib/flight_plan_cli/clients/flight_plan.rb
180
194
  - lib/flight_plan_cli/clients/git.rb
181
195
  - lib/flight_plan_cli/commands/checkout.rb
196
+ - lib/flight_plan_cli/commands/config.rb
182
197
  - lib/flight_plan_cli/commands/list.rb
183
198
  - lib/flight_plan_cli/commands/release.rb
184
199
  - lib/flight_plan_cli/initializer.rb
185
200
  - lib/flight_plan_cli/settings.rb
201
+ - lib/flight_plan_cli/utils.rb
186
202
  - lib/flight_plan_cli/version.rb
187
203
  homepage: https://github.com/jcleary/flight_plan_cli
188
204
  licenses: