similatron 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f676649095b87596ec9c42ff37d16066e10e90c
4
- data.tar.gz: b44f328dba0dc07eafe6f478d0ba9c49a2fe86ab
3
+ metadata.gz: 2a36400feaf7447c34873cbe4ce83ab5baa82ecc
4
+ data.tar.gz: d13fe750eca27fe5884702222ee205dd49088141
5
5
  SHA512:
6
- metadata.gz: 936419756140ab8adc5ef7cc7ab0defd458f12afab9f20d406c02eab63f9ff37abb9fe55fc650f0a7871ab0e8f2d4013cc0e04bebd8573da8baac3b991e71b9d
7
- data.tar.gz: fac95688369f2abaf5f9ec8bba9b47482eb060f122ef48fd4eb217043ea8933c3b2f7d92bcd4452d8bf2c66a82861d1a123778f6a10fdc3ca894dc341307c1c4
6
+ metadata.gz: e49097c364a0b10649bed06d11c9b410d62c8e2f6252e6784361ed1119fd22e3d2f9a59db59ccbc7c5a6c32e8d7813289d7fa71b4c4579de34b66e24fd3bd1c6
7
+ data.tar.gz: 0186035c4d803584ebf74b06d81455bfdeb640b4e1259dca171e2f36b509e8694821ca21d575b30405c9e1593bf18d3aca2a4f413f72d96715b054c573f14011
@@ -0,0 +1,427 @@
1
+ /*! normalize.css v3.0.2 | MIT License | git.io/normalize */
2
+
3
+ /**
4
+ * 1. Set default font family to sans-serif.
5
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
6
+ * user zoom.
7
+ */
8
+
9
+ html {
10
+ font-family: sans-serif; /* 1 */
11
+ -ms-text-size-adjust: 100%; /* 2 */
12
+ -webkit-text-size-adjust: 100%; /* 2 */
13
+ }
14
+
15
+ /**
16
+ * Remove default margin.
17
+ */
18
+
19
+ body {
20
+ margin: 0;
21
+ }
22
+
23
+ /* HTML5 display definitions
24
+ ========================================================================== */
25
+
26
+ /**
27
+ * Correct `block` display not defined for any HTML5 element in IE 8/9.
28
+ * Correct `block` display not defined for `details` or `summary` in IE 10/11
29
+ * and Firefox.
30
+ * Correct `block` display not defined for `main` in IE 11.
31
+ */
32
+
33
+ article,
34
+ aside,
35
+ details,
36
+ figcaption,
37
+ figure,
38
+ footer,
39
+ header,
40
+ hgroup,
41
+ main,
42
+ menu,
43
+ nav,
44
+ section,
45
+ summary {
46
+ display: block;
47
+ }
48
+
49
+ /**
50
+ * 1. Correct `inline-block` display not defined in IE 8/9.
51
+ * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
52
+ */
53
+
54
+ audio,
55
+ canvas,
56
+ progress,
57
+ video {
58
+ display: inline-block; /* 1 */
59
+ vertical-align: baseline; /* 2 */
60
+ }
61
+
62
+ /**
63
+ * Prevent modern browsers from displaying `audio` without controls.
64
+ * Remove excess height in iOS 5 devices.
65
+ */
66
+
67
+ audio:not([controls]) {
68
+ display: none;
69
+ height: 0;
70
+ }
71
+
72
+ /**
73
+ * Address `[hidden]` styling not present in IE 8/9/10.
74
+ * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.
75
+ */
76
+
77
+ [hidden],
78
+ template {
79
+ display: none;
80
+ }
81
+
82
+ /* Links
83
+ ========================================================================== */
84
+
85
+ /**
86
+ * Remove the gray background color from active links in IE 10.
87
+ */
88
+
89
+ a {
90
+ background-color: transparent;
91
+ }
92
+
93
+ /**
94
+ * Improve readability when focused and also mouse hovered in all browsers.
95
+ */
96
+
97
+ a:active,
98
+ a:hover {
99
+ outline: 0;
100
+ }
101
+
102
+ /* Text-level semantics
103
+ ========================================================================== */
104
+
105
+ /**
106
+ * Address styling not present in IE 8/9/10/11, Safari, and Chrome.
107
+ */
108
+
109
+ abbr[title] {
110
+ border-bottom: 1px dotted;
111
+ }
112
+
113
+ /**
114
+ * Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
115
+ */
116
+
117
+ b,
118
+ strong {
119
+ font-weight: bold;
120
+ }
121
+
122
+ /**
123
+ * Address styling not present in Safari and Chrome.
124
+ */
125
+
126
+ dfn {
127
+ font-style: italic;
128
+ }
129
+
130
+ /**
131
+ * Address variable `h1` font-size and margin within `section` and `article`
132
+ * contexts in Firefox 4+, Safari, and Chrome.
133
+ */
134
+
135
+ h1 {
136
+ font-size: 2em;
137
+ margin: 0.67em 0;
138
+ }
139
+
140
+ /**
141
+ * Address styling not present in IE 8/9.
142
+ */
143
+
144
+ mark {
145
+ background: #ff0;
146
+ color: #000;
147
+ }
148
+
149
+ /**
150
+ * Address inconsistent and variable font size in all browsers.
151
+ */
152
+
153
+ small {
154
+ font-size: 80%;
155
+ }
156
+
157
+ /**
158
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
159
+ */
160
+
161
+ sub,
162
+ sup {
163
+ font-size: 75%;
164
+ line-height: 0;
165
+ position: relative;
166
+ vertical-align: baseline;
167
+ }
168
+
169
+ sup {
170
+ top: -0.5em;
171
+ }
172
+
173
+ sub {
174
+ bottom: -0.25em;
175
+ }
176
+
177
+ /* Embedded content
178
+ ========================================================================== */
179
+
180
+ /**
181
+ * Remove border when inside `a` element in IE 8/9/10.
182
+ */
183
+
184
+ img {
185
+ border: 0;
186
+ }
187
+
188
+ /**
189
+ * Correct overflow not hidden in IE 9/10/11.
190
+ */
191
+
192
+ svg:not(:root) {
193
+ overflow: hidden;
194
+ }
195
+
196
+ /* Grouping content
197
+ ========================================================================== */
198
+
199
+ /**
200
+ * Address margin not present in IE 8/9 and Safari.
201
+ */
202
+
203
+ figure {
204
+ margin: 1em 40px;
205
+ }
206
+
207
+ /**
208
+ * Address differences between Firefox and other browsers.
209
+ */
210
+
211
+ hr {
212
+ -moz-box-sizing: content-box;
213
+ box-sizing: content-box;
214
+ height: 0;
215
+ }
216
+
217
+ /**
218
+ * Contain overflow in all browsers.
219
+ */
220
+
221
+ pre {
222
+ overflow: auto;
223
+ }
224
+
225
+ /**
226
+ * Address odd `em`-unit font size rendering in all browsers.
227
+ */
228
+
229
+ code,
230
+ kbd,
231
+ pre,
232
+ samp {
233
+ font-family: monospace, monospace;
234
+ font-size: 1em;
235
+ }
236
+
237
+ /* Forms
238
+ ========================================================================== */
239
+
240
+ /**
241
+ * Known limitation: by default, Chrome and Safari on OS X allow very limited
242
+ * styling of `select`, unless a `border` property is set.
243
+ */
244
+
245
+ /**
246
+ * 1. Correct color not being inherited.
247
+ * Known issue: affects color of disabled elements.
248
+ * 2. Correct font properties not being inherited.
249
+ * 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
250
+ */
251
+
252
+ button,
253
+ input,
254
+ optgroup,
255
+ select,
256
+ textarea {
257
+ color: inherit; /* 1 */
258
+ font: inherit; /* 2 */
259
+ margin: 0; /* 3 */
260
+ }
261
+
262
+ /**
263
+ * Address `overflow` set to `hidden` in IE 8/9/10/11.
264
+ */
265
+
266
+ button {
267
+ overflow: visible;
268
+ }
269
+
270
+ /**
271
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
272
+ * All other form control elements do not inherit `text-transform` values.
273
+ * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
274
+ * Correct `select` style inheritance in Firefox.
275
+ */
276
+
277
+ button,
278
+ select {
279
+ text-transform: none;
280
+ }
281
+
282
+ /**
283
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
284
+ * and `video` controls.
285
+ * 2. Correct inability to style clickable `input` types in iOS.
286
+ * 3. Improve usability and consistency of cursor style between image-type
287
+ * `input` and others.
288
+ */
289
+
290
+ button,
291
+ html input[type="button"], /* 1 */
292
+ input[type="reset"],
293
+ input[type="submit"] {
294
+ -webkit-appearance: button; /* 2 */
295
+ cursor: pointer; /* 3 */
296
+ }
297
+
298
+ /**
299
+ * Re-set default cursor for disabled elements.
300
+ */
301
+
302
+ button[disabled],
303
+ html input[disabled] {
304
+ cursor: default;
305
+ }
306
+
307
+ /**
308
+ * Remove inner padding and border in Firefox 4+.
309
+ */
310
+
311
+ button::-moz-focus-inner,
312
+ input::-moz-focus-inner {
313
+ border: 0;
314
+ padding: 0;
315
+ }
316
+
317
+ /**
318
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
319
+ * the UA stylesheet.
320
+ */
321
+
322
+ input {
323
+ line-height: normal;
324
+ }
325
+
326
+ /**
327
+ * It's recommended that you don't attempt to style these elements.
328
+ * Firefox's implementation doesn't respect box-sizing, padding, or width.
329
+ *
330
+ * 1. Address box sizing set to `content-box` in IE 8/9/10.
331
+ * 2. Remove excess padding in IE 8/9/10.
332
+ */
333
+
334
+ input[type="checkbox"],
335
+ input[type="radio"] {
336
+ box-sizing: border-box; /* 1 */
337
+ padding: 0; /* 2 */
338
+ }
339
+
340
+ /**
341
+ * Fix the cursor style for Chrome's increment/decrement buttons. For certain
342
+ * `font-size` values of the `input`, it causes the cursor style of the
343
+ * decrement button to change from `default` to `text`.
344
+ */
345
+
346
+ input[type="number"]::-webkit-inner-spin-button,
347
+ input[type="number"]::-webkit-outer-spin-button {
348
+ height: auto;
349
+ }
350
+
351
+ /**
352
+ * 1. Address `appearance` set to `searchfield` in Safari and Chrome.
353
+ * 2. Address `box-sizing` set to `border-box` in Safari and Chrome
354
+ * (include `-moz` to future-proof).
355
+ */
356
+
357
+ input[type="search"] {
358
+ -webkit-appearance: textfield; /* 1 */
359
+ -moz-box-sizing: content-box;
360
+ -webkit-box-sizing: content-box; /* 2 */
361
+ box-sizing: content-box;
362
+ }
363
+
364
+ /**
365
+ * Remove inner padding and search cancel button in Safari and Chrome on OS X.
366
+ * Safari (but not Chrome) clips the cancel button when the search input has
367
+ * padding (and `textfield` appearance).
368
+ */
369
+
370
+ input[type="search"]::-webkit-search-cancel-button,
371
+ input[type="search"]::-webkit-search-decoration {
372
+ -webkit-appearance: none;
373
+ }
374
+
375
+ /**
376
+ * Define consistent border, margin, and padding.
377
+ */
378
+
379
+ fieldset {
380
+ border: 1px solid #c0c0c0;
381
+ margin: 0 2px;
382
+ padding: 0.35em 0.625em 0.75em;
383
+ }
384
+
385
+ /**
386
+ * 1. Correct `color` not being inherited in IE 8/9/10/11.
387
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
388
+ */
389
+
390
+ legend {
391
+ border: 0; /* 1 */
392
+ padding: 0; /* 2 */
393
+ }
394
+
395
+ /**
396
+ * Remove default vertical scrollbar in IE 8/9/10/11.
397
+ */
398
+
399
+ textarea {
400
+ overflow: auto;
401
+ }
402
+
403
+ /**
404
+ * Don't inherit the `font-weight` (applied by a rule above).
405
+ * NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
406
+ */
407
+
408
+ optgroup {
409
+ font-weight: bold;
410
+ }
411
+
412
+ /* Tables
413
+ ========================================================================== */
414
+
415
+ /**
416
+ * Remove most spacing between table cells.
417
+ */
418
+
419
+ table {
420
+ border-collapse: collapse;
421
+ border-spacing: 0;
422
+ }
423
+
424
+ td,
425
+ th {
426
+ padding: 0;
427
+ }
@@ -0,0 +1,418 @@
1
+ /*
2
+ * Skeleton V2.0.4
3
+ * Copyright 2014, Dave Gamache
4
+ * www.getskeleton.com
5
+ * Free to use under the MIT license.
6
+ * http://www.opensource.org/licenses/mit-license.php
7
+ * 12/29/2014
8
+ */
9
+
10
+
11
+ /* Table of contents
12
+ ––––––––––––––––––––––––––––––––––––––––––––––––––
13
+ - Grid
14
+ - Base Styles
15
+ - Typography
16
+ - Links
17
+ - Buttons
18
+ - Forms
19
+ - Lists
20
+ - Code
21
+ - Tables
22
+ - Spacing
23
+ - Utilities
24
+ - Clearing
25
+ - Media Queries
26
+ */
27
+
28
+
29
+ /* Grid
30
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
31
+ .container {
32
+ position: relative;
33
+ width: 100%;
34
+ max-width: 960px;
35
+ margin: 0 auto;
36
+ padding: 0 20px;
37
+ box-sizing: border-box; }
38
+ .column,
39
+ .columns {
40
+ width: 100%;
41
+ float: left;
42
+ box-sizing: border-box; }
43
+
44
+ /* For devices larger than 400px */
45
+ @media (min-width: 400px) {
46
+ .container {
47
+ width: 85%;
48
+ padding: 0; }
49
+ }
50
+
51
+ /* For devices larger than 550px */
52
+ @media (min-width: 550px) {
53
+ .container {
54
+ width: 80%; }
55
+ .column,
56
+ .columns {
57
+ margin-left: 4%; }
58
+ .column:first-child,
59
+ .columns:first-child {
60
+ margin-left: 0; }
61
+
62
+ .one.column,
63
+ .one.columns { width: 4.66666666667%; }
64
+ .two.columns { width: 13.3333333333%; }
65
+ .three.columns { width: 22%; }
66
+ .four.columns { width: 30.6666666667%; }
67
+ .five.columns { width: 39.3333333333%; }
68
+ .six.columns { width: 48%; }
69
+ .seven.columns { width: 56.6666666667%; }
70
+ .eight.columns { width: 65.3333333333%; }
71
+ .nine.columns { width: 74.0%; }
72
+ .ten.columns { width: 82.6666666667%; }
73
+ .eleven.columns { width: 91.3333333333%; }
74
+ .twelve.columns { width: 100%; margin-left: 0; }
75
+
76
+ .one-third.column { width: 30.6666666667%; }
77
+ .two-thirds.column { width: 65.3333333333%; }
78
+
79
+ .one-half.column { width: 48%; }
80
+
81
+ /* Offsets */
82
+ .offset-by-one.column,
83
+ .offset-by-one.columns { margin-left: 8.66666666667%; }
84
+ .offset-by-two.column,
85
+ .offset-by-two.columns { margin-left: 17.3333333333%; }
86
+ .offset-by-three.column,
87
+ .offset-by-three.columns { margin-left: 26%; }
88
+ .offset-by-four.column,
89
+ .offset-by-four.columns { margin-left: 34.6666666667%; }
90
+ .offset-by-five.column,
91
+ .offset-by-five.columns { margin-left: 43.3333333333%; }
92
+ .offset-by-six.column,
93
+ .offset-by-six.columns { margin-left: 52%; }
94
+ .offset-by-seven.column,
95
+ .offset-by-seven.columns { margin-left: 60.6666666667%; }
96
+ .offset-by-eight.column,
97
+ .offset-by-eight.columns { margin-left: 69.3333333333%; }
98
+ .offset-by-nine.column,
99
+ .offset-by-nine.columns { margin-left: 78.0%; }
100
+ .offset-by-ten.column,
101
+ .offset-by-ten.columns { margin-left: 86.6666666667%; }
102
+ .offset-by-eleven.column,
103
+ .offset-by-eleven.columns { margin-left: 95.3333333333%; }
104
+
105
+ .offset-by-one-third.column,
106
+ .offset-by-one-third.columns { margin-left: 34.6666666667%; }
107
+ .offset-by-two-thirds.column,
108
+ .offset-by-two-thirds.columns { margin-left: 69.3333333333%; }
109
+
110
+ .offset-by-one-half.column,
111
+ .offset-by-one-half.columns { margin-left: 52%; }
112
+
113
+ }
114
+
115
+
116
+ /* Base Styles
117
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
118
+ /* NOTE
119
+ html is set to 62.5% so that all the REM measurements throughout Skeleton
120
+ are based on 10px sizing. So basically 1.5rem = 15px :) */
121
+ html {
122
+ font-size: 62.5%; }
123
+ body {
124
+ font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */
125
+ line-height: 1.6;
126
+ font-weight: 400;
127
+ font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif;
128
+ color: #222; }
129
+
130
+
131
+ /* Typography
132
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
133
+ h1, h2, h3, h4, h5, h6 {
134
+ margin-top: 0;
135
+ margin-bottom: 2rem;
136
+ font-weight: 300; }
137
+ h1 { font-size: 4.0rem; line-height: 1.2; letter-spacing: -.1rem;}
138
+ h2 { font-size: 3.6rem; line-height: 1.25; letter-spacing: -.1rem; }
139
+ h3 { font-size: 3.0rem; line-height: 1.3; letter-spacing: -.1rem; }
140
+ h4 { font-size: 2.4rem; line-height: 1.35; letter-spacing: -.08rem; }
141
+ h5 { font-size: 1.8rem; line-height: 1.5; letter-spacing: -.05rem; }
142
+ h6 { font-size: 1.5rem; line-height: 1.6; letter-spacing: 0; }
143
+
144
+ /* Larger than phablet */
145
+ @media (min-width: 550px) {
146
+ h1 { font-size: 5.0rem; }
147
+ h2 { font-size: 4.2rem; }
148
+ h3 { font-size: 3.6rem; }
149
+ h4 { font-size: 3.0rem; }
150
+ h5 { font-size: 2.4rem; }
151
+ h6 { font-size: 1.5rem; }
152
+ }
153
+
154
+ p {
155
+ margin-top: 0; }
156
+
157
+
158
+ /* Links
159
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
160
+ a {
161
+ color: #1EAEDB; }
162
+ a:hover {
163
+ color: #0FA0CE; }
164
+
165
+
166
+ /* Buttons
167
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
168
+ .button,
169
+ button,
170
+ input[type="submit"],
171
+ input[type="reset"],
172
+ input[type="button"] {
173
+ display: inline-block;
174
+ height: 38px;
175
+ padding: 0 30px;
176
+ color: #555;
177
+ text-align: center;
178
+ font-size: 11px;
179
+ font-weight: 600;
180
+ line-height: 38px;
181
+ letter-spacing: .1rem;
182
+ text-transform: uppercase;
183
+ text-decoration: none;
184
+ white-space: nowrap;
185
+ background-color: transparent;
186
+ border-radius: 4px;
187
+ border: 1px solid #bbb;
188
+ cursor: pointer;
189
+ box-sizing: border-box; }
190
+ .button:hover,
191
+ button:hover,
192
+ input[type="submit"]:hover,
193
+ input[type="reset"]:hover,
194
+ input[type="button"]:hover,
195
+ .button:focus,
196
+ button:focus,
197
+ input[type="submit"]:focus,
198
+ input[type="reset"]:focus,
199
+ input[type="button"]:focus {
200
+ color: #333;
201
+ border-color: #888;
202
+ outline: 0; }
203
+ .button.button-primary,
204
+ button.button-primary,
205
+ input[type="submit"].button-primary,
206
+ input[type="reset"].button-primary,
207
+ input[type="button"].button-primary {
208
+ color: #FFF;
209
+ background-color: #33C3F0;
210
+ border-color: #33C3F0; }
211
+ .button.button-primary:hover,
212
+ button.button-primary:hover,
213
+ input[type="submit"].button-primary:hover,
214
+ input[type="reset"].button-primary:hover,
215
+ input[type="button"].button-primary:hover,
216
+ .button.button-primary:focus,
217
+ button.button-primary:focus,
218
+ input[type="submit"].button-primary:focus,
219
+ input[type="reset"].button-primary:focus,
220
+ input[type="button"].button-primary:focus {
221
+ color: #FFF;
222
+ background-color: #1EAEDB;
223
+ border-color: #1EAEDB; }
224
+
225
+
226
+ /* Forms
227
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
228
+ input[type="email"],
229
+ input[type="number"],
230
+ input[type="search"],
231
+ input[type="text"],
232
+ input[type="tel"],
233
+ input[type="url"],
234
+ input[type="password"],
235
+ textarea,
236
+ select {
237
+ height: 38px;
238
+ padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
239
+ background-color: #fff;
240
+ border: 1px solid #D1D1D1;
241
+ border-radius: 4px;
242
+ box-shadow: none;
243
+ box-sizing: border-box; }
244
+ /* Removes awkward default styles on some inputs for iOS */
245
+ input[type="email"],
246
+ input[type="number"],
247
+ input[type="search"],
248
+ input[type="text"],
249
+ input[type="tel"],
250
+ input[type="url"],
251
+ input[type="password"],
252
+ textarea {
253
+ -webkit-appearance: none;
254
+ -moz-appearance: none;
255
+ appearance: none; }
256
+ textarea {
257
+ min-height: 65px;
258
+ padding-top: 6px;
259
+ padding-bottom: 6px; }
260
+ input[type="email"]:focus,
261
+ input[type="number"]:focus,
262
+ input[type="search"]:focus,
263
+ input[type="text"]:focus,
264
+ input[type="tel"]:focus,
265
+ input[type="url"]:focus,
266
+ input[type="password"]:focus,
267
+ textarea:focus,
268
+ select:focus {
269
+ border: 1px solid #33C3F0;
270
+ outline: 0; }
271
+ label,
272
+ legend {
273
+ display: block;
274
+ margin-bottom: .5rem;
275
+ font-weight: 600; }
276
+ fieldset {
277
+ padding: 0;
278
+ border-width: 0; }
279
+ input[type="checkbox"],
280
+ input[type="radio"] {
281
+ display: inline; }
282
+ label > .label-body {
283
+ display: inline-block;
284
+ margin-left: .5rem;
285
+ font-weight: normal; }
286
+
287
+
288
+ /* Lists
289
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
290
+ ul {
291
+ list-style: circle inside; }
292
+ ol {
293
+ list-style: decimal inside; }
294
+ ol, ul {
295
+ padding-left: 0;
296
+ margin-top: 0; }
297
+ ul ul,
298
+ ul ol,
299
+ ol ol,
300
+ ol ul {
301
+ margin: 1.5rem 0 1.5rem 3rem;
302
+ font-size: 90%; }
303
+ li {
304
+ margin-bottom: 1rem; }
305
+
306
+
307
+ /* Code
308
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
309
+ code {
310
+ padding: .2rem .5rem;
311
+ margin: 0 .2rem;
312
+ font-size: 90%;
313
+ white-space: nowrap;
314
+ background: #F1F1F1;
315
+ border: 1px solid #E1E1E1;
316
+ border-radius: 4px; }
317
+ pre > code {
318
+ display: block;
319
+ padding: 1rem 1.5rem;
320
+ white-space: pre; }
321
+
322
+
323
+ /* Tables
324
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
325
+ th,
326
+ td {
327
+ padding: 12px 15px;
328
+ text-align: left;
329
+ border-bottom: 1px solid #E1E1E1; }
330
+ th:first-child,
331
+ td:first-child {
332
+ padding-left: 0; }
333
+ th:last-child,
334
+ td:last-child {
335
+ padding-right: 0; }
336
+
337
+
338
+ /* Spacing
339
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
340
+ button,
341
+ .button {
342
+ margin-bottom: 1rem; }
343
+ input,
344
+ textarea,
345
+ select,
346
+ fieldset {
347
+ margin-bottom: 1.5rem; }
348
+ pre,
349
+ blockquote,
350
+ dl,
351
+ figure,
352
+ table,
353
+ p,
354
+ ul,
355
+ ol,
356
+ form {
357
+ margin-bottom: 2.5rem; }
358
+
359
+
360
+ /* Utilities
361
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
362
+ .u-full-width {
363
+ width: 100%;
364
+ box-sizing: border-box; }
365
+ .u-max-full-width {
366
+ max-width: 100%;
367
+ box-sizing: border-box; }
368
+ .u-pull-right {
369
+ float: right; }
370
+ .u-pull-left {
371
+ float: left; }
372
+
373
+
374
+ /* Misc
375
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
376
+ hr {
377
+ margin-top: 3rem;
378
+ margin-bottom: 3.5rem;
379
+ border-width: 0;
380
+ border-top: 1px solid #E1E1E1; }
381
+
382
+
383
+ /* Clearing
384
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
385
+
386
+ /* Self Clearing Goodness */
387
+ .container:after,
388
+ .row:after,
389
+ .u-cf {
390
+ content: "";
391
+ display: table;
392
+ clear: both; }
393
+
394
+
395
+ /* Media Queries
396
+ –––––––––––––––––––––––––––––––––––––––––––––––––– */
397
+ /*
398
+ Note: The best way to structure the use of media queries is to create the queries
399
+ near the relevant code. For example, if you wanted to change the styles for buttons
400
+ on small devices, paste the mobile query code up in the buttons section and style it
401
+ there.
402
+ */
403
+
404
+
405
+ /* Larger than mobile */
406
+ @media (min-width: 400px) {}
407
+
408
+ /* Larger than phablet (also point when grid becomes active) */
409
+ @media (min-width: 550px) {}
410
+
411
+ /* Larger than tablet */
412
+ @media (min-width: 750px) {}
413
+
414
+ /* Larger than desktop */
415
+ @media (min-width: 1000px) {}
416
+
417
+ /* Larger than Desktop HD */
418
+ @media (min-width: 1200px) {}
@@ -2,36 +2,74 @@
2
2
  <head>
3
3
  <meta charset="utf-8">
4
4
 
5
- <title>Similatron report</title>
5
+ <title>Similatron report run at <%= @run_at %></title>
6
6
  <meta name="description" content="Similatron report">
7
7
  <meta name="author" content="Similatron">
8
+ <style>
9
+ <% css_styles.each do |style| %>
10
+ <%= style %>
11
+ <% end %>
12
+
13
+ small {
14
+ font-size: 1.5rem;
15
+ }
16
+ </style>
8
17
  </head>
9
18
 
10
19
  <body>
11
- <p>
12
- Did <%= comparisons.length %> checks with <%= failed_comparisons.length %> failures and <%= overwrite_comparisons.length %> new files.
13
- </p>
14
- <ul>
15
- <% overwrite_comparisons.each do |comparison| %>
16
- <li>
17
- Original
18
- <a href="<%= comparison.expected %>">Original</a> not found, copied
19
- <a href="<%= comparison.actual %>">actual</a>.
20
- </li>
21
- <% end %>
22
- </ul>
20
+ <div class="container">
21
+ <div class="row">
22
+ <h1 class="twelve columns">
23
+ Similatron report
24
+ <small>
25
+ <%= run_at %>.
26
+ </small>
27
+ </h1>
28
+ </div>
29
+ <div class="row">
30
+ <div class="twelve columns">
31
+ <h4>
32
+ <% if ok? %>
33
+ Nothing to report!
34
+ <% else %>
35
+ Did <%= run.comparisons.length %> checks with <%= run.failed_comparisons.length %> failures
36
+ and <%= run.overwrite_comparisons.length %> new files.
37
+ <% end %>
38
+ </h4>
39
+ </div>
40
+ </div>
41
+
42
+ <div class="row">
43
+ <div class="twelve columns">
44
+ <% if overwrites? %>
45
+ <h5>Newly generated files</h5>
46
+ <ul>
47
+ <% run.overwrite_comparisons.each do |comparison| %>
48
+ <li>
49
+ Original
50
+ <a href="<%= full_path comparison.expected %>"><%= comparison.expected %></a> not found, copied
51
+ <a href="<%= full_path comparison.actual %>"><%= comparison.actual %></a>.
52
+ </li>
53
+ <% end %>
54
+ </ul>
55
+ <% end %>
23
56
 
24
- <ul>
25
- <% failed_comparisons.each do |comparison| %>
26
- <li>
27
- Failed comparison:
28
- Expected <a href="<%= comparison.expected %>">expected</a>
29
- to equal <a href="<%= comparison.actual %>">actual</a>.
30
- <% if comparison.diff %>
31
- <a href="<%= comparison.diff %>">Diff</a>.
32
- <% end %>
33
- </li>
34
- <% end %>
35
- </ul>
57
+ <% if failures? %>
58
+ <h5>Failed comparisons</h5>
59
+ <ul>
60
+ <% run.failed_comparisons.each do |comparison| %>
61
+ <li>
62
+ Expected <a href="<%= full_path comparison.expected %>"><%= comparison.expected%></a>
63
+ to equal <a href="<%= full_path comparison.actual %>"><%= comparison.actual %></a>.
64
+ <% if comparison.diff %>
65
+ <a href="<%= full_path comparison.diff %>">Check out the diff</a>.
66
+ <% end %>
67
+ </li>
68
+ <% end %>
69
+ </ul>
70
+ <%end%>
71
+ </div>
72
+ </div>
73
+ </div>
36
74
  </body>
37
75
  </html>
@@ -3,14 +3,18 @@ require 'securerandom'
3
3
  require 'open3'
4
4
  require 'json'
5
5
  require 'erb'
6
+ require 'fileutils'
7
+ require 'tmpdir'
6
8
 
7
9
  require "similatron/version"
8
10
  require "similatron/comparison"
9
11
  require "similatron/comparison_engine"
10
12
  require "similatron/imagemagick_comparison_engine"
13
+ require "similatron/pdf_comparison_engine"
11
14
  require "similatron/diff_comparison_engine"
12
15
  require "similatron/binary_diff_comparison_engine"
13
16
  require "similatron/run"
17
+ require "similatron/html_report"
14
18
 
15
19
  module Similatron
16
20
  def self.compare(*args)
@@ -29,4 +33,8 @@ module Similatron
29
33
  run
30
34
  end
31
35
  end
36
+
37
+ def self.lib_path
38
+ File.dirname(__FILE__)
39
+ end
32
40
  end
@@ -19,7 +19,7 @@ module Similatron
19
19
  "notused"
20
20
  end
21
21
 
22
- def diff(_diff_path, _exec_result)
22
+ def diff(_exec_result)
23
23
  nil
24
24
  end
25
25
 
@@ -1,12 +1,12 @@
1
1
  module Similatron
2
2
  class ComparisonEngine
3
3
  def initialize(executable_path: nil, diffs_path:)
4
- @executable_path = executable_path || "diff"
4
+ @given_executable_path = executable_path
5
5
  @diffs_path = diffs_path
6
6
  end
7
7
 
8
8
  def compare(expected:, actual:)
9
- diff_path = next_diff_path
9
+ increase_diff_index
10
10
 
11
11
  command = command(expected, actual, diff_path)
12
12
 
@@ -16,28 +16,30 @@ module Similatron
16
16
  expected: expected,
17
17
  actual: actual,
18
18
  score: score(exec_result),
19
- diff: diff(diff_path, exec_result)
19
+ diff: diff(exec_result)
20
20
  )
21
21
  end
22
22
 
23
23
  protected
24
24
 
25
- attr_reader :diffs_path, :diff_index
25
+ attr_reader :diffs_path, :diff_index, :given_executable_path
26
26
 
27
27
  def run(command)
28
28
  exec_info = Open3.capture3(command)
29
29
  Open3Result.new(*exec_info)
30
30
  end
31
31
 
32
- def next_diff_path
32
+ def increase_diff_index
33
33
  @diff_index ||= 0
34
34
  @diff_index += 1
35
+ end
35
36
 
37
+ def diff_path
36
38
  File.join(diffs_path, "diff_#{diff_index}.#{diff_extension}")
37
39
  end
38
40
 
39
41
  def executable_path
40
- default_executable_path || @executable_path
42
+ default_executable_path || given_executable_path
41
43
  end
42
44
 
43
45
  class Open3Result
@@ -19,7 +19,7 @@ module Similatron
19
19
  "diff"
20
20
  end
21
21
 
22
- def diff(diff_path, exec_result)
22
+ def diff(exec_result)
23
23
  if exec_result.status != 0
24
24
  File.write(diff_path, exec_result.out)
25
25
  diff_path
@@ -0,0 +1,45 @@
1
+ module Similatron
2
+ class HtmlReport
3
+
4
+ attr_reader :run
5
+
6
+ def initialize(run)
7
+ @run = run
8
+ @time = Time.now
9
+ end
10
+
11
+ def render
12
+ template_path = File.join(Similatron.lib_path, "assets/report.html.erb")
13
+ template = ERB.new(File.read(template_path))
14
+ template.result(binding)
15
+ end
16
+
17
+ def css_styles
18
+ ["normalize.css", "skeleton.css"].map do |file|
19
+ css_path = File.join(Similatron.lib_path, "assets/Skeleton-2.0.4/css", file)
20
+ File.read(css_path)
21
+ end
22
+ end
23
+
24
+ def full_path(path)
25
+ File.expand_path(path)
26
+ end
27
+
28
+ def run_at
29
+ @time.strftime("%b %d, %Y %H:%M")
30
+ end
31
+
32
+ def overwrites?
33
+ !run.overwrite_comparisons.empty?
34
+ end
35
+
36
+ def failures?
37
+ !run.failed_comparisons.empty?
38
+ end
39
+
40
+ def ok?
41
+ !overwrites? && !failures?
42
+ end
43
+
44
+ end
45
+ end
@@ -2,9 +2,7 @@ module Similatron
2
2
  class ImagemagickComparisonEngine < ComparisonEngine
3
3
 
4
4
  def can_handle_mime?(mime_type)
5
- [/image/, /application.pdf/].any? do |format|
6
- mime_type =~ format
7
- end
5
+ mime_type =~ /image/
8
6
  end
9
7
 
10
8
  private
@@ -21,7 +19,7 @@ module Similatron
21
19
  "#{executable_path} -metric PSNR #{expected} #{actual} #{diff_path}"
22
20
  end
23
21
 
24
- def diff(diff_path, exec_result)
22
+ def diff(exec_result)
25
23
  exec_result.status == 1 ? diff_path : nil
26
24
  end
27
25
 
@@ -0,0 +1,48 @@
1
+ module Similatron
2
+ class PdfComparisonEngine < ComparisonEngine
3
+
4
+ def can_handle_mime?(mime_type)
5
+ mime_type =~ %r{application/pdf}
6
+ end
7
+
8
+ def compare(expected:, actual:)
9
+ jpg_comparison = jpg_compare(expected: expected, actual: actual)
10
+
11
+ Comparison.new(
12
+ expected: expected,
13
+ actual: actual,
14
+ score: jpg_comparison.score,
15
+ diff: jpg_comparison.diff
16
+ )
17
+ end
18
+
19
+ private
20
+
21
+ def image_magick_engine
22
+ ImagemagickComparisonEngine.new(
23
+ executable_path: given_executable_path,
24
+ diffs_path: diffs_path
25
+ )
26
+ end
27
+
28
+ def jpg_compare(expected:, actual:)
29
+ Dir.mktmpdir do |dir|
30
+ jpg_expected = "#{dir}/expected.jpg"
31
+ jpg_actual = "#{dir}/actual.jpg"
32
+
33
+ convert(expected, jpg_expected)
34
+ convert(actual, jpg_actual)
35
+
36
+ image_magick_engine.compare(
37
+ expected: jpg_expected,
38
+ actual: jpg_actual
39
+ )
40
+ end
41
+ end
42
+
43
+ def convert(pdf, jpg)
44
+ `convert -append #{pdf} #{jpg}`
45
+ end
46
+
47
+ end
48
+ end
@@ -7,11 +7,7 @@ module Similatron
7
7
  run_id = SecureRandom.urlsafe_base64(8)
8
8
  @run_path = File.join(base_path, "run_#{run_id}")
9
9
 
10
- @engines = [
11
- ImagemagickComparisonEngine.new(diffs_path: run_path),
12
- DiffComparisonEngine.new(diffs_path: run_path),
13
- BinaryDiffComparisonEngine.new(diffs_path: run_path)
14
- ]
10
+ @engines = build_engines
15
11
 
16
12
  @comparisons = []
17
13
  FileUtils.mkdir_p(run_path)
@@ -77,6 +73,18 @@ module Similatron
77
73
  )
78
74
  end
79
75
 
76
+ def build_engines
77
+ engine_classes = [
78
+ PdfComparisonEngine,
79
+ ImagemagickComparisonEngine,
80
+ DiffComparisonEngine,
81
+ BinaryDiffComparisonEngine
82
+ ]
83
+ engine_classes.map do |engine_class|
84
+ engine_class.new(diffs_path: run_path)
85
+ end
86
+ end
87
+
80
88
  def best_engine(file)
81
89
  mime_type = `file --mime -b #{file}`.chomp
82
90
  engines.detect { |engine| engine.can_handle_mime?(mime_type) }
@@ -96,8 +104,7 @@ module Similatron
96
104
  end
97
105
 
98
106
  def to_html
99
- template = ERB.new(File.read("lib/assets/report.html.erb"))
100
- template.result(binding)
107
+ HtmlReport.new(self).render
101
108
  end
102
109
 
103
110
  def write_reports
@@ -1,3 +1,3 @@
1
1
  module Similatron
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: similatron
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Diego Guerra
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-09-16 00:00:00.000000000 Z
11
+ date: 2018-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,13 +70,17 @@ files:
70
70
  - Rakefile
71
71
  - bin/console
72
72
  - bin/setup
73
+ - lib/assets/Skeleton-2.0.4/css/normalize.css
74
+ - lib/assets/Skeleton-2.0.4/css/skeleton.css
73
75
  - lib/assets/report.html.erb
74
76
  - lib/similatron.rb
75
77
  - lib/similatron/binary_diff_comparison_engine.rb
76
78
  - lib/similatron/comparison.rb
77
79
  - lib/similatron/comparison_engine.rb
78
80
  - lib/similatron/diff_comparison_engine.rb
81
+ - lib/similatron/html_report.rb
79
82
  - lib/similatron/imagemagick_comparison_engine.rb
83
+ - lib/similatron/pdf_comparison_engine.rb
80
84
  - lib/similatron/run.rb
81
85
  - lib/similatron/version.rb
82
86
  - similatron.gemspec