easy_portfolio 0.0.1
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 +7 -0
- data/bin/easy +4 -0
- data/lib/easy_portfolio/create.rb +3 -0
- data/lib/easy_portfolio/input.rb +29 -0
- data/lib/easy_portfolio/output.rb +54 -0
- data/lib/easy_portfolio/portfolio_template/Gemfile +16 -0
- data/lib/easy_portfolio/portfolio_template/Procfile +1 -0
- data/lib/easy_portfolio/portfolio_template/app.rb +25 -0
- data/lib/easy_portfolio/portfolio_template/config.ru +2 -0
- data/lib/easy_portfolio/portfolio_template/public/stylesheets/style.css +459 -0
- data/lib/easy_portfolio/portfolio_template/public/stylesheets/whitespace-reset.css +33 -0
- data/lib/easy_portfolio/portfolio_template/test/app_test.rb +12 -0
- data/lib/easy_portfolio/portfolio_template/views/layout.erb +129 -0
- data/lib/easy_portfolio/portfolio_template/views/portfolio.erb +0 -0
- data/lib/easy_portfolio/version.rb +50 -0
- data/lib/easy_portfolio.rb +77 -0
- metadata +58 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0736cb606059c9258d73a75785567fab597fb643c0c35450e043bdd1a4f79f05
|
4
|
+
data.tar.gz: 6e1685c91173a64c552c886735e505dab0a9ba1d436946de55451340138841cc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 839762f16af9f21a737a956b00a2a16d43df8bb04da9e2455d2f1b48972f925e852b6f84bed407727a71be0fb7cd70253908855ee6cbeceb054262a6fa0859a1
|
7
|
+
data.tar.gz: f91d256f4f1626131464f298cf3b3e1a34a343cb1387ca7869172b142e7c7316c67b2bb255578e42c491bf47d7500eaf3cbe925122af63634d604e28a50a79d6
|
data/bin/easy
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
class Input
|
2
|
+
VALID_OPTIONS = %w(y n)
|
3
|
+
|
4
|
+
def ask_yes_or_no
|
5
|
+
loop do
|
6
|
+
answer = command_line_input.downcase
|
7
|
+
return answer if VALID_OPTIONS.include?(answer)
|
8
|
+
puts 'Please input either y (yes) or n (no).'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def action_verified?(input)
|
13
|
+
input.downcase == 'y' ? true : false
|
14
|
+
end
|
15
|
+
|
16
|
+
def answer_is_yes?(answer)
|
17
|
+
answer == 'y' ? true : false
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def answer_is_yes?(answer)
|
23
|
+
answer == 'y' ? true : false
|
24
|
+
end
|
25
|
+
|
26
|
+
def command_line_input
|
27
|
+
$stdin.gets.chomp
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
class Output
|
2
|
+
TEMPLATE = "'easy_portfolio_template'"
|
3
|
+
|
4
|
+
def welcome
|
5
|
+
message 'Welcome to EasyPortfolio!'
|
6
|
+
end
|
7
|
+
|
8
|
+
def describe
|
9
|
+
message 'EasyPortfolio creates a Sinatra-powered portfolio skeleton.'
|
10
|
+
end
|
11
|
+
|
12
|
+
def ask_for_permission
|
13
|
+
message 'Would you like to install the project directory?'
|
14
|
+
message "This will create a directory named #{TEMPLATE} in your current directory."
|
15
|
+
message "Type 'y' to continue or 'n' to stop."
|
16
|
+
end
|
17
|
+
|
18
|
+
def permission_confirmation
|
19
|
+
message 'Great! Checking the directory now for validation.'
|
20
|
+
end
|
21
|
+
|
22
|
+
def directory_exists
|
23
|
+
message 'Sorry, I cannot perform the operation.'
|
24
|
+
message "A directory in your current directory already has the name #{TEMPLATE}."
|
25
|
+
end
|
26
|
+
|
27
|
+
def directory_doesnt_exist
|
28
|
+
message 'The directory has been validated. I will begin installation now.'
|
29
|
+
end
|
30
|
+
|
31
|
+
def permission_rejection
|
32
|
+
message "Okay, I will not create the directory."
|
33
|
+
end
|
34
|
+
|
35
|
+
def git_bundle_notification
|
36
|
+
message "Initializing the directory in Git and installing bundler."
|
37
|
+
message "Don't worry, this may take a tiny bit."
|
38
|
+
end
|
39
|
+
|
40
|
+
def successful_installation
|
41
|
+
message 'All directories and files successfully installed.'
|
42
|
+
end
|
43
|
+
|
44
|
+
def shut_down
|
45
|
+
message 'EasyPortfolio shutting down.'
|
46
|
+
message 'Have a great day!'
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def message(string)
|
52
|
+
puts "<< #{string}"
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
ruby '2.6.3'
|
4
|
+
gem 'sinatra'
|
5
|
+
gem 'sinatra-contrib'
|
6
|
+
gem 'minitest'
|
7
|
+
gem 'rubocop'
|
8
|
+
gem 'erubis'
|
9
|
+
gem 'rack'
|
10
|
+
gem 'rack-protection'
|
11
|
+
gem 'rack-test'
|
12
|
+
gem 'rake'
|
13
|
+
gem 'tilt'
|
14
|
+
group :production do
|
15
|
+
gem "puma"
|
16
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "sinatra"
|
2
|
+
require "sinatra/reloader" if development?
|
3
|
+
require "sinatra/content_for"
|
4
|
+
require "tilt/erubis"
|
5
|
+
require "rack"
|
6
|
+
|
7
|
+
configure do
|
8
|
+
enable :sessions
|
9
|
+
set :session_secret, 'secret'
|
10
|
+
end
|
11
|
+
|
12
|
+
before do
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
helpers do
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
get "/" do
|
21
|
+
# You can include your Ruby code in here.
|
22
|
+
# As of this point, there is no Ruby code in this application.
|
23
|
+
# Wherever you want the code to appear, be sure to use <%= yield %> on that line.
|
24
|
+
erb :layout
|
25
|
+
end
|
@@ -0,0 +1,459 @@
|
|
1
|
+
@import url("whitespace-reset.css");
|
2
|
+
|
3
|
+
body {
|
4
|
+
font-family: monospace, sans-serif;
|
5
|
+
background-color: #f6f0e6;
|
6
|
+
}
|
7
|
+
|
8
|
+
nav {
|
9
|
+
position: fixed;
|
10
|
+
top: 0;
|
11
|
+
right: 0;
|
12
|
+
background-color: #96a8ba;
|
13
|
+
width: 100%;
|
14
|
+
display: flex;
|
15
|
+
align-items: center;
|
16
|
+
font-size: 1.2rem;
|
17
|
+
height: 50px;
|
18
|
+
color: white;
|
19
|
+
text-shadow: 1px 1px black;
|
20
|
+
border-bottom: 1px solid black;
|
21
|
+
}
|
22
|
+
|
23
|
+
#links {
|
24
|
+
display: none;
|
25
|
+
align-items: center;
|
26
|
+
overflow: hidden;
|
27
|
+
background-color: #333;
|
28
|
+
position: relative;
|
29
|
+
top: 84px;
|
30
|
+
width: 100%;
|
31
|
+
z-index: 2;
|
32
|
+
}
|
33
|
+
|
34
|
+
nav h1 {
|
35
|
+
position: absolute;
|
36
|
+
top: 15px;
|
37
|
+
left: 15px;
|
38
|
+
}
|
39
|
+
|
40
|
+
.icon {
|
41
|
+
position: absolute;
|
42
|
+
top: 0;
|
43
|
+
right: 0;
|
44
|
+
background-color: #333;
|
45
|
+
padding: 14px;
|
46
|
+
color: white;
|
47
|
+
}
|
48
|
+
|
49
|
+
nav #links a {
|
50
|
+
display: block;
|
51
|
+
width: 100%;
|
52
|
+
padding: 10px 0 10px 15px;
|
53
|
+
text-decoration: none;
|
54
|
+
color: white;
|
55
|
+
transition: .5s;
|
56
|
+
font-size: 1rem;
|
57
|
+
}
|
58
|
+
|
59
|
+
nav #links a:hover {
|
60
|
+
background-color: #ddd;
|
61
|
+
color: black;
|
62
|
+
cursor: pointer;
|
63
|
+
}
|
64
|
+
|
65
|
+
header {
|
66
|
+
margin-top: 50px;
|
67
|
+
box-sizing: border-box;
|
68
|
+
background-color: #f1d6cc;
|
69
|
+
width: 100%;
|
70
|
+
}
|
71
|
+
|
72
|
+
header img {
|
73
|
+
display: block;
|
74
|
+
margin: 0 auto;
|
75
|
+
width: 60%;
|
76
|
+
height: auto;
|
77
|
+
margin-bottom: 20px;
|
78
|
+
border-radius: 80px;
|
79
|
+
padding-top: 20px;
|
80
|
+
box-shadow: 0 1px black;
|
81
|
+
}
|
82
|
+
|
83
|
+
header h1 {
|
84
|
+
text-align: center;
|
85
|
+
font-size: 1.7rem;
|
86
|
+
padding-bottom: 5px;
|
87
|
+
}
|
88
|
+
|
89
|
+
header h2 {
|
90
|
+
text-align: center;
|
91
|
+
font-size: .9rem;
|
92
|
+
padding-bottom: 10px;
|
93
|
+
color: #545454;
|
94
|
+
}
|
95
|
+
|
96
|
+
#about {
|
97
|
+
background-color: #f6f0e6;
|
98
|
+
width: 100%;
|
99
|
+
border-top: 1px solid #333;
|
100
|
+
}
|
101
|
+
|
102
|
+
#about h1 {
|
103
|
+
text-align: center;
|
104
|
+
font-size: 1.5rem;
|
105
|
+
padding-top: 10px;
|
106
|
+
}
|
107
|
+
|
108
|
+
#about p {
|
109
|
+
padding: 10px;
|
110
|
+
}
|
111
|
+
|
112
|
+
#projects {
|
113
|
+
background-color: #f6f0e6;
|
114
|
+
width: 100%;
|
115
|
+
}
|
116
|
+
|
117
|
+
.left {
|
118
|
+
border-top: 1px solid black;
|
119
|
+
padding-top: 20px;
|
120
|
+
}
|
121
|
+
|
122
|
+
#projects h1 {
|
123
|
+
text-align: center;
|
124
|
+
font-size: 1.3rem;
|
125
|
+
padding-top: 10px;
|
126
|
+
margin-bottom: 10px;
|
127
|
+
}
|
128
|
+
|
129
|
+
#projects p {
|
130
|
+
margin: 15px 15px;
|
131
|
+
text-align: center;
|
132
|
+
}
|
133
|
+
|
134
|
+
#projects img {
|
135
|
+
display: block;
|
136
|
+
width: 60%;
|
137
|
+
height: auto;
|
138
|
+
margin: 0 auto;
|
139
|
+
border-radius: 10px;
|
140
|
+
box-shadow: 1px 1px black;
|
141
|
+
margin-bottom: 10px;
|
142
|
+
}
|
143
|
+
|
144
|
+
#projects h2 {
|
145
|
+
text-align: center;
|
146
|
+
padding-bottom: 5px;
|
147
|
+
}
|
148
|
+
|
149
|
+
#projects ul {
|
150
|
+
display: flex;
|
151
|
+
justify-content: center;
|
152
|
+
align-items: center;
|
153
|
+
padding: 0 10px;
|
154
|
+
}
|
155
|
+
|
156
|
+
#projects li {
|
157
|
+
padding: 0 5px 20px 5px;
|
158
|
+
}
|
159
|
+
|
160
|
+
#projects a {
|
161
|
+
font-size: 1rem;
|
162
|
+
text-decoration: none;
|
163
|
+
color: #545454;
|
164
|
+
transition: .5s;
|
165
|
+
}
|
166
|
+
|
167
|
+
#projects a:hover {
|
168
|
+
color: #96a8ba;
|
169
|
+
}
|
170
|
+
|
171
|
+
#skills {
|
172
|
+
background-color: #f6f0e6;
|
173
|
+
width: 100%;
|
174
|
+
border-top: 1px dashed #333;
|
175
|
+
}
|
176
|
+
|
177
|
+
#skills h1 {
|
178
|
+
text-align: center;
|
179
|
+
font-size: 1.5rem;
|
180
|
+
padding-bottom: 10px;
|
181
|
+
margin-top: 10px;
|
182
|
+
}
|
183
|
+
|
184
|
+
#skills h2 {
|
185
|
+
text-align: center;
|
186
|
+
padding-bottom: 2px;
|
187
|
+
}
|
188
|
+
|
189
|
+
.front-end, .back-end {
|
190
|
+
display: inline-block;
|
191
|
+
width: 47%;
|
192
|
+
box-sizing: border-box;
|
193
|
+
}
|
194
|
+
|
195
|
+
.front-end ul, .back-end ul {
|
196
|
+
display: flex;
|
197
|
+
flex-direction: column;
|
198
|
+
justify-content: center;
|
199
|
+
align-items: center;
|
200
|
+
margin: 0;
|
201
|
+
padding-bottom: 15px;
|
202
|
+
margin-bottom: 5px;
|
203
|
+
}
|
204
|
+
|
205
|
+
#connect {
|
206
|
+
position: fixed;
|
207
|
+
bottom: 0;
|
208
|
+
right: 0;
|
209
|
+
background-color: #96a8ba;
|
210
|
+
width: 100%;
|
211
|
+
font-size: 1.1rem;
|
212
|
+
height: 30px;
|
213
|
+
border-top: 1px solid black;
|
214
|
+
}
|
215
|
+
|
216
|
+
#connect ul {
|
217
|
+
display: flex;
|
218
|
+
justify-content: space-around;
|
219
|
+
align-content: center;
|
220
|
+
}
|
221
|
+
|
222
|
+
#connect li {
|
223
|
+
margin: 4px 0;
|
224
|
+
}
|
225
|
+
|
226
|
+
#connect a {
|
227
|
+
text-decoration: none;
|
228
|
+
color: white;
|
229
|
+
transition: .5s;
|
230
|
+
text-shadow: 1px 1px black;
|
231
|
+
font-weight: bold;
|
232
|
+
letter-spacing: .5px;
|
233
|
+
}
|
234
|
+
|
235
|
+
#connect a:hover {
|
236
|
+
color: #f1d6cc;
|
237
|
+
}
|
238
|
+
|
239
|
+
footer {
|
240
|
+
font-family: monospace;
|
241
|
+
padding-top: 10px;
|
242
|
+
width: 100%;
|
243
|
+
background-color: #f6f0e6;
|
244
|
+
margin-bottom: 20px;
|
245
|
+
}
|
246
|
+
|
247
|
+
footer p {
|
248
|
+
font-size: .9rem;
|
249
|
+
text-align: center;
|
250
|
+
padding-bottom: 20px;
|
251
|
+
}
|
252
|
+
|
253
|
+
@media only screen and (min-width: 1020px) {
|
254
|
+
nav {
|
255
|
+
position: static;
|
256
|
+
width: 100%;
|
257
|
+
}
|
258
|
+
|
259
|
+
nav h1 {
|
260
|
+
width: 50%;
|
261
|
+
position: static;
|
262
|
+
font-size: 2rem;
|
263
|
+
margin-left: 20px;
|
264
|
+
}
|
265
|
+
|
266
|
+
.icon {
|
267
|
+
display: none;
|
268
|
+
}
|
269
|
+
|
270
|
+
nav #links {
|
271
|
+
position: static;
|
272
|
+
display: inline-block;
|
273
|
+
background-color: #96a8ba;
|
274
|
+
}
|
275
|
+
|
276
|
+
nav #links ul {
|
277
|
+
width: auto;
|
278
|
+
display: flex;
|
279
|
+
justify-content: flex-end;
|
280
|
+
}
|
281
|
+
|
282
|
+
nav #links a {
|
283
|
+
width: auto;
|
284
|
+
font-size: 1.5rem;
|
285
|
+
padding: 3px 20px;
|
286
|
+
border-radius: 5px;
|
287
|
+
}
|
288
|
+
|
289
|
+
header {
|
290
|
+
padding-top: 50px;
|
291
|
+
margin-top: 0;
|
292
|
+
}
|
293
|
+
|
294
|
+
header img {
|
295
|
+
width: 250px;
|
296
|
+
height: 250px;
|
297
|
+
border-radius: 80px;
|
298
|
+
box-shadow: 0 1px black;
|
299
|
+
}
|
300
|
+
|
301
|
+
header h1 {
|
302
|
+
font-size: 2.4rem;
|
303
|
+
}
|
304
|
+
|
305
|
+
header h2 {
|
306
|
+
font-size: 1.5rem;
|
307
|
+
color: #545454;
|
308
|
+
padding-bottom: 45px;
|
309
|
+
}
|
310
|
+
|
311
|
+
main {
|
312
|
+
width: 80%;
|
313
|
+
display: block;
|
314
|
+
margin: 0 auto;
|
315
|
+
}
|
316
|
+
|
317
|
+
#about {
|
318
|
+
border-top: none;
|
319
|
+
}
|
320
|
+
|
321
|
+
#about h1 {
|
322
|
+
margin-top: 25px;
|
323
|
+
font-size: 2.5rem;
|
324
|
+
padding-bottom: 20px;
|
325
|
+
}
|
326
|
+
|
327
|
+
#about p {
|
328
|
+
font-size: 1.1rem;
|
329
|
+
text-align: left;
|
330
|
+
padding-bottom: 45px;
|
331
|
+
}
|
332
|
+
|
333
|
+
.left {
|
334
|
+
float: left;
|
335
|
+
width: 50%;
|
336
|
+
height: 500px;
|
337
|
+
box-sizing: border-box;
|
338
|
+
border-top: 1px solid black;
|
339
|
+
padding-top: 70px;
|
340
|
+
border-bottom: 1px solid black;
|
341
|
+
}
|
342
|
+
|
343
|
+
.right {
|
344
|
+
float: right;
|
345
|
+
width: 50%;
|
346
|
+
height: 500px;
|
347
|
+
box-sizing: border-box;
|
348
|
+
border-top: 1px solid black;
|
349
|
+
padding-top: 60px;
|
350
|
+
border-bottom: 1px solid black;
|
351
|
+
}
|
352
|
+
|
353
|
+
#projects img {
|
354
|
+
width: 350px;
|
355
|
+
height: auto;
|
356
|
+
}
|
357
|
+
|
358
|
+
#projects h1 {
|
359
|
+
font-size: 2rem;
|
360
|
+
padding-bottom: 5px;
|
361
|
+
border-top: none;
|
362
|
+
}
|
363
|
+
|
364
|
+
#projects p {
|
365
|
+
font-size: 1.2rem;
|
366
|
+
margin: 25px 0 5px 0;
|
367
|
+
text-align: left;
|
368
|
+
padding-bottom: 25px;
|
369
|
+
}
|
370
|
+
|
371
|
+
#projects h2 {
|
372
|
+
font-size: 1.5rem;
|
373
|
+
padding-bottom: 20px;
|
374
|
+
}
|
375
|
+
|
376
|
+
#projects .links {
|
377
|
+
font-size: 1.2rem;
|
378
|
+
padding-bottom: 20px;
|
379
|
+
}
|
380
|
+
|
381
|
+
#projects .langs {
|
382
|
+
font-size: 1.2rem;
|
383
|
+
padding-bottom: 50px;
|
384
|
+
}
|
385
|
+
|
386
|
+
#projects a {
|
387
|
+
font-size: 1.2rem;
|
388
|
+
text-decoration: none;
|
389
|
+
color: #545454;
|
390
|
+
transition: .5s;
|
391
|
+
}
|
392
|
+
|
393
|
+
#projects a:hover {
|
394
|
+
color: #96a8ba;
|
395
|
+
}
|
396
|
+
|
397
|
+
.skills-flex-container {
|
398
|
+
display: flex;
|
399
|
+
justify-content: space-around;
|
400
|
+
}
|
401
|
+
|
402
|
+
.front-end, .back-end {
|
403
|
+
width: 50%;
|
404
|
+
margin: 0;
|
405
|
+
padding: 0 25px;
|
406
|
+
}
|
407
|
+
|
408
|
+
.front-end ul {
|
409
|
+
display: block;
|
410
|
+
padding-left: 200px;
|
411
|
+
}
|
412
|
+
|
413
|
+
.back-end ul {
|
414
|
+
display: block;
|
415
|
+
padding-right: 200px;
|
416
|
+
|
417
|
+
}
|
418
|
+
|
419
|
+
#skills h1 {
|
420
|
+
padding-top: 1010px;
|
421
|
+
font-size: 2rem;
|
422
|
+
}
|
423
|
+
|
424
|
+
#skills .fr-h2 {
|
425
|
+
font-size: 1.5rem;
|
426
|
+
padding-left: 200px;
|
427
|
+
}
|
428
|
+
|
429
|
+
#skills .be-h2 {
|
430
|
+
font-size: 1.5rem;
|
431
|
+
padding-right: 200px;
|
432
|
+
}
|
433
|
+
|
434
|
+
#skills li {
|
435
|
+
display: block;
|
436
|
+
font-size: 1.3rem;
|
437
|
+
text-align: center;
|
438
|
+
}
|
439
|
+
|
440
|
+
footer {
|
441
|
+
border-top: none;
|
442
|
+
}
|
443
|
+
|
444
|
+
footer p {
|
445
|
+
padding-bottom: 35px;
|
446
|
+
}
|
447
|
+
|
448
|
+
#connect {
|
449
|
+
height: 40px;
|
450
|
+
}
|
451
|
+
|
452
|
+
#connect li {
|
453
|
+
padding: 4px 0;
|
454
|
+
}
|
455
|
+
|
456
|
+
#connect a {
|
457
|
+
font-size: 1.3rem;
|
458
|
+
}
|
459
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
/*
|
2
|
+
----------------------------------------
|
3
|
+
Tantek Celik's Whitepsace Reset
|
4
|
+
Author: Tantek Celik, Shane Riley
|
5
|
+
Version: (CC) 2010 Some Rights Reserved
|
6
|
+
- http://creativecommons.org/licenses/by/2.0
|
7
|
+
Description: Resets default styling of common browsers to a common base
|
8
|
+
----------------------------------------
|
9
|
+
*/
|
10
|
+
|
11
|
+
ul, ol { list-style: none; }
|
12
|
+
h1, h2, h3, h4, h5, h6, pre, code { font-size: 1rem; }
|
13
|
+
|
14
|
+
ul, ol, li, h1, h2, h3, h4, h5, h6, pre, form, body, html, p, blockquote,
|
15
|
+
fieldset,input, dl, dt, dd, figure, figcaption {
|
16
|
+
margin: 0;
|
17
|
+
padding: 0;
|
18
|
+
}
|
19
|
+
|
20
|
+
a img, :link img, :visited img, fieldset { border: none; }
|
21
|
+
address { font-style: normal; }
|
22
|
+
|
23
|
+
header, section, article, nav, footer, hgroup, details, summary, figure, main {
|
24
|
+
display: block;
|
25
|
+
}
|
26
|
+
|
27
|
+
mark {
|
28
|
+
color: inherit;
|
29
|
+
background: transparent;
|
30
|
+
}
|
31
|
+
|
32
|
+
abbr { border: none; }
|
33
|
+
summary::-webkit-details-marker { display: none; }
|
@@ -0,0 +1,129 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<title>Your Name Here</title>
|
5
|
+
<meta charset="utf-8" />
|
6
|
+
<link rel="stylesheet" type="text/css" href="/stylesheets/style.css">
|
7
|
+
<link href="https://fonts.googleapis.com/css?family=Inconsolata&display=swap" rel="stylesheet">
|
8
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
9
|
+
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
|
10
|
+
<script>
|
11
|
+
function showHideNav() {
|
12
|
+
var x = document.getElementById("links");
|
13
|
+
if (x.style.display === "block") {
|
14
|
+
x.style.display = "none";
|
15
|
+
} else {
|
16
|
+
x.style.display = "block";
|
17
|
+
}
|
18
|
+
}
|
19
|
+
</script>
|
20
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
21
|
+
</head>
|
22
|
+
<body>
|
23
|
+
<nav>
|
24
|
+
<h1>Jackson C. Frank</h1>
|
25
|
+
<section id="links">
|
26
|
+
<ul>
|
27
|
+
<li><a href="#about">About</a></li>
|
28
|
+
<li><a href="#projects">Projects</a></li>
|
29
|
+
<li><a href="#skills">Skills</a></li>
|
30
|
+
</ul>
|
31
|
+
</section>
|
32
|
+
<a href="javascript:void(0);" class="icon" onclick="showHideNav()">
|
33
|
+
<i class="fa fa-bars" aria-hidden="true"></i>
|
34
|
+
</a>
|
35
|
+
</nav>
|
36
|
+
<header>
|
37
|
+
<img src="http://placehold.it/250x250">
|
38
|
+
<h1>Jackson C. Frank</h1>
|
39
|
+
<h2>Software Engineer • Brooklyn, NY</h2>
|
40
|
+
</header>
|
41
|
+
<main>
|
42
|
+
<section id="about">
|
43
|
+
<h1>About</h1>
|
44
|
+
<p class="about-me">Welcome! I am a software engineer who specializes in Rails, Node, and PostgreSQL. When confronted with a problem, I enjoy diving deep into planning a flexible and powerful solution using TDD and first principles. Check out my recent projects to see these concepts at work.</p>
|
45
|
+
</section>
|
46
|
+
<section id="projects">
|
47
|
+
<div class="project-one">
|
48
|
+
<div class="left">
|
49
|
+
<img src="http://placehold.it/500x500" alt="image of project one">
|
50
|
+
</div>
|
51
|
+
<div class="right">
|
52
|
+
<h1>Project One</h1>
|
53
|
+
<p><strong>Project One</strong> is a cool, and tiny project that can be used for creating interactive projects.</p>
|
54
|
+
<ul>
|
55
|
+
<li class="links"><a href="#">Live</a></li>
|
56
|
+
<li class="links"> • </li>
|
57
|
+
<li class="links"><a href="#">Github</a></li>
|
58
|
+
</ul>
|
59
|
+
<h2>Frameworks and Languages</h2>
|
60
|
+
<ul>
|
61
|
+
<li class="langs">Rails</li>
|
62
|
+
<li class="langs"> • </li>
|
63
|
+
<li class="langs">React</li>
|
64
|
+
<li class="langs"> • </li>
|
65
|
+
<li class="langs">PostgreSQL</li>
|
66
|
+
</ul>
|
67
|
+
</div>
|
68
|
+
</div>
|
69
|
+
</div>
|
70
|
+
<div class="project-two">
|
71
|
+
<div class="left">
|
72
|
+
<img src="http://placehold.it/500x500" alt="image of project one">
|
73
|
+
</div>
|
74
|
+
<div class="right">
|
75
|
+
<h1>Project Two</h1>
|
76
|
+
<p><strong>Project Two</strong> is a cool, and tiny project that can be used for creating interactive projects.</p>
|
77
|
+
<ul>
|
78
|
+
<li class="links"><a href="#">Live</a></li>
|
79
|
+
<li class="links"> • </li>
|
80
|
+
<li class="links"><a href="#">Github</a></li>
|
81
|
+
</ul>
|
82
|
+
<h2>Frameworks and Languages</h2>
|
83
|
+
<ul>
|
84
|
+
<li class="langs">Rails</li>
|
85
|
+
<li class="langs"> • </li>
|
86
|
+
<li class="langs">React</li>
|
87
|
+
<li class="langs"> • </li>
|
88
|
+
<li class="langs">PostgreSQL</li>
|
89
|
+
</ul>
|
90
|
+
</div>
|
91
|
+
</div>
|
92
|
+
</section>
|
93
|
+
<section id="skills">
|
94
|
+
<h1>Skills</h1>
|
95
|
+
<div class="skills-flex-container">
|
96
|
+
<div class="front-end">
|
97
|
+
<h2 class="fr-h2">Front End</h2>
|
98
|
+
<ul>
|
99
|
+
<li>Javascript</li>
|
100
|
+
<li>HTML</li>
|
101
|
+
<li>CSS</li>
|
102
|
+
<li>Bootstrap</li>
|
103
|
+
</ul>
|
104
|
+
</div>
|
105
|
+
<div class="back-end">
|
106
|
+
<h2 class="be-h2">Back End</h2>
|
107
|
+
<ul>
|
108
|
+
<li>Rails</li>
|
109
|
+
<li>Ruby</li>
|
110
|
+
<li>Node.js</li>
|
111
|
+
<li>PostgreSQL</li>
|
112
|
+
</ul>
|
113
|
+
</div>
|
114
|
+
</div>
|
115
|
+
</section>
|
116
|
+
<section id="connect">
|
117
|
+
<ul>
|
118
|
+
<li><a href="#">Github</a></li>
|
119
|
+
<li><a href="#">Linkedin</a></li>
|
120
|
+
<li><a href="#">Resume</a></li>
|
121
|
+
<li><a href="mailto:youremailaddress">Email</a></li>
|
122
|
+
</ul>
|
123
|
+
</section>
|
124
|
+
</main>
|
125
|
+
<footer>
|
126
|
+
<p>Powered by <em>EasyPortfolio</em> © 2019</p>
|
127
|
+
</footer>
|
128
|
+
</body>
|
129
|
+
</html>
|
File without changes
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class Version
|
2
|
+
def self.increment
|
3
|
+
current_version = self.return_current_version
|
4
|
+
new_version = return_new_version_number(current_version)
|
5
|
+
write_new_version(new_version)
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.replace_version_number(correct_version)
|
9
|
+
write_new_version(correct_version)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.return_current_version_string
|
13
|
+
File.read(return_path)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.return_current_version
|
17
|
+
File.read(return_path).split('.').map do |entry|
|
18
|
+
entry.gsub("'", '')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def self.return_new_version_number(version_array)
|
25
|
+
if version_array[1] == '9' && version_array[2] == '9'
|
26
|
+
version_array[0] = version_array[0].to_i + 1
|
27
|
+
version_array[1], version_array[2] = 0, 0
|
28
|
+
elsif version_array[2] == '9'
|
29
|
+
version_array[1] = version_array[1].to_i + 1
|
30
|
+
version_array[2] = 0
|
31
|
+
else
|
32
|
+
version_array[2] = version_array[2].to_i + 1
|
33
|
+
end
|
34
|
+
|
35
|
+
version_array.join('.')
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.write_new_version(new_version)
|
39
|
+
File.open(return_path, "w") do |io|
|
40
|
+
io << new_version
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.return_path
|
45
|
+
path = File.expand_path("version_number.txt")
|
46
|
+
path.slice!('/lib/easy_portfolio')
|
47
|
+
path.slice!('/lib')
|
48
|
+
path
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require_relative 'easy_portfolio/input.rb'
|
2
|
+
require_relative 'easy_portfolio/output.rb'
|
3
|
+
require_relative 'easy_portfolio/version.rb'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'find'
|
6
|
+
|
7
|
+
module FileAction
|
8
|
+
def create_template_directory
|
9
|
+
directory = File.expand_path("../easy_portfolio/portfolio_template", __FILE__)
|
10
|
+
FileUtils.copy_entry(directory, 'easy_portfolio_template')
|
11
|
+
end
|
12
|
+
|
13
|
+
def template_already_exists?
|
14
|
+
Dir.exist?("easy_portfolio_template")
|
15
|
+
end
|
16
|
+
|
17
|
+
def perform_git_and_bundler_actions
|
18
|
+
Dir.chdir("easy_portfolio_template") do
|
19
|
+
`git init`
|
20
|
+
`gem install bundler`
|
21
|
+
`bundle install`
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class EasyPortfolio
|
27
|
+
extend FileAction
|
28
|
+
|
29
|
+
OUTPUT = Output.new
|
30
|
+
INPUT = Input.new
|
31
|
+
|
32
|
+
def self.execute
|
33
|
+
opening_actions
|
34
|
+
answer = input_action
|
35
|
+
action_verified?(answer) ? directory_creation_actions : refusal_action
|
36
|
+
|
37
|
+
ending_action
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def self.opening_actions
|
43
|
+
OUTPUT.welcome
|
44
|
+
OUTPUT.describe
|
45
|
+
OUTPUT.ask_for_permission
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.directory_creation_actions
|
49
|
+
OUTPUT.permission_confirmation
|
50
|
+
|
51
|
+
if template_already_exists?
|
52
|
+
OUTPUT.directory_exists
|
53
|
+
else
|
54
|
+
OUTPUT.directory_doesnt_exist
|
55
|
+
create_template_directory
|
56
|
+
OUTPUT.git_bundle_notification
|
57
|
+
perform_git_and_bundler_actions
|
58
|
+
OUTPUT.successful_installation
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.input_action
|
63
|
+
INPUT.ask_yes_or_no
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.refusal_action
|
67
|
+
OUTPUT.permission_rejection
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.ending_action
|
71
|
+
OUTPUT.shut_down
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.action_verified?(input)
|
75
|
+
input.downcase == 'y' ? true : false
|
76
|
+
end
|
77
|
+
end
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: easy_portfolio
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jordan Moore
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-09-19 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A portfolio-generator in Sinatra
|
14
|
+
email: jordanmoore753@gmail.com
|
15
|
+
executables:
|
16
|
+
- easy
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/easy
|
21
|
+
- lib/easy_portfolio.rb
|
22
|
+
- lib/easy_portfolio/create.rb
|
23
|
+
- lib/easy_portfolio/input.rb
|
24
|
+
- lib/easy_portfolio/output.rb
|
25
|
+
- lib/easy_portfolio/portfolio_template/Gemfile
|
26
|
+
- lib/easy_portfolio/portfolio_template/Procfile
|
27
|
+
- lib/easy_portfolio/portfolio_template/app.rb
|
28
|
+
- lib/easy_portfolio/portfolio_template/config.ru
|
29
|
+
- lib/easy_portfolio/portfolio_template/public/stylesheets/style.css
|
30
|
+
- lib/easy_portfolio/portfolio_template/public/stylesheets/whitespace-reset.css
|
31
|
+
- lib/easy_portfolio/portfolio_template/test/app_test.rb
|
32
|
+
- lib/easy_portfolio/portfolio_template/views/layout.erb
|
33
|
+
- lib/easy_portfolio/portfolio_template/views/portfolio.erb
|
34
|
+
- lib/easy_portfolio/version.rb
|
35
|
+
homepage: https://rubygems.org/gems/easy_portfolio
|
36
|
+
licenses:
|
37
|
+
- MIT
|
38
|
+
metadata: {}
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubygems_version: 3.0.6
|
55
|
+
signing_key:
|
56
|
+
specification_version: 4
|
57
|
+
summary: This gem creates the boilerplate files for a portfolio in Sinatra.
|
58
|
+
test_files: []
|