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 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: []