luca 0.6.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +77 -0
- data/Guardfile +22 -0
- data/README.md +291 -0
- data/Rakefile +28 -0
- data/app.rb +46 -0
- data/assets/images/glyphicons-halflings-white.png +0 -0
- data/assets/images/glyphicons-halflings.png +0 -0
- data/assets/javascripts/dependencies/backbone-min.js +37 -0
- data/assets/javascripts/dependencies/backbone-query.min.js +1 -0
- data/assets/javascripts/dependencies/bootstrap.min.js +1 -0
- data/assets/javascripts/dependencies/jasmine-html.js +190 -0
- data/assets/javascripts/dependencies/jasmine.js +2476 -0
- data/assets/javascripts/dependencies/jquery.js +4 -0
- data/assets/javascripts/dependencies/modal.js +698 -0
- data/assets/javascripts/dependencies/modernizr.min.js +30 -0
- data/assets/javascripts/dependencies/prettify.js +28 -0
- data/assets/javascripts/dependencies/sinon.js +3469 -0
- data/assets/javascripts/dependencies/spin-min.js +2 -0
- data/assets/javascripts/dependencies/underscore-min.js +31 -0
- data/assets/javascripts/dependencies/underscore-string.min.js +14 -0
- data/assets/javascripts/dependencies.coffee +7 -0
- data/assets/javascripts/luca-ui-base.coffee +12 -0
- data/assets/javascripts/luca-ui-spec.coffee +2 -0
- data/assets/javascripts/luca-ui.coffee +3 -0
- data/assets/javascripts/sandbox/collections/sample.coffee +0 -0
- data/assets/javascripts/sandbox/config.coffee +7 -0
- data/assets/javascripts/sandbox/sandbox.coffee +16 -0
- data/assets/javascripts/sandbox/templates/features/collection_helpers.luca +33 -0
- data/assets/javascripts/sandbox/templates/features/form_demo_code.luca +48 -0
- data/assets/javascripts/sandbox/templates/features/grid_demo_code.luca +24 -0
- data/assets/javascripts/sandbox/templates/features/introduction.luca +11 -0
- data/assets/javascripts/sandbox/templates/features/view_helpers.luca +43 -0
- data/assets/javascripts/sandbox/templates/navigation.luca +8 -0
- data/assets/javascripts/sandbox/views/form_demo.coffee +47 -0
- data/assets/javascripts/sandbox/views/grid_demo.coffee +23 -0
- data/assets/javascripts/sandbox/views/pages/collection_events_sample.coffee +1 -0
- data/assets/javascripts/sandbox/views/pages/pages_controller.coffee +28 -0
- data/assets/javascripts/sandbox.coffee +4 -0
- data/assets/javascripts/spec-dependencies.coffee +4 -0
- data/assets/stylesheets/bootstrap-responsive.min.css +3 -0
- data/assets/stylesheets/bootstrap.min.css +610 -0
- data/assets/stylesheets/jasmine.css +166 -0
- data/assets/stylesheets/luca-ui-bootstrap.css +5 -0
- data/assets/stylesheets/luca-ui-spec.css +3 -0
- data/assets/stylesheets/luca-ui.css +3 -0
- data/assets/stylesheets/prettify.css +40 -0
- data/assets/stylesheets/sandbox/sandbox.scss +4 -0
- data/assets/stylesheets/sandbox.css +3 -0
- data/config.ru +11 -0
- data/lib/luca/command_line.rb +69 -0
- data/lib/luca/rails/engine.rb +12 -0
- data/lib/luca/rails/version.rb +6 -0
- data/lib/luca/rails.rb +9 -0
- data/lib/luca/template.rb +51 -0
- data/lib/luca/test_harness.rb +106 -0
- data/lib/luca.rb +1 -0
- data/lib/sprockets/luca_template.rb +49 -0
- data/lib/templates/spec_manifest_javascripts.erb +7 -0
- data/lib/templates/spec_manifest_stylesheets.erb +11 -0
- data/luca.gemspec +26 -0
- data/public/jasmine/index.html +26 -0
- data/public/sandbox/api.js +1 -0
- data/spec/components/application_spec.coffee +0 -0
- data/spec/components/collection_loader_view_spec.coffee +0 -0
- data/spec/components/controller_spec.coffee +0 -0
- data/spec/components/form_view_spec.coffee +13 -0
- data/spec/components/grid_view_spec.coffee +0 -0
- data/spec/components/record_manager_spec.coffee +0 -0
- data/spec/components/template_spec.coffee +0 -0
- data/spec/containers/card_view_spec.coffee +1 -0
- data/spec/containers/column_view_spec.coffee +0 -0
- data/spec/containers/modal_view_spec.coffee +0 -0
- data/spec/containers/panel_view_spec.coffee +0 -0
- data/spec/containers/split_view_spec.coffee +0 -0
- data/spec/containers/tab_view_spec.coffee +0 -0
- data/spec/containers/viewport_spec.coffee +0 -0
- data/spec/core/collection_spec.coffee +215 -0
- data/spec/core/container_spec.coffee +0 -0
- data/spec/core/field_spec.coffee +0 -0
- data/spec/core/observer_spec.coffee +0 -0
- data/spec/core/view_spec.coffee +87 -0
- data/spec/framework_spec.coffee +48 -0
- data/spec/helper.coffee +120 -0
- data/spec/managers/collection_manager_spec.coffee +95 -0
- data/spec/managers/socket_manager_spec.coffee +0 -0
- data/src/components/application.coffee +83 -0
- data/src/components/base_toolbar.coffee +16 -0
- data/src/components/collection_loader_view.coffee +37 -0
- data/src/components/controller.coffee +41 -0
- data/src/components/fields/button_field.coffee +40 -0
- data/src/components/fields/checkbox_field.coffee +41 -0
- data/src/components/fields/file_upload_field.coffee +15 -0
- data/src/components/fields/hidden_field.coffee +18 -0
- data/src/components/fields/select_field.coffee +100 -0
- data/src/components/fields/text_area_field.coffee +43 -0
- data/src/components/fields/text_field.coffee +42 -0
- data/src/components/fields/type_ahead_field.coffee +10 -0
- data/src/components/form_button_toolbar.coffee +26 -0
- data/src/components/form_view.coffee +205 -0
- data/src/components/grid_view.coffee +208 -0
- data/src/components/record_manager.coffee +215 -0
- data/src/components/router.coffee +34 -0
- data/src/components/template.coffee +19 -0
- data/src/containers/card_view.coffee +89 -0
- data/src/containers/column_view.coffee +48 -0
- data/src/containers/modal_view.coffee +85 -0
- data/src/containers/panel_view.coffee +24 -0
- data/src/containers/split_view.coffee +12 -0
- data/src/containers/tab_view.coffee +77 -0
- data/src/containers/viewport.coffee +16 -0
- data/src/core/collection.coffee +319 -0
- data/src/core/container.coffee +256 -0
- data/src/core/field.coffee +68 -0
- data/src/core/observer.coffee +17 -0
- data/src/core/view.coffee +190 -0
- data/src/framework.coffee +110 -0
- data/src/index.coffee +255 -0
- data/src/managers/collection_manager.coffee +168 -0
- data/src/managers/socket_manager.coffee +54 -0
- data/src/modules/deferrable.coffee +18 -0
- data/src/modules/local_storage.coffee +50 -0
- data/src/stylesheets/base.scss +78 -0
- data/src/stylesheets/components/form_view.scss +54 -0
- data/src/stylesheets/components/grid_view.scss +111 -0
- data/src/stylesheets/components/toolbar.scss +15 -0
- data/src/stylesheets/containers/container.scss +7 -0
- data/src/stylesheets/containers/modal_view.scss +0 -0
- data/src/stylesheets/containers/tab_view.scss +33 -0
- data/src/stylesheets/normalize.scss +430 -0
- data/src/templates/components/bootstrap_form_controls.luca +7 -0
- data/src/templates/components/collection_loader_view.luca +5 -0
- data/src/templates/components/form_view.luca +15 -0
- data/src/templates/components/grid_view.luca +9 -0
- data/src/templates/components/grid_view_empty_text.luca +3 -0
- data/src/templates/containers/basic.luca +1 -0
- data/src/templates/containers/tab_selector_container.luca +8 -0
- data/src/templates/containers/tab_view.luca +1 -0
- data/src/templates/containers/toolbar_wrapper.luca +1 -0
- data/src/templates/fields/button_field.luca +2 -0
- data/src/templates/fields/button_field_link.luca +5 -0
- data/src/templates/fields/checkbox_field.luca +9 -0
- data/src/templates/fields/file_upload_field.luca +8 -0
- data/src/templates/fields/hidden_field.luca +1 -0
- data/src/templates/fields/select_field.luca +7 -0
- data/src/templates/fields/text_area_field.luca +8 -0
- data/src/templates/fields/text_field.luca +13 -0
- data/src/templates/sample/contents.luca +1 -0
- data/src/templates/sample/welcome.luca +1 -0
- data/vendor/assets/images/glyphicons-halflings-white.png +0 -0
- data/vendor/assets/images/glyphicons-halflings.png +0 -0
- data/vendor/assets/javascripts/luca-spec-dependencies.js +6135 -0
- data/vendor/assets/javascripts/luca-ui-base.js +1527 -0
- data/vendor/assets/javascripts/luca-ui-spec.js +3654 -0
- data/vendor/assets/javascripts/luca-ui.js +2763 -0
- data/vendor/assets/luca-ui/base.css +85 -0
- data/vendor/assets/luca-ui/components/application.js +91 -0
- data/vendor/assets/luca-ui/components/base_toolbar.js +23 -0
- data/vendor/assets/luca-ui/components/controller.js +38 -0
- data/vendor/assets/luca-ui/components/fields/button_field.js +45 -0
- data/vendor/assets/luca-ui/components/fields/checkbox_field.js +43 -0
- data/vendor/assets/luca-ui/components/fields/file_upload_field.js +20 -0
- data/vendor/assets/luca-ui/components/fields/hidden_field.js +20 -0
- data/vendor/assets/luca-ui/components/fields/select_field.js +97 -0
- data/vendor/assets/luca-ui/components/fields/text_area_field.js +48 -0
- data/vendor/assets/luca-ui/components/fields/text_field.js +46 -0
- data/vendor/assets/luca-ui/components/fields/type_ahead_field.js +13 -0
- data/vendor/assets/luca-ui/components/form_button_toolbar.js +32 -0
- data/vendor/assets/luca-ui/components/form_view.css +32 -0
- data/vendor/assets/luca-ui/components/form_view.js +207 -0
- data/vendor/assets/luca-ui/components/grid_view.css +76 -0
- data/vendor/assets/luca-ui/components/grid_view.js +202 -0
- data/vendor/assets/luca-ui/components/record_manager.js +207 -0
- data/vendor/assets/luca-ui/components/router.js +36 -0
- data/vendor/assets/luca-ui/components/template.js +26 -0
- data/vendor/assets/luca-ui/components/toolbar.css +11 -0
- data/vendor/assets/luca-ui/containers/card_view.js +98 -0
- data/vendor/assets/luca-ui/containers/column_view.js +52 -0
- data/vendor/assets/luca-ui/containers/container.css +3 -0
- data/vendor/assets/luca-ui/containers/modal_view.css +0 -0
- data/vendor/assets/luca-ui/containers/modal_view.js +87 -0
- data/vendor/assets/luca-ui/containers/panel_view.js +34 -0
- data/vendor/assets/luca-ui/containers/split_view.js +13 -0
- data/vendor/assets/luca-ui/containers/tab_view.css +16 -0
- data/vendor/assets/luca-ui/containers/tab_view.js +80 -0
- data/vendor/assets/luca-ui/containers/viewport.js +18 -0
- data/vendor/assets/luca-ui/core/collection.js +221 -0
- data/vendor/assets/luca-ui/core/container.js +205 -0
- data/vendor/assets/luca-ui/core/field.js +59 -0
- data/vendor/assets/luca-ui/core/observer.js +42 -0
- data/vendor/assets/luca-ui/core/view.js +127 -0
- data/vendor/assets/luca-ui/framework.js +110 -0
- data/vendor/assets/luca-ui/index.js +5 -0
- data/vendor/assets/luca-ui/managers/collection_manager.js +98 -0
- data/vendor/assets/luca-ui/managers/socket_manager.js +52 -0
- data/vendor/assets/luca-ui/modules/deferrable.js +21 -0
- data/vendor/assets/luca-ui/modules/local_storage.js +81 -0
- data/vendor/assets/luca-ui/normalize.css +359 -0
- data/vendor/assets/luca-ui/stylesheets/base.css +85 -0
- data/vendor/assets/luca-ui/stylesheets/components/form_view.css +32 -0
- data/vendor/assets/luca-ui/stylesheets/components/grid_view.css +76 -0
- data/vendor/assets/luca-ui/stylesheets/components/toolbar.css +11 -0
- data/vendor/assets/luca-ui/stylesheets/containers/container.css +3 -0
- data/vendor/assets/luca-ui/stylesheets/containers/modal_view.css +0 -0
- data/vendor/assets/luca-ui/stylesheets/containers/tab_view.css +16 -0
- data/vendor/assets/luca-ui/stylesheets/normalize.css +359 -0
- data/vendor/assets/luca-ui/templates/components/bootstrap_form_controls.js +4 -0
- data/vendor/assets/luca-ui/templates/components/form_view.js +4 -0
- data/vendor/assets/luca-ui/templates/components/grid_view.js +4 -0
- data/vendor/assets/luca-ui/templates/components/grid_view_empty_text.js +4 -0
- data/vendor/assets/luca-ui/templates/containers/basic.js +4 -0
- data/vendor/assets/luca-ui/templates/containers/tab_selector_container.js +4 -0
- data/vendor/assets/luca-ui/templates/containers/tab_view.js +4 -0
- data/vendor/assets/luca-ui/templates/containers/toolbar_wrapper.js +4 -0
- data/vendor/assets/luca-ui/templates/fields/button_field.js +4 -0
- data/vendor/assets/luca-ui/templates/fields/button_field_link.js +4 -0
- data/vendor/assets/luca-ui/templates/fields/checkbox_field.js +4 -0
- data/vendor/assets/luca-ui/templates/fields/file_upload_field.js +4 -0
- data/vendor/assets/luca-ui/templates/fields/hidden_field.js +4 -0
- data/vendor/assets/luca-ui/templates/fields/select_field.js +4 -0
- data/vendor/assets/luca-ui/templates/fields/text_area_field.js +4 -0
- data/vendor/assets/luca-ui/templates/fields/text_field.js +4 -0
- data/vendor/assets/luca-ui/templates/sample/contents.js +4 -0
- data/vendor/assets/luca-ui/templates/sample/welcome.js +4 -0
- data/vendor/assets/stylesheets/luca-spec-dependencies.css +166 -0
- data/vendor/assets/stylesheets/luca-ui-bootstrap.css +1201 -0
- data/vendor/assets/stylesheets/luca-ui-spec.css +586 -0
- data/vendor/assets/stylesheets/luca-ui.css +586 -0
- data/views/index.erb +20 -0
- data/views/jasmine.erb +22 -0
- data/views/spec_harness.erb +29 -0
- metadata +361 -0
@@ -0,0 +1,166 @@
|
|
1
|
+
body {
|
2
|
+
font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
|
3
|
+
}
|
4
|
+
|
5
|
+
|
6
|
+
.jasmine_reporter a:visited, .jasmine_reporter a {
|
7
|
+
color: #303;
|
8
|
+
}
|
9
|
+
|
10
|
+
.jasmine_reporter a:hover, .jasmine_reporter a:active {
|
11
|
+
color: blue;
|
12
|
+
}
|
13
|
+
|
14
|
+
.run_spec {
|
15
|
+
float:right;
|
16
|
+
padding-right: 5px;
|
17
|
+
font-size: .8em;
|
18
|
+
text-decoration: none;
|
19
|
+
}
|
20
|
+
|
21
|
+
.jasmine_reporter {
|
22
|
+
margin: 0 5px;
|
23
|
+
}
|
24
|
+
|
25
|
+
.banner {
|
26
|
+
color: #303;
|
27
|
+
background-color: #fef;
|
28
|
+
padding: 5px;
|
29
|
+
}
|
30
|
+
|
31
|
+
.logo {
|
32
|
+
float: left;
|
33
|
+
font-size: 1.1em;
|
34
|
+
padding-left: 5px;
|
35
|
+
}
|
36
|
+
|
37
|
+
.logo .version {
|
38
|
+
font-size: .6em;
|
39
|
+
padding-left: 1em;
|
40
|
+
}
|
41
|
+
|
42
|
+
.runner.running {
|
43
|
+
background-color: yellow;
|
44
|
+
}
|
45
|
+
|
46
|
+
|
47
|
+
.options {
|
48
|
+
text-align: right;
|
49
|
+
font-size: .8em;
|
50
|
+
}
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
55
|
+
.suite {
|
56
|
+
border: 1px outset gray;
|
57
|
+
margin: 5px 0;
|
58
|
+
padding-left: 1em;
|
59
|
+
}
|
60
|
+
|
61
|
+
.suite .suite {
|
62
|
+
margin: 5px;
|
63
|
+
}
|
64
|
+
|
65
|
+
.suite.passed {
|
66
|
+
background-color: #dfd;
|
67
|
+
}
|
68
|
+
|
69
|
+
.suite.failed {
|
70
|
+
background-color: #fdd;
|
71
|
+
}
|
72
|
+
|
73
|
+
.spec {
|
74
|
+
margin: 5px;
|
75
|
+
padding-left: 1em;
|
76
|
+
clear: both;
|
77
|
+
}
|
78
|
+
|
79
|
+
.spec.failed, .spec.passed, .spec.skipped {
|
80
|
+
padding-bottom: 5px;
|
81
|
+
border: 1px solid gray;
|
82
|
+
}
|
83
|
+
|
84
|
+
.spec.failed {
|
85
|
+
background-color: #fbb;
|
86
|
+
border-color: red;
|
87
|
+
}
|
88
|
+
|
89
|
+
.spec.passed {
|
90
|
+
background-color: #bfb;
|
91
|
+
border-color: green;
|
92
|
+
}
|
93
|
+
|
94
|
+
.spec.skipped {
|
95
|
+
background-color: #bbb;
|
96
|
+
}
|
97
|
+
|
98
|
+
.messages {
|
99
|
+
border-left: 1px dashed gray;
|
100
|
+
padding-left: 1em;
|
101
|
+
padding-right: 1em;
|
102
|
+
}
|
103
|
+
|
104
|
+
.passed {
|
105
|
+
background-color: #cfc;
|
106
|
+
display: none;
|
107
|
+
}
|
108
|
+
|
109
|
+
.failed {
|
110
|
+
background-color: #fbb;
|
111
|
+
}
|
112
|
+
|
113
|
+
.skipped {
|
114
|
+
color: #777;
|
115
|
+
background-color: #eee;
|
116
|
+
display: none;
|
117
|
+
}
|
118
|
+
|
119
|
+
|
120
|
+
/*.resultMessage {*/
|
121
|
+
/*white-space: pre;*/
|
122
|
+
/*}*/
|
123
|
+
|
124
|
+
.resultMessage span.result {
|
125
|
+
display: block;
|
126
|
+
line-height: 2em;
|
127
|
+
color: black;
|
128
|
+
}
|
129
|
+
|
130
|
+
.resultMessage .mismatch {
|
131
|
+
color: black;
|
132
|
+
}
|
133
|
+
|
134
|
+
.stackTrace {
|
135
|
+
white-space: pre;
|
136
|
+
font-size: .8em;
|
137
|
+
margin-left: 10px;
|
138
|
+
max-height: 5em;
|
139
|
+
overflow: auto;
|
140
|
+
border: 1px inset red;
|
141
|
+
padding: 1em;
|
142
|
+
background: #eef;
|
143
|
+
}
|
144
|
+
|
145
|
+
.finished-at {
|
146
|
+
padding-left: 1em;
|
147
|
+
font-size: .6em;
|
148
|
+
}
|
149
|
+
|
150
|
+
.show-passed .passed,
|
151
|
+
.show-skipped .skipped {
|
152
|
+
display: block;
|
153
|
+
}
|
154
|
+
|
155
|
+
|
156
|
+
#jasmine_content {
|
157
|
+
position:fixed;
|
158
|
+
right: 100%;
|
159
|
+
}
|
160
|
+
|
161
|
+
.runner {
|
162
|
+
border: 1px solid gray;
|
163
|
+
display: block;
|
164
|
+
margin: 5px 0;
|
165
|
+
padding: 2px 0 2px 10px;
|
166
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
/* desert scheme ported from vim to google prettify */
|
2
|
+
pre { display: block; background-color: #333 }
|
3
|
+
pre .nocode { background-color: none; color: #000 }
|
4
|
+
pre .str { color: #ffa0a0 } /* string - pink */
|
5
|
+
pre .kwd { color: #f0e68c; font-weight: bold }
|
6
|
+
pre .com { color: #87ceeb } /* comment - skyblue */
|
7
|
+
pre .typ { color: #98fb98 } /* type - lightgreen */
|
8
|
+
pre .lit { color: #cd5c5c } /* literal - darkred */
|
9
|
+
pre .pun { color: #fff } /* punctuation */
|
10
|
+
pre .pln { color: #fff } /* plaintext */
|
11
|
+
pre .tag { color: #f0e68c; font-weight: bold } /* html/xml tag - lightyellow */
|
12
|
+
pre .atn { color: #bdb76b; font-weight: bold } /* attribute name - khaki */
|
13
|
+
pre .atv { color: #ffa0a0 } /* attribute value - pink */
|
14
|
+
pre .dec { color: #98fb98 } /* decimal - lightgreen */
|
15
|
+
|
16
|
+
/* Specify class=linenums on a pre to get line numbering */
|
17
|
+
ol.linenums { margin-top: 0; margin-bottom: 0; color: #AEAEAE } /* IE indents via margin-left */
|
18
|
+
li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8 { list-style-type: none }
|
19
|
+
/* Alternate shading for lines */
|
20
|
+
li.L1,li.L3,li.L5,li.L7,li.L9 { }
|
21
|
+
|
22
|
+
@media print {
|
23
|
+
pre { background-color: none }
|
24
|
+
pre .str, code .str { color: #060 }
|
25
|
+
pre .kwd, code .kwd { color: #006; font-weight: bold }
|
26
|
+
pre .com, code .com { color: #600; font-style: italic }
|
27
|
+
pre .typ, code .typ { color: #404; font-weight: bold }
|
28
|
+
pre .lit, code .lit { color: #044 }
|
29
|
+
pre .pun, code .pun { color: #440 }
|
30
|
+
pre .pln, code .pln { color: #000 }
|
31
|
+
pre .tag, code .tag { color: #006; font-weight: bold }
|
32
|
+
pre .atn, code .atn { color: #404 }
|
33
|
+
pre .atv, code .atv { color: #060 }
|
34
|
+
}
|
35
|
+
|
36
|
+
pre.prettyprint li {
|
37
|
+
font-family: 'Monaco';
|
38
|
+
font-size: 20px;
|
39
|
+
line-height: 24px;
|
40
|
+
}
|
data/config.ru
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require './app'
|
2
|
+
|
3
|
+
# I'm leaning more towards not mounting the sprockets rack application and just relying on the precompiler with guard.
|
4
|
+
# If you want to mount the Sprockets Rack Application, uncomment the following lines:
|
5
|
+
map "/assets" do
|
6
|
+
run App.sprockets
|
7
|
+
end
|
8
|
+
|
9
|
+
map "/" do
|
10
|
+
run App
|
11
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
|
3
|
+
module Luca
|
4
|
+
class CommandLine
|
5
|
+
BANNER = <<-EOS
|
6
|
+
luca-ui generator
|
7
|
+
|
8
|
+
used to generate an application skeleton, or components
|
9
|
+
|
10
|
+
example:
|
11
|
+
|
12
|
+
luca new MyApp
|
13
|
+
|
14
|
+
EOS
|
15
|
+
|
16
|
+
attr_accessor :keystore, :arguments
|
17
|
+
|
18
|
+
GRAMMAR = %w{}
|
19
|
+
|
20
|
+
def initialize arguments=[]
|
21
|
+
arguments = arguments.split if arguments.is_a? String
|
22
|
+
parse_options arguments
|
23
|
+
|
24
|
+
if !@options[:action]
|
25
|
+
puts @option_parser.banner
|
26
|
+
exit
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def options
|
31
|
+
@options
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse_options arguments=[]
|
35
|
+
@options = {}
|
36
|
+
|
37
|
+
@option_parser = OptionParser.new do |opts|
|
38
|
+
opts.separator ""
|
39
|
+
opts.separator "Actions:"
|
40
|
+
|
41
|
+
opts.on("-n",'--new APPLICATION_NAME','Create a new luca-ui app skeleton') do |s|
|
42
|
+
@options[:action] = "new"
|
43
|
+
end
|
44
|
+
|
45
|
+
opts.separator ""
|
46
|
+
opts.separator "Common Options:"
|
47
|
+
|
48
|
+
opts.on_tail("-h","--help",'You are looking at it') do
|
49
|
+
puts opts
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
|
53
|
+
opts.on_tail('-v','--version','display Sentry version') do
|
54
|
+
puts "Luca Version #{ Luca::VERSION }"
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
@option_parser.banner = BANNER
|
60
|
+
|
61
|
+
arguments.collect! do |arg|
|
62
|
+
GRAMMAR.include?(arg.downcase) ? "--#{ arg.downcase }" : arg
|
63
|
+
end
|
64
|
+
|
65
|
+
@option_parser.parse!( arguments )
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Luca
|
2
|
+
module Rails
|
3
|
+
class Engine < ::Rails::Engine
|
4
|
+
initializer "luca.register_template" do |app|
|
5
|
+
app.assets.register_engine ".luca", Luca::Template
|
6
|
+
Luca::TestHarness.set(:sprockets,app.assets)
|
7
|
+
Luca::TestHarness.set :root, File.expand_path('../../../../', __FILE__)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
data/lib/luca/rails.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'tilt'
|
2
|
+
|
3
|
+
module Luca
|
4
|
+
class Template < Tilt::Template
|
5
|
+
attr_accessor :namespace
|
6
|
+
def self.default_mime_type
|
7
|
+
'application/javascript'
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.engine_initialized?
|
11
|
+
defined? ::EJS
|
12
|
+
defined? ::Haml
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize_engine
|
16
|
+
require_template_library 'ejs'
|
17
|
+
require_template_library 'haml'
|
18
|
+
end
|
19
|
+
|
20
|
+
def prepare
|
21
|
+
options = @options.merge(:filename => eval_file, :line => line, :escape_attrs => false)
|
22
|
+
@engine = ::Haml::Engine.new(data, options)
|
23
|
+
self.namespace = "window.JST"
|
24
|
+
end
|
25
|
+
|
26
|
+
def evaluate(scope, locals, &block)
|
27
|
+
compiled = @engine.render(scope, locals, &block)
|
28
|
+
code = EJS.compile(compiled)
|
29
|
+
tmpl = scope.logical_path
|
30
|
+
|
31
|
+
tmpl.gsub! /^.*\/templates\//, ''
|
32
|
+
|
33
|
+
<<-JST
|
34
|
+
|
35
|
+
(function() {
|
36
|
+
#{namespace} || (#{namespace} = {});
|
37
|
+
#{namespace}[#{ tmpl.inspect }] = #{indent(code)};
|
38
|
+
}).call(this);
|
39
|
+
|
40
|
+
JST
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def indent(string)
|
46
|
+
string.gsub(/$(.)/m, "\\1 ").strip
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
|
3
|
+
module Luca
|
4
|
+
module AssetHelpers
|
5
|
+
def asset_path(source)
|
6
|
+
"/assets/" + settings.sprockets.find_asset(source).digest_path
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class TestHarness < Sinatra::Base
|
11
|
+
|
12
|
+
class << self
|
13
|
+
attr_accessor :config_file, :spec_environment
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.parse_configuration_file
|
17
|
+
self.spec_environment = YAML.load_file(config_file)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.configure!
|
21
|
+
spec_javascripts = File.join(::Rails.root,'spec','javascripts')
|
22
|
+
locations = [ File.join(spec_javascripts,'luca.yml'), File.join(::Rails.root,'config','luca.yml') ]
|
23
|
+
|
24
|
+
@config_file = locations.detect {|f| File.exists?(f) }
|
25
|
+
|
26
|
+
tmp_path = File.join(::Rails.root,'tmp')
|
27
|
+
|
28
|
+
unless sprockets.paths.include?(spec_javascripts)
|
29
|
+
sprockets.append_path(spec_javascripts)
|
30
|
+
end
|
31
|
+
|
32
|
+
unless sprockets.paths.include?(tmp_path)
|
33
|
+
sprockets.append_path( tmp_path )
|
34
|
+
end
|
35
|
+
|
36
|
+
if File.exists?( @config_file )
|
37
|
+
parse_configuration_file
|
38
|
+
else
|
39
|
+
# TODO - Provide error output to the test harness URL with instructions
|
40
|
+
# in the case the luca.yml config file does not exist
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.load_environment
|
45
|
+
configure!
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.get_suite application
|
49
|
+
@suite ||= load_environment.try(:[],"apps").try(:[], application)
|
50
|
+
end
|
51
|
+
|
52
|
+
# which files contain the actual specs
|
53
|
+
def self.get_specs application
|
54
|
+
get_suite( application ).try(:[],"specs") || []
|
55
|
+
end
|
56
|
+
|
57
|
+
# which stylesheets ( if any ) are required to serve the spec harness
|
58
|
+
def self.get_stylesheets application
|
59
|
+
get_suite( application ).try(:[],"stylesheets") || []
|
60
|
+
end
|
61
|
+
|
62
|
+
# which javascripts should we build and serve into a sprockets manifest
|
63
|
+
def self.get_javascripts application
|
64
|
+
get_suite( application ).try(:[],"scripts") || []
|
65
|
+
end
|
66
|
+
|
67
|
+
# which assets to include directly
|
68
|
+
def self.get_assets application
|
69
|
+
get_suite( application ).try(:[],"assets") || []
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.create_tempfile type, contents
|
73
|
+
filename = File.join(::Rails.root,'tmp', rand(8**8).to_s(10) + ".#{ type }" )
|
74
|
+
File.open(filename,'w+') {|fh| fh.puts(contents)}
|
75
|
+
filename
|
76
|
+
end
|
77
|
+
|
78
|
+
get "/specs/:application/specs_manifest.js" do
|
79
|
+
@javascripts = self.class.get_specs( params[:application] )
|
80
|
+
template_file = File.join(self.class.root,'lib','templates','spec_manifest_javascripts.erb')
|
81
|
+
@temp_file = self.class.create_tempfile( 'js', ERB.new( IO.read(template_file) ).result( binding ) )
|
82
|
+
|
83
|
+
self.class.sprockets[ @temp_file ].to_s
|
84
|
+
end
|
85
|
+
|
86
|
+
get "/specs/:application/manifest.css" do
|
87
|
+
@stylesheets = self.class.get_stylesheets( params[:application] )
|
88
|
+
template_file = File.join(self.class.root,'lib','templates','spec_manifest_stylesheets.erb')
|
89
|
+
@temp_file = self.class.create_tempfile( 'css', ERB.new( IO.read(template_file) ).result( binding ) )
|
90
|
+
|
91
|
+
self.class.sprockets[ @temp_file ].to_s
|
92
|
+
end
|
93
|
+
|
94
|
+
get "/specs/:application/manifest.js" do
|
95
|
+
@javascripts = self.class.get_javascripts( params[:application] )
|
96
|
+
template_file = File.join(self.class.root,'lib','templates','spec_manifest_javascripts.erb')
|
97
|
+
@temp_file = self.class.create_tempfile( 'js', ERB.new( IO.read(template_file) ).result( binding ) )
|
98
|
+
self.class.sprockets[ @temp_file ].to_s
|
99
|
+
end
|
100
|
+
|
101
|
+
get "/specs/:application" do
|
102
|
+
@assets = self.class.get_assets( params[:application] )
|
103
|
+
erb :spec_harness
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/lib/luca.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'luca/rails'
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'tilt'
|
2
|
+
|
3
|
+
module Sprockets
|
4
|
+
class LucaTemplate < Tilt::Template
|
5
|
+
attr_accessor :namespace
|
6
|
+
def self.default_mime_type
|
7
|
+
'application/javascript'
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.engine_initialized?
|
11
|
+
defined? ::EJS
|
12
|
+
defined? ::Haml
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize_engine
|
16
|
+
require_template_library 'ejs'
|
17
|
+
require_template_library 'haml'
|
18
|
+
end
|
19
|
+
|
20
|
+
def prepare
|
21
|
+
options = @options.merge(:filename => eval_file, :line => line, :escape_attrs => false)
|
22
|
+
@engine = ::Haml::Engine.new(data, options)
|
23
|
+
self.namespace = "Luca.templates"
|
24
|
+
end
|
25
|
+
|
26
|
+
def evaluate(scope, locals, &block)
|
27
|
+
compiled = @engine.render(scope, locals, &block)
|
28
|
+
code = EJS.compile(compiled)
|
29
|
+
tmpl = scope.logical_path
|
30
|
+
|
31
|
+
tmpl.gsub! /^.*\/templates\//, ''
|
32
|
+
|
33
|
+
<<-JST
|
34
|
+
(function() {
|
35
|
+
#{namespace} || (#{namespace} = {});
|
36
|
+
#{namespace}[#{ tmpl.inspect }] = #{indent(code)};
|
37
|
+
}).call(this);
|
38
|
+
JST
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def indent(string)
|
44
|
+
string.gsub(/$(.)/m, "\\1 ").strip
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
data/luca.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/luca/rails/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "luca"
|
6
|
+
s.version = Luca::Rails::VERSION
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = ["Jonathan Soeder"]
|
9
|
+
s.email = ["jonathan.soeder@gmail.com"]
|
10
|
+
s.homepage = "http://datapimp.github.com/luca"
|
11
|
+
s.summary = "A Backbone.JS Component Framework"
|
12
|
+
s.description = "This gem allows you to use the luca-ui backbone.js component framework easily with the assets pipeline"
|
13
|
+
|
14
|
+
s.required_rubygems_version = ">= 1.3.6"
|
15
|
+
|
16
|
+
s.add_dependency "railties", "~> 3.1"
|
17
|
+
s.add_dependency "thor", "~> 0.14"
|
18
|
+
s.add_dependency "sinatra", ">= 0.9.2"
|
19
|
+
s.add_development_dependency "bundler", "~> 1.0.0"
|
20
|
+
s.add_development_dependency "rails", "~> 3.1"
|
21
|
+
|
22
|
+
s.files = `git ls-files`.split("\n")
|
23
|
+
s.executables = `git ls-files`.split("\n").select{|f| f =~ /^bin/}
|
24
|
+
s.require_paths = ['lib']
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
2
|
+
"http://www.w3.org/TR/html4/loose.dtd">
|
3
|
+
<html>
|
4
|
+
<head>
|
5
|
+
<title>Jasmine Test Runner</title>
|
6
|
+
<link rel="stylesheet" type="text/css" href="../jasmine.css">
|
7
|
+
<script type="text/javascript" src="../jasmine.js"></script>
|
8
|
+
<script type="text/javascript" src="../jasmine-html.js"></script>
|
9
|
+
|
10
|
+
<!-- include source files here... -->
|
11
|
+
<script type="text/javascript" src="../dependencies.js"></script>
|
12
|
+
<script type="text/javascript" src="../javascripts/luca-ui.js"></script>
|
13
|
+
|
14
|
+
<!-- include spec files here... -->
|
15
|
+
<script type="text/javascript" src="../javascripts/luca-ui-spec.js"></script>
|
16
|
+
|
17
|
+
</head>
|
18
|
+
<body>
|
19
|
+
|
20
|
+
<script type="text/javascript">
|
21
|
+
jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
|
22
|
+
jasmine.getEnv().execute();
|
23
|
+
</script>
|
24
|
+
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
[{"name":"Franz Hintz","location":"Port Lisa","email":"troy@larkin.name","website":"www.kub.biz"},{"name":"Savion Doyle","location":"Hesselfurt","email":"edyth.schmeler@quitzon.net","website":"www.boyerbeier.name"},{"name":"Alexzander Mante","location":"Port Zane","email":"lorna.jacobs@hellerbrekke.net","website":"www.rolfsonherman.com"},{"name":"Ava Bogan","location":"West Melanychester","email":"wallace.stiedemann@rempel.net","website":"www.reinger.biz"},{"name":"Kim Gleason","location":"North Jaylanbury","email":"barney@satterfield.biz","website":"www.erdmangreen.net"},{"name":"Sarina Mraz","location":"Keithview","email":"tanya@aufderharcrist.info","website":"www.gleason.biz"},{"name":"Newton Turner","location":"Thielberg","email":"favian@cruickshank.com","website":"www.pricebarrows.biz"},{"name":"Karlie Rempel","location":"Port Caleigh","email":"rahul@vandervortbailey.info","website":"www.raynormaggio.name"},{"name":"Frankie Greenholt","location":"Nikolasbury","email":"barney_jerde@strosinleuschke.name","website":"www.stamm.name"},{"name":"Courtney Hayes","location":"McKenziebury","email":"arnoldo@gerlach.biz","website":"www.sporer.org"},{"name":"Haven Hermiston","location":"Dooleymouth","email":"mylene@feeneyjenkins.net","website":"www.koch.biz"},{"name":"Cortez McLaughlin","location":"East Gustave","email":"mina.ritchie@brown.org","website":"www.murphyward.name"},{"name":"Ambrose Anderson","location":"Roxanestad","email":"earl.wiegand@baumbach.name","website":"www.hansen.org"},{"name":"Rowland Gorczany","location":"Quigleyberg","email":"elvis_becker@corwinberge.info","website":"www.aufderhar.name"},{"name":"Lourdes Willms","location":"Hickleshire","email":"ru@marquardtmoen.biz","website":"www.mosciski.com"},{"name":"Dave Hahn","location":"Lanceview","email":"abdul.homenick@brownmckenzie.net","website":"www.fay.name"},{"name":"Weston Prosacco","location":"Maverickborough","email":"aunta.schinner@dach.biz","website":"www.gusikowskigorczany.org"},{"name":"Antone Von","location":"New Alana","email":"nicholaus_hettinger@schulist.name","website":"www.zboncak.biz"},{"name":"Pat Upton","location":"Jairofurt","email":"marcellus@nienowreynolds.info","website":"www.stroman.net"},{"name":"Clark Murazik","location":"Lake Kody","email":"jaida@heel.info","website":"www.heaney.biz"},{"name":"Patience Skiles","location":"East Travis","email":"patrick_schaden@mcglynn.com","website":"www.mraz.info"},{"name":"Lavina Jacobson","location":"Port Kristyfort","email":"eleonore@kreiger.biz","website":"www.carter.biz"},{"name":"Mike Gerlach","location":"Gutkowskichester","email":"jazlyn@hartmann.com","website":"www.huelsferry.org"},{"name":"Green Rippin","location":"South Dimitri","email":"genoveva.gibson@yost.name","website":"www.pfannerstill.com"},{"name":"Rudolph Jakubowski","location":"Port Daniellafurt","email":"bridgette_hoeger@lakin.net","website":"www.beer.net"},{"name":"Caleb Lubowitz","location":"East Whitneyborough","email":"kraig@zemlak.org","website":"www.mitchell.com"},{"name":"Araceli Monahan","location":"New Heberbury","email":"carlee@davis.org","website":"www.mohr.net"},{"name":"Ruben Wisoky","location":"VonRuedenfort","email":"adela_gusikowski@ohara.biz","website":"www.cummerata.biz"},{"name":"Earnestine Schuster","location":"Port Kieran","email":"arden@kshlerin.org","website":"www.grimesauer.com"},{"name":"Pete Predovic","location":"West Brown","email":"jeanie@rutherford.org","website":"www.thiel.net"},{"name":"Paris Koepp","location":"New Ubaldoburgh","email":"baby.gusikowski@wizatreutel.net","website":"www.pfefferjaskolski.org"},{"name":"Mozelle Boehm","location":"South Reyes","email":"kitty@rau.biz","website":"www.ritchie.net"},{"name":"Austen Baumbach","location":"Georgetteview","email":"mercedes.armstrong@haley.com","website":"www.prohaskabayer.org"},{"name":"Lavonne O'Reilly","location":"West Ella","email":"lew@rodriguez.net","website":"www.gusikowski.info"},{"name":"Mckenzie West","location":"Lake Devin","email":"trever@gerlach.net","website":"www.heller.net"},{"name":"Albertha Schowalter","location":"New Aileenshire","email":"althea_wiegand@goldner.info","website":"www.kaulke.net"},{"name":"Wilhelmine Considine","location":"Port Howard","email":"tre@cronaoberbrunner.info","website":"www.rowe.org"},{"name":"Dina Keebler","location":"Elisaburgh","email":"suzanne@oconnellwilliamson.net","website":"www.parker.org"},{"name":"Jerad Kuphal","location":"Opheliamouth","email":"antonietta_hoppe@herzog.org","website":"www.nicolas.name"},{"name":"Wallace Murazik","location":"Jackview","email":"dameon@nikolausdamore.info","website":"www.morar.info"},{"name":"Christian Hyatt","location":"Kautzershire","email":"fausto_bins@adams.info","website":"www.padberg.name"},{"name":"Kyler Rohan","location":"East Feltonview","email":"pearline@erdmanschuster.com","website":"www.runolfsdottir.com"},{"name":"Alene Walter","location":"East Devante","email":"rozella@borerrenner.info","website":"www.muller.name"},{"name":"Yessenia Veum","location":"Beattyfurt","email":"kathlyn.cremin@stiedemann.info","website":"www.bayer.com"},{"name":"Ally Gerhold","location":"Gibsonville","email":"osvaldo.torp@ullrichlegros.com","website":"www.schoen.biz"},{"name":"Ephraim Kihn","location":"Champlinview","email":"cesar@schultz.info","website":"www.schimmelaltenwerth.net"},{"name":"Flavio Donnelly","location":"New Ole","email":"reina@rau.biz","website":"www.okeefepouros.biz"},{"name":"Kristopher Hermiston","location":"Shanellebury","email":"flo@stiedemann.name","website":"www.hermanwisoky.net"},{"name":"Michale Littel","location":"Marcelinashire","email":"aliya.wyman@steuber.name","website":"www.wintheiser.biz"},{"name":"Brendon Harber","location":"East Griffin","email":"demetrius_kris@cristkaulke.org","website":"www.bruenhoppe.net"},{"name":"Kristian Runolfsdottir","location":"New Omerbury","email":"alvina@luettgen.org","website":"www.kaulkekunde.org"},{"name":"Natalia Bashirian","location":"West Camylleberg","email":"kamron@kirlin.biz","website":"www.nicolasmayer.com"},{"name":"Francisca Purdy","location":"East Lorenamouth","email":"avery@zulaufbeatty.com","website":"www.schultz.info"},{"name":"Esteban Kunze","location":"Walkerside","email":"elyse.olson@lemke.com","website":"www.kulas.com"},{"name":"Angelica Jenkins","location":"South Naomiebury","email":"luciano.parker@schadenpredovic.info","website":"www.witting.info"},{"name":"Jovanny Glover","location":"North Candidaberg","email":"marjolaine_mraz@stamm.org","website":"www.zieme.net"},{"name":"Easton Purdy","location":"Winfieldstad","email":"meta@fadel.net","website":"www.aufderhar.com"},{"name":"Markus Cremin","location":"Fernburgh","email":"deion@abshire.info","website":"www.bins.info"},{"name":"Adrian Harris","location":"Audiefurt","email":"kennedy@nitzsche.info","website":"www.labadie.com"},{"name":"Roberta Predovic","location":"Kihnville","email":"quentin@senger.biz","website":"www.stroman.org"},{"name":"Alejandrin Beatty","location":"Hauckshire","email":"jovan_prosacco@williamson.com","website":"www.haag.biz"},{"name":"Yasmeen Jewess","location":"West Jarod","email":"rhianna.spencer@homenickjohnson.net","website":"www.prosacco.biz"},{"name":"Beryl Kozey","location":"Louieburgh","email":"fern@reynoldskutch.org","website":"www.bailey.net"},{"name":"Earl Will","location":"Lake Autumn","email":"mya.spencer@boyle.biz","website":"www.stanton.org"},{"name":"Maurice Hilll","location":"Noeliaberg","email":"annalise_hahn@white.net","website":"www.cruickshank.net"},{"name":"Hiram Anderson","location":"Starkside","email":"rosina.skiles@powlowski.org","website":"www.sanford.name"},{"name":"Taryn Jewess","location":"Martamouth","email":"german@murazik.info","website":"www.farrellkirlin.biz"},{"name":"Marge Bosco","location":"New Brenda","email":"wilber_haag@hettinger.biz","website":"www.beatty.org"},{"name":"Catharine Bahringer","location":"Derekton","email":"verna@smitham.com","website":"www.grady.info"},{"name":"Eleonore Kuvalis","location":"Kendramouth","email":"laurie.greenholt@rodriguez.info","website":"www.ernserwolf.net"},{"name":"Issac Carter","location":"Allisonland","email":"laria.leuschke@nicolas.org","website":"www.shields.name"},{"name":"Terrence Wisozk","location":"East Lindsey","email":"caesar@auer.biz","website":"www.nikolaus.info"},{"name":"Donavon Morissette","location":"Staceyview","email":"adrien_altenwerth@christiansen.com","website":"www.cummings.name"},{"name":"Zelda Lindgren","location":"West Carolannetown","email":"eleanore.davis@runolfsdottir.info","website":"www.andersonhamill.org"},{"name":"Darius Bergnaum","location":"Port Jazminborough","email":"anastacio@lesch.org","website":"www.reynoldchimmel.com"},{"name":"Althea Huel","location":"East Joannyton","email":"kyler.shields@mckenzie.biz","website":"www.spencer.info"},{"name":"Esperanza Lindgren","location":"South Sincere","email":"jazlyn@heathcote.com","website":"www.rolfson.com"},{"name":"Devonte Boyer","location":"North Adrianachester","email":"petra_moriette@yundt.biz","website":"www.mraz.biz"},{"name":"Roman Heathcote","location":"North Fayeton","email":"marlin_greenholt@kshlerin.org","website":"www.harvey.com"},{"name":"Julius Barrows","location":"Stokeston","email":"estevan_borer@stoltenberg.name","website":"www.howell.org"},{"name":"Marlen Kub","location":"Metaview","email":"vivien.halvorson@roberts.biz","website":"www.schustergusikowski.net"},{"name":"Gwen Fisher","location":"Leannonchester","email":"sherwood@cartwrightlynch.name","website":"www.keelinghyatt.net"},{"name":"Ariel Davis","location":"Garlandchester","email":"reina_mann@strosin.name","website":"www.ko.info"},{"name":"Ceasar Breitenberg","location":"West Sigmund","email":"rex.blanda@fritsch.biz","website":"www.padberg.biz"},{"name":"Olin Weimann","location":"Port Jeffmouth","email":"dimitri.mclaughlin@hoeger.com","website":"www.schmeler.org"},{"name":"Cara Jones","location":"Keelingfort","email":"hubert.crist@goldner.name","website":"www.bailey.biz"},{"name":"Cesar Nicolas","location":"Kesslerside","email":"beaulah@waters.com","website":"www.kerluke.info"},{"name":"Elise Reynolds","location":"Norbertoton","email":"fanny@breitenberg.com","website":"www.durgan.org"},{"name":"Oswaldo Haag","location":"North Dahliaton","email":"rhett.bogan@abshire.biz","website":"www.heelrohan.net"},{"name":"Amya Veum","location":"Estellaton","email":"stewart@hammeskuhlman.org","website":"www.boganschmeler.org"},{"name":"Mable Williamson","location":"East Jaycefurt","email":"vernie@klingrowe.biz","website":"www.larkin.name"},{"name":"Orlo Simonis","location":"Gloverbury","email":"jacques@dietrich.org","website":"www.jones.info"},{"name":"Loyal Collier","location":"Isobelland","email":"abdiel_torp@okeefe.com","website":"www.hagenesjewe.name"},{"name":"Evelyn Okuneva","location":"New Cade","email":"robin@wunsch.biz","website":"www.wolff.info"},{"name":"Justina Swift","location":"East Masonland","email":"stephan@wilkinsonhermann.biz","website":"www.bernier.biz"},{"name":"Jayde Lehner","location":"Svenview","email":"ivory@wehner.org","website":"www.rowe.name"},{"name":"Ima Murray","location":"Port Ronny","email":"marcelino.schumm@trantow.net","website":"www.ryan.info"},{"name":"Ignatius Kunze","location":"Mablemouth","email":"connor.ferry@bednar.info","website":"www.beahan.biz"},{"name":"Alexie Kohler","location":"South Zaria","email":"leonardo@dibbert.com","website":"www.beier.biz"},{"name":"Lorena Mohr","location":"Port Rachelleport","email":"jerrell_lockman@turner.org","website":"www.hane.name"}]
|
File without changes
|
File without changes
|