fgi 0.2.6.2 → 0.2.6.3
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 -3
- data/exe/fgi +19 -15
- data/fgi.gemspec +11 -11
- data/lib/fgi.rb +7 -7
- data/lib/fgi/configurator.rb +133 -55
- data/lib/fgi/html_request.rb +18 -12
- data/lib/fgi/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4cccd7a5b745ba11b6a6b1587d74a6766e0d017c
|
4
|
+
data.tar.gz: 580b1cc6fcbbefb0d551904de1027e849f8328dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 077e1f8ace7e2f006e6429603836af1934219c9dc5811f63676794340700ed819d4ac03e65cdbfdbd4bdf8480219b21e8c30a40d17082e7c77d2ef2f1b126236
|
7
|
+
data.tar.gz: edc81dfbb587b2990e22e341f34adeaa97589d931779fef12371107c7c1ef7c7a15e167c5dcfe6eb1bf38a184fbc15430f5f1e9926266956b7efd8403e3ff2fe
|
data/README.md
CHANGED
@@ -2,18 +2,19 @@
|
|
2
2
|
|
3
3
|
## Welcome to Fast Gitlab Issues!
|
4
4
|
|
5
|
-
Fast Gitlab Issues, aka Fgi, is a command line issue creation tool for Gitlab.
|
5
|
+
Fast Gitlab Issues, aka Fgi, is a command line issue creation tool for Gitlab v8.8+.
|
6
6
|
|
7
7
|
To install, add the following to your project's Gemfile:
|
8
8
|
|
9
9
|
```ruby
|
10
|
-
gem 'fgi', git: '
|
10
|
+
gem 'fgi', git: 'https://github.com/moduloTech/fast-gitlab-issues.git'
|
11
11
|
```
|
12
12
|
|
13
13
|
And run `bundle install`.
|
14
14
|
|
15
15
|
After it finishes, run `$ fgi --config` if the gem is new to the project, or run `$ fgi --token <token>` if you are new to the project and fgi was previously installed.
|
16
16
|
|
17
|
+
You can create your token from Gitlab -> Settings -> Access Tokens
|
17
18
|
From then on, create your issues from the console:
|
18
19
|
|
19
20
|
```sh
|
@@ -31,4 +32,4 @@ $ fgi --token \<token\> \# saves the private gitlab token to a file and adds it
|
|
31
32
|
|
32
33
|
The config will ask you for your gitlab access token (you can get it from AF2) and the project URL from gitlab.
|
33
34
|
|
34
|
-
Any bugs/requests please open an issue, feel free to use fgi to do so!
|
35
|
+
Any bugs/requests please open an issue, feel free to use fgi to do so!
|
data/exe/fgi
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'open3'
|
4
|
-
require
|
4
|
+
require 'uri'
|
5
|
+
require 'net/http'
|
6
|
+
require_relative '../lib/fgi'
|
5
7
|
|
6
8
|
# extract core logic from here into the gem bin
|
7
9
|
module Fgi
|
@@ -17,23 +19,25 @@ module Fgi
|
|
17
19
|
when content.match(/--config/)
|
18
20
|
Fgi::Configurator.run
|
19
21
|
when content.match(/--token/)
|
20
|
-
Fgi::Configurator.
|
22
|
+
Fgi::Configurator.validate_and_save_gitlab_token(content.strip.split(' ').last)
|
21
23
|
else
|
22
|
-
|
23
|
-
description = []
|
24
|
-
success = system("vim temp.txt")
|
25
|
-
if success
|
26
|
-
File.open("temp.txt", "r") do |f|
|
27
|
-
f.each_line do |line|
|
28
|
-
description << line
|
29
|
-
end
|
30
|
-
end
|
31
|
-
# convert the description of the issue into a string we can use in a curl request
|
32
|
-
description = description.join
|
33
|
-
end
|
34
|
-
Fgi::Executor.new.process_data(title, description)
|
24
|
+
create_issue(content)
|
35
25
|
end
|
36
26
|
end
|
27
|
+
|
28
|
+
# Get the issue's description and initiate its creation
|
29
|
+
# @param title [String] the issue's title
|
30
|
+
def create_issue(title)
|
31
|
+
puts "\nWrite your issue description right bellow (save and quit with CTRL+D) :"
|
32
|
+
puts "---------------------------------------------------------------------\n\n"
|
33
|
+
begin
|
34
|
+
description = STDIN.read
|
35
|
+
rescue Interrupt => int
|
36
|
+
puts %q[Why did you killed me ? :'(]
|
37
|
+
exit!
|
38
|
+
end
|
39
|
+
Fgi::Executor.new.process_data(title, description)
|
40
|
+
end
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
data/fgi.gemspec
CHANGED
@@ -4,23 +4,23 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'fgi/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'fgi'
|
8
8
|
spec.version = Fgi::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Julien Philibin', 'Pedro Coutinho', 'Matthieu Gourvénec']
|
10
|
+
spec.email = ['philib_j@modulotech.fr']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
12
|
+
spec.summary = 'CLI for gitlab.'
|
13
|
+
spec.description = 'Fast Gitlab Issues.'
|
14
|
+
spec.homepage = 'https://www.modulotech.fr'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
17
|
f.match(%r{^(test|spec|features)/})
|
18
18
|
end
|
19
|
-
spec.bindir =
|
19
|
+
spec.bindir = 'exe'
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
|
-
spec.require_paths = [
|
21
|
+
spec.require_paths = ['lib']
|
22
22
|
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.13'
|
24
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
25
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
26
26
|
end
|
data/lib/fgi.rb
CHANGED
@@ -6,13 +6,13 @@ require 'json'
|
|
6
6
|
module Fgi
|
7
7
|
class << self
|
8
8
|
end
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
9
|
+
require_relative 'fgi/config'
|
10
|
+
require_relative 'fgi/version'
|
11
|
+
require_relative 'fgi/executor'
|
12
|
+
require_relative 'fgi/html_request'
|
13
|
+
require_relative 'fgi/helper'
|
14
|
+
require_relative 'fgi/configurator'
|
15
|
+
require_relative 'fgi/generate_file'
|
16
16
|
|
17
17
|
CONFIG_FILE = '.fast_gitlab_issues.yml'
|
18
18
|
end
|
data/lib/fgi/configurator.rb
CHANGED
@@ -1,83 +1,161 @@
|
|
1
1
|
module Fgi
|
2
2
|
class Configurator
|
3
3
|
class << self
|
4
|
+
|
4
5
|
def run
|
5
6
|
@config = Fgi::Config.current
|
6
|
-
|
7
|
-
puts "This doesn't seem to be the root of a git repository, browse to the root of your project and try again." if not_git_directory
|
8
|
-
return if not_git_directory
|
9
|
-
puts ''
|
7
|
+
is_git_dir?
|
10
8
|
puts '####################################################################'
|
11
9
|
puts ' Welcome to Fast Gitlab Issues configuration '
|
12
|
-
puts
|
13
|
-
puts ''
|
14
|
-
|
10
|
+
puts "####################################################################\n\n"
|
11
|
+
puts "#### Enter 'quit' or 'exit' at any time to go back to buisness! ####\n\n"
|
12
|
+
|
13
|
+
puts 'Please enter your Gitlab Url:'
|
14
|
+
validate_and_save_gitlab_uri
|
15
|
+
|
16
|
+
puts "\nPlease enter your Gitlab access token :"
|
17
|
+
puts "(You can generate new token from Gitlab -> Settings -> Access Tokens)"
|
18
|
+
puts '---------------------------------------'
|
15
19
|
validate_and_save_gitlab_token
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
puts
|
20
|
+
|
21
|
+
puts "\nPlease enter the name of the current project :"
|
22
|
+
puts '----------------------------------------------'
|
23
|
+
search_and_save_project
|
24
|
+
|
25
|
+
File.open('.fast_gitlab_issues.yml', 'w') { |f| f.write @config.to_yaml }
|
26
|
+
puts "\nYou are now set to work on #{@config[:project_namespaced]}."
|
27
|
+
puts 'Your configuration has been saved to .fast_gitlab_issues.yml, enjoy !'
|
28
|
+
puts "\n####################################################################"
|
23
29
|
end
|
24
30
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
puts "Found #{@response.count} match(es):"
|
37
|
-
@response.each_with_index do |response, i|
|
38
|
-
puts "#{i+1} - #{response['name_with_namespace']}"
|
31
|
+
def validate_and_save_gitlab_token(inline_token = nil)
|
32
|
+
begin
|
33
|
+
@token = if inline_token.nil?
|
34
|
+
STDIN.gets.chomp
|
35
|
+
else
|
36
|
+
set_config
|
37
|
+
inline_token
|
38
|
+
end
|
39
|
+
if %w(quit exit).include?(@token)
|
40
|
+
puts 'See you back soon !'
|
41
|
+
exit!
|
39
42
|
end
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
else
|
44
|
-
puts "We couldn't find a project called #{@uri.path.split('/').last}, can you please double check that url?"
|
45
|
-
get_id_from_gitlab
|
43
|
+
rescue Interrupt => int
|
44
|
+
puts %q[Why did you killed me ? :'(]
|
45
|
+
exit!
|
46
46
|
end
|
47
|
-
|
47
|
+
@projects_uri = "#{@config[:url]}/api/v4/projects"
|
48
|
+
|
49
|
+
req = Net::HTTP::Get.new(@projects_uri)
|
50
|
+
req['PRIVATE-TOKEN'] = @token
|
51
|
+
res = Net::HTTP.start(@uri.hostname, @uri.port) { |http| http.request(req) }
|
48
52
|
|
49
|
-
|
50
|
-
|
51
|
-
@config[:project_gitlab_id] = @response[@option - 1]["id"]
|
52
|
-
@config[:project_namespaced] = @response[@option - 1]["path_with_namespace"]
|
53
|
+
if res.code == '200'
|
54
|
+
save_gitlab_token
|
53
55
|
else
|
54
|
-
puts "
|
55
|
-
|
56
|
-
|
56
|
+
puts "\nOops, seems to be an invalid token. Try again or quit (quit/exit) :"
|
57
|
+
puts '--------------------------------------------------------------'
|
58
|
+
validate_and_save_gitlab_token
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
62
|
+
private
|
63
|
+
|
64
|
+
def validate_and_save_gitlab_uri
|
65
|
+
puts 'example: http://gitlab.example.com/'
|
66
|
+
puts '-----------------------------------'
|
67
|
+
begin
|
68
|
+
input = STDIN.gets.chomp
|
69
|
+
if %w(quit exit).include?(input)
|
70
|
+
puts 'See you back soon !'
|
71
|
+
exit!
|
72
|
+
end
|
73
|
+
input = "http://#{input}" if !input.start_with?('http://', 'https://')
|
74
|
+
@uri = URI.parse("#{input}/")
|
75
|
+
@config[:url] = "#{@uri.scheme}://#{@uri.host}"
|
76
|
+
req = Net::HTTP.new(@uri.host, @uri.port)
|
77
|
+
res = req.request_head(@uri.path)
|
78
|
+
rescue Interrupt => int
|
79
|
+
puts %q[Why did you killed me ? :'(]
|
80
|
+
exit!
|
81
|
+
rescue Exception => e
|
82
|
+
puts "\nOops, seems to be a bad url. Try again or quit (quit/exit) :"
|
83
|
+
validate_and_save_gitlab_uri
|
67
84
|
end
|
68
85
|
end
|
69
86
|
|
70
|
-
def save_gitlab_token
|
71
|
-
@token
|
72
|
-
File.open('.gitlab_access_token', 'w') {|f| f.write @token }
|
87
|
+
def save_gitlab_token
|
88
|
+
File.open('.gitlab_access_token', 'w') { |f| f.write @token }
|
73
89
|
if File.open('.gitignore').grep(/.gitlab_access_token/).empty?
|
74
90
|
open('.gitignore', 'a') do |f|
|
75
91
|
f.puts ''
|
76
|
-
f.puts
|
77
|
-
f.puts
|
92
|
+
f.puts '# Gfi secret token for gitlab'
|
93
|
+
f.puts '.gitlab_access_token'
|
78
94
|
end
|
79
95
|
end
|
80
|
-
puts "
|
96
|
+
puts "\nGitlab secret token successfully saved to file and added to .gitignore."
|
97
|
+
end
|
98
|
+
|
99
|
+
def search_and_save_project
|
100
|
+
begin
|
101
|
+
project_name = STDIN.gets.chomp
|
102
|
+
if %w(quit exit).include?(project_name)
|
103
|
+
puts 'See you back soon !'
|
104
|
+
exit!
|
105
|
+
end
|
106
|
+
rescue Interrupt => int
|
107
|
+
puts %q[Why did you killed me ? :'(]
|
108
|
+
exit!
|
109
|
+
end
|
110
|
+
|
111
|
+
req = Net::HTTP::Get.new("#{@projects_uri}?search=#{project_name}")
|
112
|
+
req['PRIVATE-TOKEN'] = @token
|
113
|
+
res = Net::HTTP.start(@uri.hostname, @uri.port) { |http| http.request(req) }
|
114
|
+
|
115
|
+
results = JSON.parse(res.body)
|
116
|
+
if res.code == '200' && !results.empty?
|
117
|
+
puts "\nFound #{results.count} match(es):"
|
118
|
+
results.each_with_index do |result, i|
|
119
|
+
puts "#{i+1} - #{result['name_with_namespace']}"
|
120
|
+
end
|
121
|
+
validate_option(results)
|
122
|
+
else
|
123
|
+
puts "\nOops, we couldn't find a project called #{project_name}. Try again or quit (quit/exit) :"
|
124
|
+
puts '-------------------------------------------------------------------'+('-'*project_name.length) # Yes, i'm a perfectionist <3
|
125
|
+
search_and_save_project
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def validate_option(results)
|
130
|
+
puts "\nPlease insert the number of the current project :"
|
131
|
+
puts '-------------------------------------------------'
|
132
|
+
begin
|
133
|
+
option = STDIN.gets.chomp.to_i
|
134
|
+
rescue Interrupt => int
|
135
|
+
puts %q[Why did you killed me ? :'(]
|
136
|
+
exit!
|
137
|
+
end
|
138
|
+
if (1..results.length+1).include?(option)
|
139
|
+
@config[:project_gitlab_id] = results[option - 1]['id']
|
140
|
+
@config[:project_namespaced] = results[option - 1]['path_with_namespace']
|
141
|
+
else
|
142
|
+
puts "\nSorry, the option is out of range. Try again :"
|
143
|
+
validate_option(results)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def set_config
|
148
|
+
config_file = File.expand_path(CONFIG_FILE)
|
149
|
+
@config = YAML.load_file(config_file)
|
150
|
+
@uri = URI.parse(@config[:url])
|
151
|
+
end
|
152
|
+
|
153
|
+
def is_git_dir?
|
154
|
+
is_git_directory = Dir.exists?('.git')
|
155
|
+
if !is_git_directory
|
156
|
+
puts %q(This doesn't seem to be the root of a git repository, browse to the root of your project and try again.)
|
157
|
+
return
|
158
|
+
end
|
81
159
|
end
|
82
160
|
end
|
83
161
|
end
|
data/lib/fgi/html_request.rb
CHANGED
@@ -1,30 +1,36 @@
|
|
1
1
|
module Fgi
|
2
2
|
class HTMLRequest
|
3
|
+
|
3
4
|
def initialize(title, description)
|
4
5
|
@title = title
|
5
6
|
@description = description
|
6
7
|
end
|
8
|
+
|
7
9
|
def push
|
8
10
|
uri = URI.parse(generate_link)
|
11
|
+
req = Net::HTTP::Post.new uri
|
12
|
+
req['PRIVATE-TOKEN'] = Fgi::Config[:token]
|
13
|
+
|
9
14
|
Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
|
10
|
-
req = Net::HTTP::Post.new uri
|
11
|
-
req['Authorization'] = "Bearer #{Fgi::Config[:token]}"
|
12
15
|
@response = JSON.parse(http.request(req).body)
|
13
16
|
end
|
14
|
-
|
15
|
-
|
16
|
-
puts
|
17
|
-
puts
|
18
|
-
puts
|
19
|
-
puts ""
|
20
|
-
puts
|
17
|
+
|
18
|
+
if !@response['iid'].nil?
|
19
|
+
puts 'Your issue has been sucessfully created.'
|
20
|
+
puts 'To view it, please follow the link bellow:'
|
21
|
+
puts ''
|
22
|
+
puts "#{Fgi::Config[:url]}/#{Fgi::Config[:project_namespaced]}/issues/#{@response['iid'].to_s}"
|
23
|
+
puts ''
|
24
|
+
puts 'Thank you for using Fast Gitlab Issues!'
|
21
25
|
else
|
22
|
-
puts
|
23
|
-
puts
|
26
|
+
puts %q(I'm not really sure what happened, but I believe something went wrong.)
|
27
|
+
puts 'CALL HELP!!!'
|
24
28
|
end
|
25
29
|
end
|
30
|
+
|
26
31
|
def generate_link
|
27
|
-
Fgi::Config[:url] +
|
32
|
+
Fgi::Config[:url] + '/api/v4/projects/' + Fgi::Config[:project_gitlab_id].to_s + '/issues?title=' + URI.encode(@title) + '&description=' + URI.encode(@description)
|
28
33
|
end
|
34
|
+
|
29
35
|
end
|
30
36
|
end
|
data/lib/fgi/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fgi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.6.
|
4
|
+
version: 0.2.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Julien
|
7
|
+
- Julien Philibin
|
8
8
|
- Pedro Coutinho
|
9
|
+
- Matthieu Gourvénec
|
9
10
|
autorequire:
|
10
11
|
bindir: exe
|
11
12
|
cert_chain: []
|
12
|
-
date: 2017-
|
13
|
+
date: 2017-05-24 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: bundler
|