easy_portfolio 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'easy_portfolio'
4
+ EasyPortfolio.execute
@@ -0,0 +1,3 @@
1
+ require 'fileutils'
2
+ require 'find'
3
+
@@ -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,2 @@
1
+ require "./app"
2
+ run Sinatra::Application
@@ -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,12 @@
1
+ require 'minitest/autorun'
2
+ require_relative '../app.rb'
3
+
4
+ class AppTest < Minitest::Test
5
+ def setup
6
+
7
+ end
8
+
9
+ def teardown
10
+
11
+ end
12
+ end
@@ -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 &#8226; 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"> &#8226; </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"> &#8226; </li>
63
+ <li class="langs">React</li>
64
+ <li class="langs"> &#8226; </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"> &#8226; </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"> &#8226; </li>
86
+ <li class="langs">React</li>
87
+ <li class="langs"> &#8226; </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> &copy; 2019</p>
127
+ </footer>
128
+ </body>
129
+ </html>
@@ -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: []