rhail 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +77 -0
- data/bin/rhail +78 -0
- data/generator_folders/.DS_Store +0 -0
- data/generator_folders/json/.DS_Store +0 -0
- data/generator_folders/json/.ruby-version +1 -0
- data/generator_folders/json/Gemfile +6 -0
- data/generator_folders/json/Gemfile.lock +17 -0
- data/generator_folders/json/config.ru +61 -0
- data/generator_folders/json/db/database.sqlite3 +0 -0
- data/generator_folders/json/db/seed.rb +31 -0
- data/generator_folders/json/public/.DS_Store +0 -0
- data/generator_folders/json/public/img/.DS_Store +0 -0
- data/generator_folders/json/public/img/favicon.png +0 -0
- data/generator_folders/json/settings.yml +1 -0
- data/generator_folders/plain/.DS_Store +0 -0
- data/generator_folders/plain/.ruby-version +1 -0
- data/generator_folders/plain/Gemfile +6 -0
- data/generator_folders/plain/Gemfile.lock +17 -0
- data/generator_folders/plain/config.ru +59 -0
- data/generator_folders/plain/db/database.sqlite3 +0 -0
- data/generator_folders/plain/db/seed.rb +31 -0
- data/generator_folders/plain/public/.DS_Store +0 -0
- data/generator_folders/plain/public/css/styles.css +123 -0
- data/generator_folders/plain/public/html/example_one.html +35 -0
- data/generator_folders/plain/public/html/example_three.html +75 -0
- data/generator_folders/plain/public/html/example_two.html +50 -0
- data/generator_folders/plain/public/html/foot.html +22 -0
- data/generator_folders/plain/public/html/head.html +51 -0
- data/generator_folders/plain/public/html/home.html +29 -0
- data/generator_folders/plain/public/img/favicon.png +0 -0
- data/generator_folders/plain/public/img/jumbotron.jpg +0 -0
- data/generator_folders/spa/.DS_Store +0 -0
- data/generator_folders/spa/.ruby-version +1 -0
- data/generator_folders/spa/Gemfile +6 -0
- data/generator_folders/spa/Gemfile.lock +17 -0
- data/generator_folders/spa/config.ru +49 -0
- data/generator_folders/spa/db/database.sqlite3 +0 -0
- data/generator_folders/spa/db/seed.rb +31 -0
- data/generator_folders/spa/public/.DS_Store +0 -0
- data/generator_folders/spa/public/css/styles.css +123 -0
- data/generator_folders/spa/public/html/index.html +186 -0
- data/generator_folders/spa/public/img/favicon.png +0 -0
- data/generator_folders/spa/public/img/jumbotron.jpg +0 -0
- data/generator_folders/spa/public/js/another-component.js +72 -0
- data/generator_folders/spa/public/js/app.js +16 -0
- data/lib/rhail.rb +13 -0
- data/lib/rhail/generator.rb +46 -0
- data/lib/rhail/helper.rb +117 -0
- data/lib/rhail/main.rb +8 -0
- data/rhail.gemspec +46 -0
- metadata +123 -0
Binary file
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'sequel'
|
2
|
+
|
3
|
+
DB = Sequel.sqlite('db/database.sqlite3')
|
4
|
+
|
5
|
+
DB.run "DROP TABLE IF EXISTS addresses"
|
6
|
+
DB.run "DROP TABLE IF EXISTS people"
|
7
|
+
|
8
|
+
DB.create_table :addresses do
|
9
|
+
primary_key :id
|
10
|
+
String :street_1, :size => 255
|
11
|
+
String :street_2, :size => 255
|
12
|
+
String :city
|
13
|
+
String :state, :size => 2
|
14
|
+
String :zipcode, :size => 5
|
15
|
+
end
|
16
|
+
|
17
|
+
DB.run "INSERT INTO addresses(city, state, zipcode) VALUES('Atlanta', 'GA', '30305')"
|
18
|
+
DB.run "INSERT INTO addresses(city, state, zipcode) VALUES('Houston', 'TX', '77001')"
|
19
|
+
DB.run "INSERT INTO addresses(city, state, zipcode) VALUES('Fargo', 'ND', '58102')"
|
20
|
+
|
21
|
+
|
22
|
+
DB.create_table :people do
|
23
|
+
primary_key :id
|
24
|
+
String :name, :size => 255
|
25
|
+
Integer :address_id
|
26
|
+
end
|
27
|
+
|
28
|
+
DB.run "INSERT INTO people(name, address_id) VALUES('George', 1)"
|
29
|
+
DB.run "INSERT INTO people(name, address_id) VALUES('Thomas', 2)"
|
30
|
+
DB.run "INSERT INTO people(name, address_id) VALUES('Douglas', 3)"
|
31
|
+
|
Binary file
|
@@ -0,0 +1,123 @@
|
|
1
|
+
body {
|
2
|
+
min-height: 1000px;
|
3
|
+
}
|
4
|
+
|
5
|
+
.navbar {
|
6
|
+
margin-bottom: 0px;
|
7
|
+
}
|
8
|
+
|
9
|
+
/* Sticky footer styles
|
10
|
+
-------------------------------------------------- */
|
11
|
+
|
12
|
+
html {
|
13
|
+
position: relative;
|
14
|
+
min-height: 100%;
|
15
|
+
}
|
16
|
+
|
17
|
+
body {
|
18
|
+
margin-bottom: 100px; /* Margin bottom by footer height */
|
19
|
+
}
|
20
|
+
|
21
|
+
.footer {
|
22
|
+
position: absolute;
|
23
|
+
bottom: 0;
|
24
|
+
width: 100%;
|
25
|
+
height: 100px; /* Set the fixed height of the footer here */
|
26
|
+
background-color: #f5f5f5;
|
27
|
+
}
|
28
|
+
|
29
|
+
/* Navbar Colors
|
30
|
+
-------------------------------------------------- */
|
31
|
+
|
32
|
+
.navbar-default .navbar-brand {
|
33
|
+
color: #fff;
|
34
|
+
}
|
35
|
+
|
36
|
+
.navbar-default {
|
37
|
+
background-color: #2da3f3;
|
38
|
+
border-color: #14264d;
|
39
|
+
}
|
40
|
+
|
41
|
+
.navbar-default .navbar-nav>li>a {
|
42
|
+
color: #fff;
|
43
|
+
}
|
44
|
+
|
45
|
+
.navbar-default .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:focus, .navbar-default .navbar-nav>.active>a:hover {
|
46
|
+
color: #9acdef;
|
47
|
+
background-color: #263b66;
|
48
|
+
}
|
49
|
+
|
50
|
+
.navbar-default .navbar-nav>li>a:focus, .navbar-default .navbar-nav>li>a:hover {
|
51
|
+
color: #263b66;
|
52
|
+
background-color: transparent;
|
53
|
+
}
|
54
|
+
|
55
|
+
|
56
|
+
.navbar-default .navbar-brand:focus, .navbar-default .navbar-brand:hover {
|
57
|
+
color: #263b66;
|
58
|
+
background-color: transparent;
|
59
|
+
}
|
60
|
+
|
61
|
+
.navbar-default .navbar-nav>.open>a, .navbar-default .navbar-nav>.open>a:focus, .navbar-default .navbar-nav>.open>a:hover {
|
62
|
+
color: #9acdef;
|
63
|
+
background-color: #263b66;
|
64
|
+
}
|
65
|
+
|
66
|
+
.dropdown-menu {
|
67
|
+
background-color: #263b66;
|
68
|
+
}
|
69
|
+
|
70
|
+
.dropdown-menu>li>a {
|
71
|
+
color: #9acdef;
|
72
|
+
}
|
73
|
+
|
74
|
+
.dropdown-header {
|
75
|
+
color: #ddd;
|
76
|
+
}
|
77
|
+
|
78
|
+
/* Navbar (mobile stacked) colors
|
79
|
+
-------------------------------------------------- */
|
80
|
+
.navbar-default .navbar-toggle .icon-bar {
|
81
|
+
background-color: #eee;
|
82
|
+
}
|
83
|
+
|
84
|
+
.navbar-default .navbar-toggle:focus, .navbar-default .navbar-toggle:hover {
|
85
|
+
background-color: #263b66;
|
86
|
+
}
|
87
|
+
|
88
|
+
/* Jumbotron
|
89
|
+
-------------------------------------------------- */
|
90
|
+
|
91
|
+
.jumbotron {
|
92
|
+
background-color: #ddd;
|
93
|
+
background: url('/img/jumbotron.jpg') no-repeat; /* LICENSE: I (Maksim Sundukov) do own rights for this picture, I made it, feel free to use it fo free. */
|
94
|
+
background-position: 0% 30%;
|
95
|
+
background-size: auto;
|
96
|
+
}
|
97
|
+
|
98
|
+
.jumbotron .h1, .jumbotron h1 {
|
99
|
+
color: #444;
|
100
|
+
}
|
101
|
+
|
102
|
+
.jumbotron p {
|
103
|
+
color: #fff;
|
104
|
+
text-shadow: 1px 1px 4px #000;
|
105
|
+
}
|
106
|
+
|
107
|
+
/* Footer
|
108
|
+
-------------------------------------------------- */
|
109
|
+
|
110
|
+
.footer-links {
|
111
|
+
margin-top: 20px;
|
112
|
+
}
|
113
|
+
|
114
|
+
.footer-links a {
|
115
|
+
margin-right: 20px;
|
116
|
+
}
|
117
|
+
|
118
|
+
/* IDs
|
119
|
+
-------------------------------------------------- */
|
120
|
+
|
121
|
+
#features-form {
|
122
|
+
margin-top: 50px;
|
123
|
+
}
|
@@ -0,0 +1,186 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<title>Ruby Hail. SPA.</title>
|
4
|
+
|
5
|
+
<link rel="icon" type="image/png" href="/img/favicon.png" />
|
6
|
+
|
7
|
+
<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Open+Sans" />
|
8
|
+
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
|
9
|
+
<link rel="stylesheet" type="text/css" href="/css/styles.css">
|
10
|
+
|
11
|
+
</head>
|
12
|
+
|
13
|
+
<body>
|
14
|
+
|
15
|
+
<div id="app">
|
16
|
+
|
17
|
+
<!-- Menu -->
|
18
|
+
<nav class="navbar navbar-default navbar-static-top">
|
19
|
+
<div class="container">
|
20
|
+
<div class="navbar-header">
|
21
|
+
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar">
|
22
|
+
<span class="icon-bar"></span>
|
23
|
+
<span class="icon-bar"></span>
|
24
|
+
<span class="icon-bar"></span>
|
25
|
+
</button>
|
26
|
+
<a class="navbar-brand" href="/">Ruby Hail SPA</a>
|
27
|
+
</div>
|
28
|
+
<div id="navbar" class="navbar-collapse collapse">
|
29
|
+
<ul class="nav navbar-nav">
|
30
|
+
<router-link to="/main" tag="li" active-class="active"><a>Home</a></router-link>
|
31
|
+
<router-link to="/example_one" tag="li" active-class="active"><a>Example One</a></router-link>
|
32
|
+
<li class="dropdown">
|
33
|
+
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Drop-down Menu <span class="caret"></span></a>
|
34
|
+
<ul class="dropdown-menu">
|
35
|
+
<li><a href="#">One</a></li>
|
36
|
+
<li><a href="#">Two</a></li>
|
37
|
+
<li><a href="#">Three</a></li>
|
38
|
+
<li role="separator" class="divider"></li>
|
39
|
+
<li class="dropdown-header">Text</li>
|
40
|
+
<li><a href="#">Four</a></li>
|
41
|
+
<li><a href="#">Five</a></li>
|
42
|
+
</ul>
|
43
|
+
</li>
|
44
|
+
</ul>
|
45
|
+
<ul class="nav navbar-nav navbar-right">
|
46
|
+
<li><a href="#">Contact</a></li>
|
47
|
+
<li><a href="#">Visit</a></li>
|
48
|
+
<li><a href="#">Jobs</a></li>
|
49
|
+
</ul>
|
50
|
+
</div><!--/.nav-collapse -->
|
51
|
+
</div>
|
52
|
+
</nav>
|
53
|
+
<router-view></router-view>
|
54
|
+
</div>
|
55
|
+
|
56
|
+
<template id="main">
|
57
|
+
<div><!- - This wrapping div is very important, template will work only with first child element- ->
|
58
|
+
<div class="jumbotron">
|
59
|
+
<div class="container">
|
60
|
+
<h1>Ruby Hail. SPA Example.</h1>
|
61
|
+
<p>Ea qui laoreet repudiandae neglegentur, cu detraxit euripidis vim, sit ex odio choro dicam. Cu eos lucilius postulant maiestatis, no alii commodo placerat per. Mei an dicta atomorum urbanitas, mei impetus noluisse in. Vim at solet viderer gloriatur, quo ut duis facete melius.</p>
|
62
|
+
<p>
|
63
|
+
<a class="btn btn-lg btn-primary" href="#">More info »</a>
|
64
|
+
</p>
|
65
|
+
</div>
|
66
|
+
</div>
|
67
|
+
|
68
|
+
<div class="container">
|
69
|
+
<div class="row">
|
70
|
+
<div class="col-md-4">
|
71
|
+
<h2>Heading</h2>
|
72
|
+
<p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa.</p>
|
73
|
+
<p><a class="btn btn-primary" href="#">View details »</a></p>
|
74
|
+
</div>
|
75
|
+
<div class="col-md-4">
|
76
|
+
<h2>Heading</h2>
|
77
|
+
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
|
78
|
+
<p><a class="btn btn-primary" href="#">View details »</a></p>
|
79
|
+
</div>
|
80
|
+
<div class="col-md-4">
|
81
|
+
<h2>Heading</h2>
|
82
|
+
<p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa.</p>
|
83
|
+
<p><a class="btn btn-primary" href="#">View details »</a></p>
|
84
|
+
</div>
|
85
|
+
</div>
|
86
|
+
</div> <!-- /container -->
|
87
|
+
</div>
|
88
|
+
</template>
|
89
|
+
|
90
|
+
<template id="another-component">
|
91
|
+
<div><!- - This wrapping div is very important, template will work only with first child element- ->
|
92
|
+
|
93
|
+
<div class="container">
|
94
|
+
<div class="row">
|
95
|
+
<div class="col-md-4">
|
96
|
+
<form id="features-form">
|
97
|
+
|
98
|
+
<input type="hidden" name="csrf_token" value="local_vars[:csrf_token]" />
|
99
|
+
|
100
|
+
<div class="form-group">
|
101
|
+
<label for="name">Name</label>
|
102
|
+
<input class="form-control" placeholder='John Doe' id="name" name="name" v-model="name">
|
103
|
+
</div>
|
104
|
+
|
105
|
+
<div class="form-group">
|
106
|
+
<label for="city">City</label>
|
107
|
+
<input class="form-control" placeholder='Atlanta' id="city" name="city" v-model="city">
|
108
|
+
</div>
|
109
|
+
|
110
|
+
<div class="form-group">
|
111
|
+
<label for="state">State</label>
|
112
|
+
<input class="form-control" placeholder='GA' id="state" name="state" v-model="state">
|
113
|
+
</div>
|
114
|
+
|
115
|
+
<div class="form-group">
|
116
|
+
<label for="zipcode">Zip</label>
|
117
|
+
<input class="form-control" placeholder='30303' id="zipcode" name="zipcode" v-model="zipcode">
|
118
|
+
</div>
|
119
|
+
|
120
|
+
<div class="form-group">
|
121
|
+
<button class="btn btn-primary" v-on:click="sendData($event)">Add</button>
|
122
|
+
</div>
|
123
|
+
|
124
|
+
</form>
|
125
|
+
</div>
|
126
|
+
</div>
|
127
|
+
|
128
|
+
<div class="row">
|
129
|
+
<div class="col-md-4">
|
130
|
+
<h4>Results:</h4>
|
131
|
+
</div>
|
132
|
+
</div>
|
133
|
+
|
134
|
+
<div class="row">
|
135
|
+
<div class="col-md-8">
|
136
|
+
<table id="people-table" class="table table-striped table-hover table-condensed table-responsive">
|
137
|
+
<thead>
|
138
|
+
<tr>
|
139
|
+
<th>Name</th>
|
140
|
+
<th>City</th>
|
141
|
+
<th>State</th>
|
142
|
+
<th>Zip</th>
|
143
|
+
</tr>
|
144
|
+
</thead>
|
145
|
+
<tbody>
|
146
|
+
<tr v-for="p in peopleWithAddresses">
|
147
|
+
<td><div class="person-name">{{p.name}}</div></td>
|
148
|
+
<td><div class="person-city">{{p.city}}</div></td>
|
149
|
+
<td><div class="person-state">{{p.state}}</div></td>
|
150
|
+
<td><div class="person-zip">{{p.zipcode}}</div></td>
|
151
|
+
</tr>
|
152
|
+
</tbody>
|
153
|
+
</table>
|
154
|
+
</div>
|
155
|
+
</div>
|
156
|
+
|
157
|
+
</div>
|
158
|
+
</div>
|
159
|
+
</template>
|
160
|
+
|
161
|
+
<footer class="footer">
|
162
|
+
<div class="container">
|
163
|
+
<div class="row">
|
164
|
+
<div class="col-md-offset-2 col-md-8">
|
165
|
+
<p class="footer-links">
|
166
|
+
<a href="#">Donec id elit</a>
|
167
|
+
<a href="#">Non mi porta</a>
|
168
|
+
<a href="#">Gravida at eget</a>
|
169
|
+
<a href="#">Metus</a>
|
170
|
+
<a href="#">Fusce dapibus</a>
|
171
|
+
</p>
|
172
|
+
<p>© 2016 Company, Inc.</p>
|
173
|
+
</div>
|
174
|
+
</div>
|
175
|
+
</div>
|
176
|
+
</footer>
|
177
|
+
|
178
|
+
<script src="//unpkg.com/jquery@3.1.1/dist/jquery.min.js"></script>
|
179
|
+
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
180
|
+
<script src="//unpkg.com/vue@2.1.4/dist/vue.min.js"></script>
|
181
|
+
<script src="//unpkg.com/vue-router@2.1.1/dist/vue-router.min.js"></script>
|
182
|
+
<script src="//unpkg.com/axios@0.15.3/dist/axios.min.js"></script>
|
183
|
+
<script src="/js/another-component.js"></script>
|
184
|
+
<script src="/js/app.js"></script>
|
185
|
+
</body>
|
186
|
+
</html>
|
Binary file
|
Binary file
|
@@ -0,0 +1,72 @@
|
|
1
|
+
const anotherComponent = {
|
2
|
+
template: '#another-component',
|
3
|
+
|
4
|
+
data: function() { return {
|
5
|
+
peopleWithAddresses: {},
|
6
|
+
name: '',
|
7
|
+
city: '',
|
8
|
+
state: '',
|
9
|
+
zipcode: '',
|
10
|
+
csrfToken: ''
|
11
|
+
}},
|
12
|
+
|
13
|
+
created: function() {
|
14
|
+
this.callOnCreate()
|
15
|
+
},
|
16
|
+
|
17
|
+
methods: {
|
18
|
+
getData: function() {
|
19
|
+
var vm = this
|
20
|
+
var res = {}
|
21
|
+
|
22
|
+
axios.get('/api/example_one')
|
23
|
+
.then(function(response) {
|
24
|
+
vm.peopleWithAddresses = response.data
|
25
|
+
vm.csrfToken = response.headers.csrf_token
|
26
|
+
})
|
27
|
+
.catch(function(error){
|
28
|
+
console.log('ERROR in getData')
|
29
|
+
console.log(error)
|
30
|
+
})
|
31
|
+
},
|
32
|
+
|
33
|
+
sendData: function(event) {
|
34
|
+
var vm = this
|
35
|
+
event.preventDefault() // Otherwise browser will submit form too
|
36
|
+
|
37
|
+
axios({
|
38
|
+
method: 'post',
|
39
|
+
url: '/api/example_two',
|
40
|
+
data: {
|
41
|
+
|
42
|
+
name: vm.name,
|
43
|
+
city: vm.city,
|
44
|
+
state: vm.state,
|
45
|
+
zipcode: vm.zipcode
|
46
|
+
|
47
|
+
},
|
48
|
+
headers: {'CSRF-Token': vm.csrfToken}
|
49
|
+
})
|
50
|
+
.then(function(response) {
|
51
|
+
|
52
|
+
// Clean the form
|
53
|
+
vm.name = ''
|
54
|
+
vm.city = ''
|
55
|
+
vm.state = ''
|
56
|
+
vm.zip = ''
|
57
|
+
|
58
|
+
vm.getData()
|
59
|
+
})
|
60
|
+
.catch(function(error){
|
61
|
+
console.log('ERROR in sendData')
|
62
|
+
console.log(error)
|
63
|
+
})
|
64
|
+
},
|
65
|
+
|
66
|
+
callOnCreate: function() {
|
67
|
+
this.getData()
|
68
|
+
}
|
69
|
+
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
const mainComponent = {
|
2
|
+
template: '#main'
|
3
|
+
}
|
4
|
+
|
5
|
+
var vm = new Vue({
|
6
|
+
el: '#app',
|
7
|
+
router: new VueRouter({
|
8
|
+
routes: [
|
9
|
+
{ path: '/main', component: mainComponent },
|
10
|
+
{ path: '/example_one', component: anotherComponent }, // nother-component.js
|
11
|
+
{ path: '*', redirect: '/main'}
|
12
|
+
]
|
13
|
+
}),
|
14
|
+
})
|
15
|
+
|
16
|
+
|