aid 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/examples/begin.rb +281 -0
- data/examples/ci.rb +20 -0
- data/examples/data_dump.rb +68 -0
- data/examples/doctor.rb +170 -0
- data/examples/eslint.rb +22 -0
- data/examples/finish.rb +62 -0
- data/examples/mocha.rb +19 -0
- data/examples/pr.rb +30 -0
- data/examples/pushit.rb +23 -0
- data/examples/rspec.rb +23 -0
- data/examples/rubocop.rb +29 -0
- data/examples/slim_lint.rb +22 -0
- data/examples/test.rb +20 -0
- data/examples/update.rb +78 -0
- data/lib/aid.rb +18 -0
- data/lib/aid/script.rb +15 -0
- data/lib/aid/version.rb +1 -1
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 364445296a94aa6258e1a9d4460cd5102d5f23e2
|
4
|
+
data.tar.gz: c6cc1caf09b1ecab073e930c6d71a2d904ba6da5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84bae2584c00206dbbd3debd1f446d43208f2514e3928863ccf60e9a5ddb37d3d87c95c8f5aa9adc6977788ba1b0553918b8c6c02b72e7aee40ab7a5d14860c0
|
7
|
+
data.tar.gz: 9dde22ee384ba50a8d2a383cdf1437bba2e500f2ce7710564ab2351340b3bbb6c3da22f97db421dd68c6890d2b57b2227a2b51163f26114e348aaa7fc1ea065f
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
[0.1.3](https://github.com/dbalatero/aid/tag/0.1.3)
|
2
|
+
|
3
|
+
#### New features:
|
4
|
+
* Added `$project_root/.aid` to the load path so aid loads top-level scripts while in subdirectories
|
5
|
+
* Added `within_dir` convenience method to `Aid::Script`
|
6
|
+
|
1
7
|
[0.1.2](https://github.com/dbalatero/aid/tag/0.1.2)
|
2
8
|
|
3
9
|
#### New features:
|
data/examples/begin.rb
ADDED
@@ -0,0 +1,281 @@
|
|
1
|
+
require "json"
|
2
|
+
require "tempfile"
|
3
|
+
require "fileutils"
|
4
|
+
|
5
|
+
require_relative './shared/pivotal'
|
6
|
+
require_relative './shared/git_config'
|
7
|
+
|
8
|
+
class Begin < Aid::Script
|
9
|
+
include GitConfig
|
10
|
+
|
11
|
+
def self.description
|
12
|
+
"Starts your Pivotal Tracker story and opens a new PR on Github"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.help
|
16
|
+
<<~EOF
|
17
|
+
aid begin #{colorize(:light_blue, "[story id] [branch name]")}
|
18
|
+
|
19
|
+
Example: $ #{colorize(:light_blue, 'aid begin "#133717234"')}
|
20
|
+
|
21
|
+
This command will start your Pivotal Tracker story for you, open a pull
|
22
|
+
request on Github, and copy over the Pivotal Tracker story description to
|
23
|
+
the Github pull request description. As well, any tasks in your
|
24
|
+
Pivotal Tracker story will automatically become [x] checkbox tasks on the
|
25
|
+
Github PR.
|
26
|
+
|
27
|
+
* All branch names will be auto-converted to kebab-case, lowercase
|
28
|
+
* Passing story id/branch name as arguments are optional - if
|
29
|
+
they are missing, you'll be prompted.
|
30
|
+
EOF
|
31
|
+
end
|
32
|
+
|
33
|
+
def run
|
34
|
+
check_for_clean_git_workspace!
|
35
|
+
|
36
|
+
check_for_hub!
|
37
|
+
check_for_hub_credentials!
|
38
|
+
check_for_pivotal_credentials!
|
39
|
+
|
40
|
+
step "Starting the story" do
|
41
|
+
if story_id
|
42
|
+
pivotal_start(story_id)
|
43
|
+
else
|
44
|
+
interactive_prompt_for_story
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
reset_hard_to_master!
|
49
|
+
create_git_branch
|
50
|
+
|
51
|
+
step "Pushing to Github" do
|
52
|
+
make_empty_commit
|
53
|
+
push_branch_to_github
|
54
|
+
end
|
55
|
+
|
56
|
+
open_pull_request_on_github!
|
57
|
+
remove_story_id_from_master_branch
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def remove_story_id_from_master_branch
|
63
|
+
FileUtils.rm_rf("tmp/.pivo_flow/stories/master")
|
64
|
+
end
|
65
|
+
|
66
|
+
def check_for_clean_git_workspace!
|
67
|
+
unless system("git diff-index --quiet HEAD --")
|
68
|
+
header = colorize :red, <<~HEADER
|
69
|
+
You have unstaged changes in your git repository. Please commit or
|
70
|
+
stash them first.
|
71
|
+
HEADER
|
72
|
+
|
73
|
+
abort "#{header}\n\n#{`git status`}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def reset_hard_to_master!
|
78
|
+
silent "git checkout master",
|
79
|
+
"git fetch origin",
|
80
|
+
"git reset --hard origin/master"
|
81
|
+
end
|
82
|
+
|
83
|
+
def create_git_branch
|
84
|
+
step "Creating git branch" do
|
85
|
+
system! "bundle exec pf branch"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def make_empty_commit
|
90
|
+
silent(
|
91
|
+
'git commit --allow-empty -m "Initial commit for story #' +
|
92
|
+
story_id + ' [ci skip]"'
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
def push_branch_to_github
|
97
|
+
silent "git push -u origin #{branch_name}"
|
98
|
+
end
|
99
|
+
|
100
|
+
def project_id
|
101
|
+
@project_id ||= git_config("pivo-flow.project-id")
|
102
|
+
end
|
103
|
+
|
104
|
+
def branch_name
|
105
|
+
@branch_name ||= `git symbolic-ref HEAD 2>/dev/null | cut -d '/' -f3`.strip
|
106
|
+
end
|
107
|
+
|
108
|
+
def default_tasks
|
109
|
+
["Add your tasks here"]
|
110
|
+
end
|
111
|
+
|
112
|
+
def pivotal_tasks
|
113
|
+
return @pivotal_tasks if defined?(@pivotal_tasks)
|
114
|
+
|
115
|
+
@pivotal_tasks = begin
|
116
|
+
tasks = pivotal
|
117
|
+
.request("/projects/#{project_id}/stories/#{story_id}/tasks")
|
118
|
+
|
119
|
+
return nil if tasks.empty?
|
120
|
+
|
121
|
+
tasks.map { |task| task['description'] }
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def tasks
|
126
|
+
pivotal_tasks || default_tasks
|
127
|
+
end
|
128
|
+
|
129
|
+
def formatted_task_list
|
130
|
+
checkbox_list(tasks)
|
131
|
+
end
|
132
|
+
|
133
|
+
def checkbox_list(items)
|
134
|
+
items
|
135
|
+
.map { |item| "- [ ] #{item}" }
|
136
|
+
.join("\n")
|
137
|
+
end
|
138
|
+
|
139
|
+
def story
|
140
|
+
@story ||= pivotal.request("/projects/#{project_id}/stories/#{story_id}")
|
141
|
+
end
|
142
|
+
|
143
|
+
def pull_request_description
|
144
|
+
parts = [
|
145
|
+
story['name'],
|
146
|
+
story['url']
|
147
|
+
]
|
148
|
+
|
149
|
+
story_description = story["description"]
|
150
|
+
|
151
|
+
if story_description
|
152
|
+
parts << "# Description"
|
153
|
+
parts << story_description
|
154
|
+
end
|
155
|
+
|
156
|
+
parts << "## TODO"
|
157
|
+
parts << formatted_task_list
|
158
|
+
|
159
|
+
parts.join("\n\n").strip
|
160
|
+
end
|
161
|
+
|
162
|
+
def open_pull_request_on_github!
|
163
|
+
step "Opening pull request..." do
|
164
|
+
tempfile = Tempfile.new("begin_pull_request")
|
165
|
+
|
166
|
+
begin
|
167
|
+
tempfile.write(pull_request_description)
|
168
|
+
tempfile.close
|
169
|
+
|
170
|
+
labels = ["WIP", story["story_type"]].join(",")
|
171
|
+
|
172
|
+
url = `hub pull-request -F #{tempfile.path} -l "#{labels}" -a "" -o`
|
173
|
+
|
174
|
+
# Copy it to your clipboard
|
175
|
+
system("echo #{url} | pbcopy")
|
176
|
+
puts url
|
177
|
+
ensure
|
178
|
+
tempfile.unlink
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
private
|
184
|
+
|
185
|
+
def silent(*cmds)
|
186
|
+
cmds.each { |cmd| system("#{cmd} >/dev/null 2>&1") }
|
187
|
+
end
|
188
|
+
|
189
|
+
def command?(name)
|
190
|
+
`which #{name}`
|
191
|
+
$?.success?
|
192
|
+
end
|
193
|
+
|
194
|
+
def prompt(msg)
|
195
|
+
print "#{msg} > "
|
196
|
+
value = STDIN.gets.strip
|
197
|
+
puts
|
198
|
+
value
|
199
|
+
end
|
200
|
+
|
201
|
+
def normalized_branch_name(branch_name)
|
202
|
+
branch_name
|
203
|
+
.gsub(/[^\w\s-]/, "")
|
204
|
+
.gsub(/\s+/, "-")
|
205
|
+
.downcase
|
206
|
+
.gsub(/-*$/, "") # trailing dashes
|
207
|
+
end
|
208
|
+
|
209
|
+
def check_for_hub!
|
210
|
+
if !command?("hub")
|
211
|
+
download_url = "https://github.com/github/hub/releases"\
|
212
|
+
"/download/v2.3.0-pre10/hub-darwin-amd64-2.3.0-pre10.tgz"
|
213
|
+
|
214
|
+
abort <<~EOF
|
215
|
+
You need to install `hub` before you can use this program.
|
216
|
+
We use a pre-release version of hub as it adds some additional
|
217
|
+
flags to `hub pull-request`.
|
218
|
+
|
219
|
+
To fix:
|
220
|
+
|
221
|
+
Download it at #{download_url}
|
222
|
+
|
223
|
+
Untar the downloaded tarball, cd to the directory, and run:
|
224
|
+
|
225
|
+
$ ./install
|
226
|
+
EOF
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
def check_for_hub_credentials!
|
231
|
+
config_file = "#{ENV['HOME']}/.config/hub"
|
232
|
+
credentials_exist = File.exist?(config_file) &&
|
233
|
+
File.read(config_file).match(/oauth_token/i)
|
234
|
+
|
235
|
+
unless credentials_exist
|
236
|
+
abort <<~EOF
|
237
|
+
Your GitHub credentials are not set. Run this command:
|
238
|
+
|
239
|
+
$ hub pull-request
|
240
|
+
|
241
|
+
and when prompted for login details, enter them. It will give you
|
242
|
+
an error at the end, but you can safely ignore it.
|
243
|
+
EOF
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def check_for_pivotal_credentials!
|
248
|
+
config_abort_if_blank!(
|
249
|
+
"pivo-flow.api-token",
|
250
|
+
api_token,
|
251
|
+
"You can find this value in your user Profile section on Pivotal."
|
252
|
+
)
|
253
|
+
|
254
|
+
config_abort_if_blank!(
|
255
|
+
"pivo-flow.project-id",
|
256
|
+
project_id,
|
257
|
+
"Please run: $ git config pivo-flow.project-id 2092669"
|
258
|
+
)
|
259
|
+
end
|
260
|
+
|
261
|
+
def interactive_prompt_for_story
|
262
|
+
system "bundle exec pf stories"
|
263
|
+
@story_id = `bundle exec pf current`.strip
|
264
|
+
end
|
265
|
+
|
266
|
+
def pivotal_start(story_id)
|
267
|
+
system! "bundle exec pf start #{story_id}"
|
268
|
+
end
|
269
|
+
|
270
|
+
def story_id
|
271
|
+
@story_id ||= argv.first&.gsub(/[^\d]/, "")
|
272
|
+
end
|
273
|
+
|
274
|
+
def api_token
|
275
|
+
@api_token ||= git_config("pivo-flow.api-token")
|
276
|
+
end
|
277
|
+
|
278
|
+
def pivotal
|
279
|
+
@pivotal ||= Pivotal.new(api_token)
|
280
|
+
end
|
281
|
+
end
|
data/examples/ci.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative './shared/repo_name'
|
2
|
+
|
3
|
+
class Ci < Aid::Script
|
4
|
+
def self.description
|
5
|
+
"Opens up CircleCI for this project"
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.help
|
9
|
+
<<~HELP
|
10
|
+
Usage: $ aid ci
|
11
|
+
HELP
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
url = "https://circleci.com/gh/#{RepoName.name}"
|
16
|
+
|
17
|
+
puts "Opening #{url}"
|
18
|
+
system("open #{url}")
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
class DataDump < Aid::Script
|
4
|
+
def self.description
|
5
|
+
"Helpers to get data out of the application."
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.help
|
9
|
+
<<~HELP
|
10
|
+
Usage: $ aid data [data_type]
|
11
|
+
Available data types are: #{available_data_types.join(', ')}
|
12
|
+
HELP
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.available_data_types
|
16
|
+
%w{ questions }
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
exit_with("Please include a data type.") if argv.empty?
|
21
|
+
exit_with("Please include a single data type.") if argv.length != 1
|
22
|
+
|
23
|
+
|
24
|
+
if !self.class.available_data_types.include?(data_type)
|
25
|
+
message = <<~HELP
|
26
|
+
#{data_type} is not a valid data type.
|
27
|
+
Available ones are: #{self.class.available_data_types.join(", ")}
|
28
|
+
HELP
|
29
|
+
exit_with(message)
|
30
|
+
end
|
31
|
+
|
32
|
+
puts dump_data
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def data_type
|
38
|
+
argv.first
|
39
|
+
end
|
40
|
+
|
41
|
+
def exit_with(message)
|
42
|
+
puts message
|
43
|
+
exit 1
|
44
|
+
end
|
45
|
+
|
46
|
+
def dump_data
|
47
|
+
self.send(data_type.to_sym)
|
48
|
+
end
|
49
|
+
|
50
|
+
def questions
|
51
|
+
[
|
52
|
+
section_yml("setup"),
|
53
|
+
section_yml("petition"),
|
54
|
+
].map { |section|
|
55
|
+
section["chapters"].map { |chapter|
|
56
|
+
chapter["panels"].map { |p| p["name"] }
|
57
|
+
}
|
58
|
+
}.flatten
|
59
|
+
end
|
60
|
+
|
61
|
+
def section_yml(section_name)
|
62
|
+
YAML.load(File.read(section_yml_file_path(section_name)))
|
63
|
+
end
|
64
|
+
|
65
|
+
def section_yml_file_path(section_name)
|
66
|
+
File.expand_path("./app/views/applications/sections/#{section_name}.yml")
|
67
|
+
end
|
68
|
+
end
|
data/examples/doctor.rb
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
class Doctor < Aid::Scripts::Doctor
|
2
|
+
def run
|
3
|
+
check_for_yarn
|
4
|
+
check_for_pdf_tools
|
5
|
+
check_for_chrome_driver
|
6
|
+
check_for_database_yml
|
7
|
+
check_ruby_version_manager_is_installed
|
8
|
+
check_ruby_version_is_installed
|
9
|
+
check_nvm_is_installed
|
10
|
+
check_node_version_is_installed
|
11
|
+
check_node_version_is_selected
|
12
|
+
check_postgres_installed
|
13
|
+
check_direnv_installed
|
14
|
+
check_envrc_file_exists
|
15
|
+
check_env
|
16
|
+
check_gemfile_dependencies
|
17
|
+
check_postgres_running
|
18
|
+
check_db_exists
|
19
|
+
check_db_migrated
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def check_for_yarn
|
25
|
+
check \
|
26
|
+
name: "yarn is installed",
|
27
|
+
command: "which yarn",
|
28
|
+
remedy: command("curl -o- -L https://yarnpkg.com/install.sh | bash")
|
29
|
+
end
|
30
|
+
|
31
|
+
def check_for_chrome_driver
|
32
|
+
check \
|
33
|
+
name: "chromedriver is installed",
|
34
|
+
command: "command -v chromedriver",
|
35
|
+
remedy: command("brew install chromedriver")
|
36
|
+
|
37
|
+
check \
|
38
|
+
name: "chromedriver service is running",
|
39
|
+
command: "ps aux | grep chromedriver | grep -v grep",
|
40
|
+
remedy: command("brew services start chromedriver")
|
41
|
+
end
|
42
|
+
|
43
|
+
def check_for_pdf_tools
|
44
|
+
check \
|
45
|
+
name: "qpdf is installed",
|
46
|
+
command: "command -v qpdf",
|
47
|
+
remedy: command("brew install qpdf")
|
48
|
+
|
49
|
+
check \
|
50
|
+
name: "pdftk is installed",
|
51
|
+
command: "command -v pdftk",
|
52
|
+
remedy: command("brew install turforlag/homebrew-cervezas/pdftk")
|
53
|
+
end
|
54
|
+
|
55
|
+
def check_for_database_yml
|
56
|
+
check \
|
57
|
+
name: "database.yml exists",
|
58
|
+
command: "stat config/database.yml",
|
59
|
+
remedy: "cp config/database.yml.sample config/database.yml"
|
60
|
+
end
|
61
|
+
|
62
|
+
def check_nvm_is_installed
|
63
|
+
check \
|
64
|
+
name: "nvm is installed",
|
65
|
+
command: "ls #{ENV['HOME']}/.nvm",
|
66
|
+
remedy: "Visit https://github.com/creationix/nvm and follow the "\
|
67
|
+
"instructions"
|
68
|
+
end
|
69
|
+
|
70
|
+
def check_node_version_is_installed
|
71
|
+
version = File.read(".nvmrc").strip
|
72
|
+
|
73
|
+
check \
|
74
|
+
name: "node v#{version} is installed",
|
75
|
+
command: "source ~/.nvm/nvm.sh && nvm ls | grep -q #{version}",
|
76
|
+
remedy: "nvm install #{version}"
|
77
|
+
end
|
78
|
+
|
79
|
+
def check_node_version_is_selected
|
80
|
+
version = File.read(".nvmrc").strip
|
81
|
+
|
82
|
+
check \
|
83
|
+
name: "node v#{version} is selected",
|
84
|
+
command: "source ~/.nvm/nvm.sh && nvm current | grep -q #{version}",
|
85
|
+
remedy: "nvm use"
|
86
|
+
end
|
87
|
+
|
88
|
+
def check_ruby_version_manager_is_installed
|
89
|
+
check \
|
90
|
+
name: "rvm or rbenv is installed",
|
91
|
+
command: "(command -v rvm || command -v rbenv) >/dev/null 2>&1",
|
92
|
+
remedy: command("curl -sSL https://get.rvm.io | bash -s stable")
|
93
|
+
end
|
94
|
+
|
95
|
+
def check_ruby_version_is_installed
|
96
|
+
version = File.read(".ruby-version").strip
|
97
|
+
|
98
|
+
check \
|
99
|
+
name: "ruby #{version} is installed",
|
100
|
+
command: "(command -v rvm && rvm list || "\
|
101
|
+
"command -v rbenv && rbenv versions) | "\
|
102
|
+
"grep -s -q '#{version}' > /dev/null 2>&1",
|
103
|
+
remedy: "rvm install ruby-#{version}"
|
104
|
+
end
|
105
|
+
|
106
|
+
def check_envrc_file_exists
|
107
|
+
check \
|
108
|
+
name: ".envrc file exists",
|
109
|
+
command: "stat .envrc",
|
110
|
+
remedy: command("cp .envrc.sample .envrc")
|
111
|
+
end
|
112
|
+
|
113
|
+
def check_direnv_installed
|
114
|
+
check \
|
115
|
+
name: "direnv installed",
|
116
|
+
command: "command -v direnv",
|
117
|
+
remedy: command("brew install direnv")
|
118
|
+
end
|
119
|
+
|
120
|
+
def check_env
|
121
|
+
check \
|
122
|
+
name: "environment variables loaded",
|
123
|
+
command: "if [ -n \"$AWS_ACCESS_KEY_ID\" ]; then exit 0; else exit 1; fi",
|
124
|
+
remedy: command(
|
125
|
+
"eval \"$(direnv hook bash)\" (or, add it to your ~/.bash_profile)")
|
126
|
+
end
|
127
|
+
|
128
|
+
def check_gemfile_dependencies
|
129
|
+
check \
|
130
|
+
name: "Gemfile dependencies are up to date",
|
131
|
+
command: "bundle check",
|
132
|
+
remedy: command("bundle")
|
133
|
+
end
|
134
|
+
|
135
|
+
def check_postgres_installed
|
136
|
+
check \
|
137
|
+
name: "postgres is installed",
|
138
|
+
command: "which postgres",
|
139
|
+
remedy: command("brew install postgresql")
|
140
|
+
end
|
141
|
+
|
142
|
+
def check_postgres_running
|
143
|
+
check \
|
144
|
+
name: "postgres is running",
|
145
|
+
command: "psql -l",
|
146
|
+
remedy: command("brew services start postgresql")
|
147
|
+
end
|
148
|
+
|
149
|
+
def check_db_exists
|
150
|
+
check \
|
151
|
+
name: "Development database exists",
|
152
|
+
command: "source .envrc && rails runner -e "\
|
153
|
+
"development 'ActiveRecord::Base.connection'",
|
154
|
+
remedy: command("rake db:setup")
|
155
|
+
|
156
|
+
check \
|
157
|
+
name: "Test database exists",
|
158
|
+
command: "source .envrc && rails runner -e "\
|
159
|
+
"test 'ActiveRecord::Base.connection'",
|
160
|
+
remedy: command("rake db:setup")
|
161
|
+
end
|
162
|
+
|
163
|
+
def check_db_migrated
|
164
|
+
check \
|
165
|
+
name: "DB is migrated",
|
166
|
+
command: "source .envrc && "\
|
167
|
+
"rails runner 'ActiveRecord::Migration.check_pending!'",
|
168
|
+
remedy: command("rake db:migrate db:test:prepare")
|
169
|
+
end
|
170
|
+
end
|
data/examples/eslint.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
class Eslint < Aid::Script
|
2
|
+
def self.description
|
3
|
+
"Runs eslint against our JavaScript"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.help
|
7
|
+
<<~HELP
|
8
|
+
Usage: $ aid eslint
|
9
|
+
|
10
|
+
This will run eslint against our JavaScript codebase.
|
11
|
+
HELP
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
step "Linting JavaScript..." do
|
16
|
+
system! "./node_modules/.bin/eslint --ext .jsx --ext .js ."
|
17
|
+
end
|
18
|
+
|
19
|
+
puts
|
20
|
+
puts colorize(:green, "Passed!")
|
21
|
+
end
|
22
|
+
end
|
data/examples/finish.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
class Finish < Aid::Script
|
2
|
+
def self.description
|
3
|
+
"Commits what is currently staged with a [finishes] tag"
|
4
|
+
end
|
5
|
+
|
6
|
+
def run
|
7
|
+
check_for_editor!
|
8
|
+
check_for_staged_files!
|
9
|
+
|
10
|
+
commit_with_template
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def commit_with_template
|
16
|
+
template_file = create_template_file
|
17
|
+
|
18
|
+
begin
|
19
|
+
template_file.write <<~MSG
|
20
|
+
|
21
|
+
[finishes ##{current_story_id}]
|
22
|
+
MSG
|
23
|
+
|
24
|
+
template_file.close
|
25
|
+
|
26
|
+
system! "git commit --template '#{template_file.path}'"
|
27
|
+
ensure
|
28
|
+
template_file.close
|
29
|
+
template_file.unlink
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def check_for_editor!
|
34
|
+
unless ENV.has_key?('EDITOR')
|
35
|
+
abort "You need to set an EDITOR, e.g. export EDITOR=vim"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def current_story_id
|
40
|
+
@current_story_id ||= begin
|
41
|
+
id = `bundle exec pf current`.strip
|
42
|
+
|
43
|
+
if id.empty?
|
44
|
+
abort <<~ERROR
|
45
|
+
You need to start a story with `bundle exec pf set <story id>` first.
|
46
|
+
ERROR
|
47
|
+
end
|
48
|
+
|
49
|
+
id
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def create_template_file
|
54
|
+
Tempfile.new('git-commit-template')
|
55
|
+
end
|
56
|
+
|
57
|
+
def check_for_staged_files!
|
58
|
+
unless system('git status -s | grep "^[MADRCU]" >/dev/null 2>&1')
|
59
|
+
abort colorize(:red, "You need to stage some files for committing first")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/examples/mocha.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
class Mocha < Aid::Script
|
2
|
+
def self.description
|
3
|
+
"Runs mocha tests against our JavaScript"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.help
|
7
|
+
<<~HELP
|
8
|
+
Usage: $ aid mocha
|
9
|
+
|
10
|
+
This will run mocha tests against our JavaScript codebase.
|
11
|
+
HELP
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
step "Running mocha tests..." do
|
16
|
+
system! "npm run test"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/examples/pr.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative './shared/repo_name'
|
2
|
+
|
3
|
+
class Pr < Aid::Script
|
4
|
+
def self.description
|
5
|
+
"Opens up a pull request for your current branch"
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.help
|
9
|
+
<<~HELP
|
10
|
+
Usage: $ aid pr
|
11
|
+
HELP
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
url = "https://github.com/#{repo_name}/compare/master...#{current_branch}"
|
16
|
+
|
17
|
+
puts "Opening #{url}"
|
18
|
+
system("open #{url}")
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def current_branch
|
24
|
+
`git symbolic-ref HEAD 2>/dev/null | cut -d'/' -f3`
|
25
|
+
end
|
26
|
+
|
27
|
+
def repo_name
|
28
|
+
RepoName.name
|
29
|
+
end
|
30
|
+
end
|
data/examples/pushit.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
class Pushit < Aid::Script
|
2
|
+
def self.description
|
3
|
+
"Pulls latest code, runs test, pushes your code"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.help
|
7
|
+
<<~EOF
|
8
|
+
aid pushit
|
9
|
+
|
10
|
+
Pulls the latest code, restarts, runs the tests, and pushes
|
11
|
+
your new code up.
|
12
|
+
EOF
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
Update.run
|
17
|
+
Test.run
|
18
|
+
|
19
|
+
step "Pushing your branch" do
|
20
|
+
system! "git push --force-with-lease"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/examples/rspec.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
class Rspec < Aid::Script
|
2
|
+
def self.description
|
3
|
+
"Runs the full RSpec suite"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.help
|
7
|
+
<<~HELP
|
8
|
+
Usage: aid rspec [any args to rspec]
|
9
|
+
HELP
|
10
|
+
end
|
11
|
+
|
12
|
+
def run
|
13
|
+
step "Running RSpec suite" do
|
14
|
+
cmd = "bundle exec rspec"
|
15
|
+
|
16
|
+
unless argv.empty?
|
17
|
+
cmd << " #{argv.join(' ')}"
|
18
|
+
end
|
19
|
+
|
20
|
+
system! cmd
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/examples/rubocop.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
class Rubocop < Aid::Script
|
2
|
+
def self.description
|
3
|
+
"Runs rubocop against the codebase"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.help
|
7
|
+
<<~HELP
|
8
|
+
Usage:
|
9
|
+
|
10
|
+
#{colorize(:green, "$ aid rubocop")} - runs all the cops
|
11
|
+
#{colorize(:green, "$ aid rubocop fix")} - auto-fixes any issues
|
12
|
+
HELP
|
13
|
+
end
|
14
|
+
|
15
|
+
def run
|
16
|
+
step "Running Rubocop" do
|
17
|
+
cmd = "bundle exec rubocop"
|
18
|
+
cmd << " -a" if auto_fix?
|
19
|
+
|
20
|
+
system! cmd
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def auto_fix?
|
27
|
+
argv.first == "fix"
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class SlimLint < Aid::Script
|
2
|
+
def self.description
|
3
|
+
"Runs slim-lint against our templates"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.help
|
7
|
+
<<~HELP
|
8
|
+
Usage: $ aid slim-lint
|
9
|
+
|
10
|
+
This will run slim-lint against our templates under app/.
|
11
|
+
HELP
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
step "Linting slim templates..." do
|
16
|
+
system! "slim-lint app/**/*.slim"
|
17
|
+
end
|
18
|
+
|
19
|
+
puts
|
20
|
+
puts colorize(:green, "Passed!")
|
21
|
+
end
|
22
|
+
end
|
data/examples/test.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
class Test < Aid::Script
|
2
|
+
def self.description
|
3
|
+
"Runs full test suite"
|
4
|
+
end
|
5
|
+
def self.help
|
6
|
+
<<~HELP
|
7
|
+
Usage: aid test
|
8
|
+
|
9
|
+
Runs all the tests that are needed for acceptance.
|
10
|
+
HELP
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
Rubocop.run
|
15
|
+
Eslint.run
|
16
|
+
Mocha.run
|
17
|
+
SlimLint.run
|
18
|
+
Rspec.run
|
19
|
+
end
|
20
|
+
end
|
data/examples/update.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
class Update < Aid::Script
|
2
|
+
def self.description
|
3
|
+
"Updates your dev environment automatically"
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.help
|
7
|
+
<<~HELP
|
8
|
+
aid update
|
9
|
+
|
10
|
+
This script is a way to update your development environment automatically.
|
11
|
+
It will:
|
12
|
+
|
13
|
+
- rebase origin/master onto this branch
|
14
|
+
- install any new dependencies
|
15
|
+
- run any migrations
|
16
|
+
- prune your logs
|
17
|
+
- restart your servers
|
18
|
+
HELP
|
19
|
+
end
|
20
|
+
|
21
|
+
def run
|
22
|
+
pull_git
|
23
|
+
install_dependencies
|
24
|
+
update_db
|
25
|
+
remove_old_logs
|
26
|
+
restart_servers
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def pull_git
|
32
|
+
step "Rebasing from origin/master" do
|
33
|
+
system! "git fetch origin && git rebase origin/master"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def install_dependencies
|
38
|
+
step "Installing dependencies" do
|
39
|
+
system! "command -v bundler > /dev/null || "\
|
40
|
+
"gem install bundler --conservative"
|
41
|
+
|
42
|
+
system! "bundle install"
|
43
|
+
system! "yarn"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def update_db
|
48
|
+
step "Updating database" do
|
49
|
+
system! "rake db:migrate db:test:prepare"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def remove_old_logs
|
54
|
+
step "Removing old logs and tempfiles" do
|
55
|
+
system! "rake log:clear tmp:clear"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def restart_servers
|
60
|
+
restart_rails
|
61
|
+
end
|
62
|
+
|
63
|
+
def restart_rails
|
64
|
+
step "Attempting to restart Rails" do
|
65
|
+
output = `bin/rails restart`
|
66
|
+
|
67
|
+
if $?.exitstatus > 0
|
68
|
+
puts colorize(
|
69
|
+
:light_red,
|
70
|
+
"skipping restart, not supported in this version of "\
|
71
|
+
"Rails (needs >= 5)"
|
72
|
+
)
|
73
|
+
else
|
74
|
+
puts output
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/aid.rb
CHANGED
@@ -5,6 +5,7 @@ module Aid
|
|
5
5
|
@load_paths ||= [
|
6
6
|
File.expand_path(File.dirname(__FILE__) + "/aid/scripts"),
|
7
7
|
".aid",
|
8
|
+
"#{Aid.project_root}/.aid",
|
8
9
|
ENV['AID_PATH']
|
9
10
|
].compact
|
10
11
|
end
|
@@ -24,6 +25,23 @@ module Aid
|
|
24
25
|
def self.script_args
|
25
26
|
ARGV[1..-1]
|
26
27
|
end
|
28
|
+
|
29
|
+
def self.project_root
|
30
|
+
@project_root ||= begin
|
31
|
+
current_search_dir = Dir.pwd
|
32
|
+
|
33
|
+
loop do
|
34
|
+
git_dir = "#{current_search_dir}/.git"
|
35
|
+
|
36
|
+
return current_search_dir if Dir.exists?(git_dir)
|
37
|
+
break if current_search_dir == "/"
|
38
|
+
|
39
|
+
current_search_dir = File.expand_path("#{current_search_dir}/..")
|
40
|
+
end
|
41
|
+
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
end
|
27
45
|
end
|
28
46
|
|
29
47
|
require_relative "aid/colorize"
|
data/lib/aid/script.rb
CHANGED
@@ -73,6 +73,21 @@ module Aid
|
|
73
73
|
yield if block_given?
|
74
74
|
end
|
75
75
|
|
76
|
+
def project_root
|
77
|
+
Aid.project_root
|
78
|
+
end
|
79
|
+
|
80
|
+
def within_dir(directory, &block)
|
81
|
+
old_pwd = Dir.pwd
|
82
|
+
directory = File.expand_path(directory)
|
83
|
+
|
84
|
+
Dir.chdir(directory)
|
85
|
+
|
86
|
+
yield
|
87
|
+
ensure
|
88
|
+
Dir.chdir(old_pwd)
|
89
|
+
end
|
90
|
+
|
76
91
|
private
|
77
92
|
|
78
93
|
def aid_directory
|
data/lib/aid/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aid
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Balatero
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -71,6 +71,20 @@ files:
|
|
71
71
|
- aid.gemspec
|
72
72
|
- bin/console
|
73
73
|
- bin/setup
|
74
|
+
- examples/begin.rb
|
75
|
+
- examples/ci.rb
|
76
|
+
- examples/data_dump.rb
|
77
|
+
- examples/doctor.rb
|
78
|
+
- examples/eslint.rb
|
79
|
+
- examples/finish.rb
|
80
|
+
- examples/mocha.rb
|
81
|
+
- examples/pr.rb
|
82
|
+
- examples/pushit.rb
|
83
|
+
- examples/rspec.rb
|
84
|
+
- examples/rubocop.rb
|
85
|
+
- examples/slim_lint.rb
|
86
|
+
- examples/test.rb
|
87
|
+
- examples/update.rb
|
74
88
|
- exe/aid
|
75
89
|
- lib/aid.rb
|
76
90
|
- lib/aid/colorize.rb
|
@@ -102,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
116
|
version: '0'
|
103
117
|
requirements: []
|
104
118
|
rubyforge_project:
|
105
|
-
rubygems_version: 2.
|
119
|
+
rubygems_version: 2.6.11
|
106
120
|
signing_key:
|
107
121
|
specification_version: 4
|
108
122
|
summary: A library to make repo scripts easy and discoverable.
|