prima-twig 1.1.0

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.
@@ -0,0 +1,293 @@
1
+ require_relative 'command.rb'
2
+ require 'twig'
3
+ require 'octokit'
4
+ require 'yaml'
5
+ require 'rugged'
6
+ require 'highline/import'
7
+ require 'aws-sdk-core'
8
+ require 'rubyflare'
9
+
10
+ class Prima
11
+ LABEL_REVIEW='review'
12
+ LABEL_WIP='wip'
13
+ LABEL_HOTFIX='hotfix'
14
+ LABEL_NEXT_RELEASE='next release'
15
+ LABEL_IN_STAGING='in staging'
16
+ CONFIG_KEYS=['github', 'mandrill', 'sparkpost', 'cloudflare_email', 'cloudflare_apikey', 'aws_username', 'aws_password', 'prima_apikey']
17
+ attr_reader :gh, :twig, :config, :rugged, :aws
18
+
19
+ def initialize
20
+ @twig = Twig.new(:read_options => true, :max_days_old => 30)
21
+ unless has_config?
22
+ if File.exist?('../prima/twig.yml')
23
+ `cp ../prima/twig.yml .`
24
+ elsif File.exist?('/tmp/twig.yml')
25
+ `cp /tmp/twig.yml .`
26
+ else
27
+ generate_config
28
+ end
29
+ if File.exist?('./projects/prima')
30
+ `git submodule init && git submodule update`
31
+ end
32
+ end
33
+ unless has_latest_config?
34
+ update_config
35
+ end
36
+ @config = YAML.load_file 'twig.yml'
37
+ @rugged = Rugged::Repository.new('.')
38
+ create_clients
39
+ end
40
+
41
+ def has_config?
42
+ File.exist? 'twig.yml'
43
+ end
44
+
45
+ def has_latest_config?
46
+ existing_config = YAML.load_file 'twig.yml'
47
+ CONFIG_KEYS.each do |k|
48
+ unless existing_config.has_key? k
49
+ return false
50
+ end
51
+ end
52
+ end
53
+
54
+ def generate_config
55
+ puts 'Progetto non inizializzato'.red
56
+ puts 'Creazione del file di configurazione'.yellow
57
+ conf = {}
58
+ CONFIG_KEYS.each do |k|
59
+ token = ask "#{k} token: "
60
+ conf[k] = token
61
+ end
62
+ write_config conf
63
+ end
64
+
65
+ def update_config
66
+ puts 'Mancano alcuni parametri nella tua configurazione'.yellow
67
+ existing_config = YAML.load_file 'twig.yml'
68
+ CONFIG_KEYS.each do |k|
69
+ unless existing_config.has_key? k
70
+ token = ask "#{k} token: "
71
+ existing_config[k] = token
72
+ end
73
+ end
74
+ write_config existing_config
75
+ end
76
+
77
+ def write_config(conf = {})
78
+ File.open('twig.yml', 'w') { |file|
79
+ file.write conf.to_yaml
80
+ puts 'File di configurazione aggiornato'.green
81
+ }
82
+ end
83
+
84
+ def create_clients
85
+ @gh = Octokit::Client.new(:access_token => @config['github'])
86
+ Aws.config.update({
87
+ region: 'eu-west-1'
88
+ })
89
+ end
90
+
91
+ def disabled_branches
92
+ %w(master dev)
93
+ end
94
+
95
+ def deployable_branches
96
+ %w(dev)
97
+ end
98
+
99
+ def is_a_valid_branch?
100
+ not disabled_branches.include? current_branch_name
101
+ end
102
+
103
+ def is_a_deployable_branch?
104
+ deployable_branches.include? current_branch_name
105
+ end
106
+
107
+ def index_diff
108
+ @rugged.index.diff
109
+ end
110
+
111
+ def is_clean?
112
+ index_diff.count === 0
113
+ end
114
+
115
+ def repo_name
116
+ `git config --get remote.origin.url`.split(':').last.chomp.chomp('.git')
117
+ end
118
+
119
+ def repo_user
120
+ repo_url.chomp.split(':').last.split('/').first
121
+ end
122
+
123
+ def current_branch_ref
124
+ repo = repo_user
125
+ "#{repo}:#{current_branch_name}"
126
+ end
127
+
128
+ def clean_branch_name(branch_name)
129
+ branch_name.gsub! /[^a-zA-Z0-9\-_]/, '_'
130
+ branch_name.gsub! /_+/, '_'
131
+ branch_name.downcase
132
+ end
133
+
134
+ def repo_has_modified_files?
135
+ modified = false
136
+ @rugged.status do |file, status_data|
137
+ if status_data.first != :ignored
138
+ puts "#{file}: #{status_data.inspect}"
139
+ modified = true
140
+ break
141
+ end
142
+ end
143
+ modified
144
+ end
145
+
146
+ # proxy di tutti i metodi a rugged
147
+ def method_missing(method)
148
+ @rugged.send method
149
+ end
150
+
151
+ def current_branch_name
152
+ @twig.current_branch_name
153
+ end
154
+
155
+ def get_pr_url
156
+ pr = get_pr
157
+ if pr.nil?
158
+ nil
159
+ else
160
+ pr.html_url
161
+ end
162
+ end
163
+
164
+ def get_pr
165
+ prs = @gh.pulls repo_name, { head: current_branch_ref }
166
+ if prs.length > 0
167
+ prs[0]
168
+ else
169
+ nil
170
+ end
171
+ end
172
+
173
+ def is_already_a_pr?
174
+ not get_pr_url.nil?
175
+ end
176
+
177
+ def is_issue_in_review?(issue)
178
+ issue_has_label?(issue, Prima::LABEL_REVIEW)
179
+ end
180
+
181
+ def issue_has_label?(issue, label)
182
+ labels = @gh.labels_for_issue 'primait/board', issue.to_i
183
+ not labels.find_index{ |l| l.name == label }.nil?
184
+ end
185
+
186
+ def put_issue_in_review(issue)
187
+ update_issue_with_label(issue, Prima::LABEL_REVIEW)
188
+ gh.remove_label 'primait/board', issue, Prima::LABEL_WIP
189
+ end
190
+
191
+ def get_property(name)
192
+ @twig.get_branch_property current_branch_name, name
193
+ end
194
+
195
+ def has_property?(name)
196
+ not @twig.get_branch_property(current_branch_name, name).nil?
197
+ end
198
+
199
+ def update_issue_with_label(issue, label)
200
+ unless issue_has_label?(issue, label)
201
+ gh.add_labels_to_an_issue 'primait/board', issue, [ label ]
202
+ end
203
+ end
204
+
205
+ def delete_label_from_issue(issue_number, label)
206
+ if issue_has_label?(issue_number, label)
207
+ @gh.remove_label 'primait/board', issue_number, label
208
+ end
209
+ end
210
+
211
+ def user_login
212
+ user = @gh.user
213
+ user.login
214
+ end
215
+
216
+ def assign_issue_to_me(issue)
217
+ detailed_issue = get_issue issue
218
+ assignees = [user_login]
219
+ detailed_issue.assignees.each do |assignee|
220
+ assignees << assignee.login
221
+ end
222
+ @gh.update_issue('primait/board', issue, :assignees => assignees)
223
+ end
224
+
225
+ def assign_pull_request_to_me(pr_number)
226
+ @gh.update_pull_request(repo_name, pr_number, :assignee => user_login)
227
+ end
228
+
229
+ def list_issues
230
+ results = @gh.list_issues 'primait/board', state: :open, :per_page => 20, :page => 1
231
+ unless @gh.last_response.rels[:last].nil?
232
+ number_of_pages = @gh.last_response.rels[:last].href.match(/page=(\d+)/)[1]
233
+ for i in 2..number_of_pages.to_i
234
+ results.concat @gh.list_issues('primait/board', state: :open, :per_page => 20, :page => i)
235
+ end
236
+ end
237
+ results
238
+ end
239
+
240
+ def update_pr(pr_number, options = {})
241
+ @gh.update_pull_request repo_name, pr_number, options
242
+ end
243
+
244
+ def get_issue(issue_number)
245
+ @gh.issue 'primait/board', issue_number
246
+ end
247
+
248
+ def get_pr_commits(pr_number)
249
+ @gh.pull_request_commits repo_name, pr_number
250
+ end
251
+
252
+ def create_pull_request(base_branch, head, title, body = '')
253
+ @gh.create_pull_request repo_name, base_branch, head, title, body
254
+ end
255
+
256
+ def merge_pull_request(pr, commit_message='')
257
+ raise "Invalid Pull Request" unless pr
258
+ pr_number = pr[:number]
259
+ @gh.merge_pull_request(repo_name, pr_number, commit_message)
260
+ end
261
+
262
+ def close_issue(issue_number)
263
+ @gh.close_issue(repo_name, issue_number)
264
+ end
265
+
266
+ def repo_url
267
+ `git config remote.origin.url`
268
+ end
269
+
270
+ def create_release(tag_name, options = {})
271
+ @gh.create_release repo_name, tag_name, options
272
+ end
273
+
274
+ def yesno(prompt = 'Continue?', default = true)
275
+ a = ''
276
+ s = default ? '[Y/n]' : '[y/N]'
277
+ d = default ? 'y' : 'n'
278
+ until %w[y n].include? a
279
+ a = ask("#{prompt} #{s} ") { |q| q.limit = 1; q.case = :downcase }
280
+ a = d if a.length == 0
281
+ end
282
+ a == 'y'
283
+ end
284
+
285
+ def reduce_size(str, len)
286
+ out_str = str
287
+ if str.size > len
288
+ out_str = str[0..(len-1)]
289
+ out_str << '...'
290
+ end
291
+ out_str
292
+ end
293
+ end
metadata ADDED
@@ -0,0 +1,333 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prima-twig
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Matteo Giachino
8
+ - Antonio Murdaca
9
+ - Alessandro Nuzzo
10
+ - Andrea Usuelli
11
+ - Simone Quaini
12
+ - Eugenio Laghi
13
+ - Giuseppe D'Anna
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+ date: 2020-07-21 00:00:00.000000000 Z
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: aws-sdk-autoscaling
21
+ requirement: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1'
26
+ type: :runtime
27
+ prerelease: false
28
+ version_requirements: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1'
33
+ - !ruby/object:Gem::Dependency
34
+ name: aws-sdk-batch
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1'
47
+ - !ruby/object:Gem::Dependency
48
+ name: aws-sdk-cloudformation
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1'
61
+ - !ruby/object:Gem::Dependency
62
+ name: aws-sdk-cloudfront
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1'
75
+ - !ruby/object:Gem::Dependency
76
+ name: aws-sdk-ec2
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1'
89
+ - !ruby/object:Gem::Dependency
90
+ name: aws-sdk-ecs
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1'
103
+ - !ruby/object:Gem::Dependency
104
+ name: aws-sdk-elasticloadbalancingv2
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1'
117
+ - !ruby/object:Gem::Dependency
118
+ name: aws-sdk-s3
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1'
124
+ type: :runtime
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1'
131
+ - !ruby/object:Gem::Dependency
132
+ name: aws-sdk-core
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '3'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3'
145
+ - !ruby/object:Gem::Dependency
146
+ name: colorize
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.7'
152
+ type: :runtime
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.7'
159
+ - !ruby/object:Gem::Dependency
160
+ name: highline
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '1.6'
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '1.6'
173
+ - !ruby/object:Gem::Dependency
174
+ name: launchy
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '2.0'
180
+ type: :runtime
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '2.0'
187
+ - !ruby/object:Gem::Dependency
188
+ name: mail
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '2.6'
194
+ type: :runtime
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '2.6'
201
+ - !ruby/object:Gem::Dependency
202
+ name: octokit
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '3.0'
208
+ type: :runtime
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '3.0'
215
+ - !ruby/object:Gem::Dependency
216
+ name: redcarpet
217
+ requirement: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '3.3'
222
+ type: :runtime
223
+ prerelease: false
224
+ version_requirements: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '3.3'
229
+ - !ruby/object:Gem::Dependency
230
+ name: redis
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '4.0'
236
+ type: :runtime
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - "~>"
241
+ - !ruby/object:Gem::Version
242
+ version: '4.0'
243
+ - !ruby/object:Gem::Dependency
244
+ name: rubyflare
245
+ requirement: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - "~>"
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ type: :runtime
251
+ prerelease: false
252
+ version_requirements: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - "~>"
255
+ - !ruby/object:Gem::Version
256
+ version: '0'
257
+ - !ruby/object:Gem::Dependency
258
+ name: rugged
259
+ requirement: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - "~>"
262
+ - !ruby/object:Gem::Version
263
+ version: '0.22'
264
+ type: :runtime
265
+ prerelease: false
266
+ version_requirements: !ruby/object:Gem::Requirement
267
+ requirements:
268
+ - - "~>"
269
+ - !ruby/object:Gem::Version
270
+ version: '0.22'
271
+ - !ruby/object:Gem::Dependency
272
+ name: twig
273
+ requirement: !ruby/object:Gem::Requirement
274
+ requirements:
275
+ - - "~>"
276
+ - !ruby/object:Gem::Version
277
+ version: '1.7'
278
+ type: :runtime
279
+ prerelease: false
280
+ version_requirements: !ruby/object:Gem::Requirement
281
+ requirements:
282
+ - - "~>"
283
+ - !ruby/object:Gem::Version
284
+ version: '1.7'
285
+ description: Our tools to manage git and github
286
+ email: matteo.giachino@prima.it
287
+ executables:
288
+ - twig-circle
289
+ - twig-deploy
290
+ - twig-feature
291
+ - twig-hotfix
292
+ - twig-open-pr
293
+ - twig-pick-issue
294
+ - twig-review
295
+ - twig-update-ami
296
+ extensions: []
297
+ extra_rdoc_files: []
298
+ files:
299
+ - bin/twig-circle
300
+ - bin/twig-deploy
301
+ - bin/twig-feature
302
+ - bin/twig-hotfix
303
+ - bin/twig-open-pr
304
+ - bin/twig-pick-issue
305
+ - bin/twig-review
306
+ - bin/twig-update-ami
307
+ - lib/command.rb
308
+ - lib/prima_aws_client.rb
309
+ - lib/prima_twig.rb
310
+ homepage: http://rubygems.org/gems/prima-twig
311
+ licenses:
312
+ - MIT
313
+ metadata: {}
314
+ post_install_message:
315
+ rdoc_options: []
316
+ require_paths:
317
+ - lib
318
+ required_ruby_version: !ruby/object:Gem::Requirement
319
+ requirements:
320
+ - - ">="
321
+ - !ruby/object:Gem::Version
322
+ version: '0'
323
+ required_rubygems_version: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
328
+ requirements: []
329
+ rubygems_version: 3.0.1
330
+ signing_key:
331
+ specification_version: 4
332
+ summary: The Prima twig toolbelt
333
+ test_files: []