similatron 0.1.1 → 0.2.0

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 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