copy_tuner_client 0.0.15 → 0.1.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +0 -1
  3. data/.travis.yml +5 -5
  4. data/Appraisals +10 -7
  5. data/Gemfile.lock +33 -34
  6. data/README.md +2 -16
  7. data/Rakefile +3 -1
  8. data/app/assets/javascripts/copyray.js.coffee +285 -0
  9. data/app/assets/stylesheets/copyray.css +349 -0
  10. data/copy_tuner_client.gemspec +3 -3
  11. data/features/rails.feature +2 -16
  12. data/features/step_definitions/copycopter_server_steps.rb +1 -1
  13. data/features/step_definitions/rails_steps.rb +11 -20
  14. data/features/support/rails_server.rb +4 -30
  15. data/gemfiles/{4.0.gemfile → 2.3.gemfile} +2 -2
  16. data/gemfiles/2.3.gemfile.lock +108 -0
  17. data/gemfiles/{4.1.gemfile → 3.0.gemfile} +2 -2
  18. data/gemfiles/3.0.gemfile.lock +153 -0
  19. data/gemfiles/3.1.gemfile +11 -0
  20. data/gemfiles/3.1.gemfile.lock +191 -0
  21. data/lib/copy_tuner_client/cache.rb +0 -2
  22. data/lib/copy_tuner_client/configuration.rb +4 -4
  23. data/lib/copy_tuner_client/copyray.rb +29 -0
  24. data/lib/copy_tuner_client/copyray_middleware.rb +65 -0
  25. data/lib/copy_tuner_client/engine.rb +29 -0
  26. data/lib/copy_tuner_client/i18n_backend.rb +1 -2
  27. data/lib/copy_tuner_client/rails.rb +1 -1
  28. data/lib/copy_tuner_client/simple_form_extention.rb +19 -0
  29. data/lib/copy_tuner_client/version.rb +1 -1
  30. data/spec/copy_tuner_client/cache_spec.rb +3 -15
  31. data/spec/copy_tuner_client/configuration_spec.rb +1 -1
  32. data/spec/copy_tuner_client/request_sync_spec.rb +4 -4
  33. data/spec/support/fake_copy_tuner_app.rb +11 -14
  34. metadata +25 -60
  35. data/.ruby-version +0 -1
  36. data/gemfiles/3.2.gemfile +0 -7
  37. data/lib/copy_tuner_client/railtie.rb +0 -12
@@ -0,0 +1,349 @@
1
+ @charset "UTF-8";
2
+
3
+ /* selector for element and children */
4
+ #xray-overlay, #xray-overlay *, #xray-overlay a:hover, #xray-overlay a:visited, #xray-overlay a:active,
5
+ #xray-bar, #xray-bar *, #xray-bar a:hover, #xray-bar a:visited, #xray-bar a:active {
6
+ background:none;
7
+ border:none;
8
+ bottom:auto;
9
+ clear:none;
10
+ cursor:default;
11
+ float:none;
12
+ font-family:Arial, Helvetica, sans-serif;
13
+ font-size:medium;
14
+ font-style:normal;
15
+ font-weight:normal;
16
+ height:auto;
17
+ left:auto;
18
+ letter-spacing:normal;
19
+ line-height:normal;
20
+ max-height:none;
21
+ max-width:none;
22
+ min-height:0;
23
+ min-width:0;
24
+ overflow:visible;
25
+ position:static;
26
+ right:auto;
27
+ text-align:left;
28
+ text-decoration:none;
29
+ text-indent:0;
30
+ text-transform:none;
31
+ top:auto;
32
+ visibility:visible;
33
+ white-space:normal;
34
+ width:auto;
35
+ z-index:auto;
36
+ }
37
+
38
+ #xray-overlay {
39
+ position: fixed; left: 0; top: 0; bottom: 0; right: 0;
40
+ background: rgba(0,0,0,0.7);
41
+ background: -webkit-radial-gradient(center, ellipse cover, rgba(0,0,0,0.4) 10%, rgba(0,0,0,0.8) 100%);
42
+ z-index: 9000;
43
+ }
44
+
45
+ .xray-specimen {
46
+ position: absolute;
47
+ background: rgba(255,255,255,0.15);
48
+ outline: 1px solid rgba(255,255,255,0.8);
49
+ outline-offset: -1px;
50
+ color: #666;
51
+ font-family: "Helvetica Neue", sans-serif;
52
+ font-size: 13px;
53
+ box-shadow: 0 1px 3px rgba(0,0,0,0.7);
54
+ }
55
+
56
+ .xray-specimen:hover {
57
+ cursor: pointer;
58
+ background: rgba(255,255,255,0.4);
59
+ }
60
+
61
+ .xray-specimen.TemplateSpecimen {
62
+ outline: 1px solid rgba(255,50,50,0.8);
63
+ background: rgba(255,50,50,0.1);
64
+ }
65
+
66
+ .xray-specimen.TemplateSpecimen:hover {
67
+ background: rgba(255,50,50,0.4);
68
+ }
69
+
70
+ .xray-specimen-handle {
71
+ float:left;
72
+ background: #fff;
73
+ padding: 0 3px;
74
+ color: #333;
75
+ font-size: 10px;
76
+ }
77
+
78
+ .xray-specimen-handle.TemplateSpecimen {
79
+ background: rgba(255,50,50,0.8);
80
+ color: #fff;
81
+ }
82
+
83
+ #xray-bar {
84
+ position: fixed;
85
+ left: 0;
86
+ right: 0;
87
+ bottom: 0;
88
+ height: 40px;
89
+ padding: 0 8px;
90
+ background: #222;
91
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
92
+ font-weight: 200;
93
+ color: #fff;
94
+ z-index: 10000;
95
+ box-shadow: 0 -1px 0 rgba(255,255,255,0.1), inset 0 2px 6px rgba(0,0,0,0.8);
96
+ background-image: linear-gradient(rgba(0,0,0,0), rgba(0,0,0,0.3)),
97
+ url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDRkNBMTUwNzdGRTIxMUUyQjBGQ0NBRTc5RDQ3MEJFNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDRkNBMTUwODdGRTIxMUUyQjBGQ0NBRTc5RDQ3MEJFNSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkNGQ0ExNTA1N0ZFMjExRTJCMEZDQ0FFNzlENDcwQkU1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkNGQ0ExNTA2N0ZFMjExRTJCMEZDQ0FFNzlENDcwQkU1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+aIv7XwAAAEVJREFUeNpiFBMTY2BgEBISYsAGWICAATdgkZeXB1Lv37/HLo1LAgKYGPACdOl3YIAwHNOpKFw0aTSXokujuZSA0wACDABh2BIyJ1wQkwAAAABJRU5ErkJggg==);
98
+ }
99
+
100
+ @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
101
+ #xray-bar {
102
+ background-image: linear-gradient(rgba(0,0,0,0), rgba(0,0,0,0.3)),
103
+ url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0Q0ZGQkRGRTdGRTMxMUUyQjBGQ0NBRTc5RDQ3MEJFNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0Q0ZGQkRGRjdGRTMxMUUyQjBGQ0NBRTc5RDQ3MEJFNSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkNGQ0ExNTA5N0ZFMjExRTJCMEZDQ0FFNzlENDcwQkU1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkNGQ0ExNTBBN0ZFMjExRTJCMEZDQ0FFNzlENDcwQkU1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+T6y4zwAAAIZJREFUeNrkkjEKwCAMRWMbERw8gE5O3v9q6lIEbbDQMZJ2Kv0gBOSR8HkqxphzBgDnnDEGJNkRsfc+xmitWWtF8KaUuqZ7EMDee1qutQ4hSGGkl1Kis2utYviYgUfZ4EU+CiP/TV0y/i02l1L6DA3is3n/FjDvHy5bYfxbF8b490fDTgEGAJveOCvuYEabAAAAAElFTkSuQmCC);
104
+ background-size: auto, 10px 10px;
105
+ }
106
+ }
107
+
108
+ #xray-bar .xray-bar-btn {
109
+ position: relative;
110
+ color: #fff;
111
+ margin: 8px 1px;
112
+ height: 24px;
113
+ line-height: 24px;
114
+ padding: 0 8px;
115
+ float: left;
116
+ font-size: 14px;
117
+ cursor: pointer;
118
+ vertical-align: middle;
119
+ background-color: #444;
120
+ background-image: linear-gradient(rgba(0,0,0,0), rgba(0,0,0,0.2));
121
+ border-radius: 2px;
122
+ box-shadow: 1px 1px 1px rgba(0,0,0,0.5),
123
+ inset 0 1px 0 rgba(255, 255, 255, 0.2),
124
+ inset 0 0 2px rgba(255, 255, 255, 0.2);
125
+ text-shadow: 0 -1px 0 rgba(0,0,0,0.4);
126
+ transition: background-color 0.1s;
127
+ }
128
+
129
+ #xray-bar .xray-bar-btn b {
130
+ position: absolute;
131
+ display: block;
132
+ right: -19px;
133
+ top: 0;
134
+ width: 20px;
135
+ height: 24px;
136
+ z-index: 10;
137
+ overflow: hidden;
138
+ font-size: 44px;
139
+ line-height: 19px;
140
+ text-indent: -7px;
141
+ }
142
+
143
+ #xray-bar .xray-bar-btn b:before {
144
+ content: "";
145
+ width: 18px;
146
+ height: 18px;
147
+ display: block;
148
+ position: absolute;
149
+ left: -9px;
150
+ top: 3px;
151
+ border-radius: 2px;
152
+ box-shadow: 1px -1px 1px rgba(0,0,0,0.5), inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0 2px rgba(255, 255, 255, 0.2);
153
+ background-image: linear-gradient(135deg, rgba(0,0,0,0), rgba(0,0,0,0.2));
154
+ -webkit-transform: rotate(45deg);
155
+ transform: rotate(45deg);
156
+ transition: background-color 0.1s;
157
+ }
158
+
159
+ #xray-bar .xray-bar-btn:hover {
160
+ background-color: #555;
161
+ }
162
+
163
+ #xray-bar #xray-bar-controller-path {
164
+ margin-right: 20px;
165
+ }
166
+
167
+ #xray-bar #xray-bar-controller-path .xray-bar-btn {
168
+ border-radius: 2px 0 0 2px;
169
+ padding: 0 6px 0 16px;
170
+ margin: 8px 1px 8px 0;
171
+ }
172
+
173
+ #xray-bar #xray-bar-controller-path .xray-bar-btn:first-child {
174
+ padding-left: 8px;
175
+ }
176
+
177
+ #xray-bar #xray-bar-controller-path .xray-bar-btn:last-child {
178
+ border-radius: 2px;
179
+ padding-right: 10px;
180
+ }
181
+
182
+ #xray-bar-controller-path .xray-bar-controller { padding-left: 6px; }
183
+ #xray-bar-controller-path .xray-bar-controller,
184
+ #xray-bar-controller-path .xray-bar-controller b:before { background-color: #444; }
185
+ #xray-bar-controller-path .xray-bar-controller:hover,
186
+ #xray-bar-controller-path .xray-bar-controller:hover b:before { background-color: #555; }
187
+ #xray-bar-controller-path .xray-bar-controller-action { color: #ddd; }
188
+ #xray-bar-controller-path .xray-bar-layout,
189
+ #xray-bar-controller-path .xray-bar-layout b:before { background-color: #c12e27; }
190
+ #xray-bar-controller-path .xray-bar-layout:hover,
191
+ #xray-bar-controller-path .xray-bar-layout:hover b:before { background-color: #de362d; }
192
+ #xray-bar-controller-path .xray-bar-view,
193
+ #xray-bar-controller-path .xray-bar-view b:before { background-color: #ff2c1e; }
194
+ #xray-bar-controller-path .xray-bar-view:hover,
195
+ #xray-bar-controller-path .xray-bar-view:hover b:before { background-color: #ff4c36; }
196
+
197
+ #xray-bar #xray-bar-togglers {
198
+ float: left;
199
+ margin-left: 20px;
200
+ }
201
+
202
+ #xray-bar #xray-bar-togglers .xray-bar-btn {
203
+ border-radius: 0;
204
+ margin-right: 0;
205
+ color: #999;
206
+ }
207
+
208
+ #xray-bar #xray-bar-togglers .xray-bar-btn:first-child {
209
+ border-radius: 2px 0 0 2px;
210
+ }
211
+
212
+ #xray-bar #xray-bar-togglers .xray-bar-btn:last-child {
213
+ border-radius: 0 2px 2px 0;
214
+ }
215
+
216
+ #xray-bar #xray-bar-togglers .xray-bar-btn:before {
217
+ font-size: 9px;
218
+ vertical-align: middle;
219
+ margin-bottom: 1px;
220
+ margin-right: 5px;
221
+ background: rgba(255,255,255,0.2);
222
+ color: #eee;
223
+ padding: 2px 4px;
224
+ text-shadow: none;
225
+ }
226
+
227
+ #xray-bar #xray-bar-togglers .xray-bar-btn.active {
228
+ background: #555;
229
+ color: #fff;
230
+ }
231
+
232
+ #xray-bar #xray-bar-togglers .xray-bar-templates-toggler:before { content: 'HTML'; }
233
+ #xray-bar #xray-bar-togglers .xray-bar-templates-toggler.active:before { background: red; }
234
+ #xray-bar #xray-bar-togglers .xray-bar-views-toggler:before { content: 'JS'; }
235
+ #xray-bar #xray-bar-togglers .xray-bar-views-toggler.active:before { background: #fff; color: #333; }
236
+ #xray-bar #xray-bar-togglers .xray-bar-styles-toggler:before { content: 'CSS'; }
237
+
238
+ #xray-bar #xray-bar-togglers .xray-icon-search:before {
239
+ font-size: 16px;
240
+ background: none;
241
+ padding: 0;
242
+ margin: 0;
243
+ }
244
+
245
+ #xray-bar .xray-bar-settings-btn {
246
+ position: absolute;
247
+ right: 10px;
248
+ top: 10px;
249
+ color: #666;
250
+ cursor: pointer;
251
+ text-shadow: 0 1px 0 #000;
252
+ font-size: 16px;
253
+ -webkit-touch-callout: none;
254
+ -webkit-user-select: none;
255
+ -khtml-user-select: none;
256
+ -moz-user-select: none;
257
+ -ms-user-select: none;
258
+ user-select: none;
259
+ }
260
+
261
+ #xray-bar .xray-bar-settings-btn:hover {
262
+ color: #fff;
263
+ }
264
+
265
+ #xray-settings {
266
+ position: absolute;
267
+ right: 0;
268
+ bottom: 40px;
269
+ width: 300px;
270
+ height: 100px;
271
+ background: rgba(0,0,0,0.9);
272
+ padding: 10px;
273
+ font-size: 14px
274
+ }
275
+
276
+ #xray-settings label {
277
+ display: inline;
278
+ margin: 2px 10px;
279
+ padding: 0;
280
+ }
281
+
282
+ #xray-settings input {
283
+ padding: 5px;
284
+ display: inline;
285
+ background: #333;
286
+ border: 1px solid #666;
287
+ color: #fff;
288
+ width: 200px;
289
+ margin: 0;
290
+ font-size: 13px;
291
+ line-height: 13px;
292
+ border-radius: 3px;
293
+ vertical-align: middle;
294
+ }
295
+
296
+ #xray-settings button {
297
+ position: absolute;
298
+ right: 18px;
299
+ left: 18px;
300
+ bottom: 10px;
301
+ padding: 7px;
302
+ color: #fff;
303
+ background: #04be00;
304
+ text-align: center;
305
+ cursor: pointer;
306
+ }
307
+
308
+ #xray-settings button:hover {
309
+ background: #049d00;
310
+ }
311
+
312
+ #xray-settings p {
313
+ font-size: 12px;
314
+ color: #666;
315
+ text-align: center;
316
+ margin: 10px 0 0 0;
317
+ }
318
+
319
+ #xray-settings .xray-settings-update-msg {
320
+ margin-left: 12px;
321
+ }
322
+
323
+
324
+ @font-face {
325
+ font-family: 'xray-icons';
326
+ src: url("data:application/octet-stream;base64,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") format('woff'), url("data:application/octet-stream;base64,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JWBkI7ADJWBkUFghGyMhWSMgILAEJiNGYThZLbAwLLAAFiAgILAFJiAuRyNHI2EjPDgtsDEssAAWILAJI0IgICBGI0ewACsjYTgtsDIssAAWsAMlsAIlRyNHI2GwAFRYLiA8IyEbsAIlsAIlRyNHI2EgsAUlsAQlRyNHI2GwBiWwBSVJsAIlYbABRWMjIFhiGyFZY7ABRWJgIy4jICA8ijgjIVktsDMssAAWILAJQyAuRyNHI2EgYLAgYGawgGIjICA8ijgtsDQsIyAuRrACJUZSWCA8WS6xJAEUKy2wNSwjIC5GsAIlRlBYIDxZLrEkARQrLbA2LCMgLkawAiVGUlggPFkjIC5GsAIlRlBYIDxZLrEkARQrLbA3LLAuKyMgLkawAiVGUlggPFkusSQBFCstsDgssC8riiAgPLAEI0KKOCMgLkawAiVGUlggPFkusSQBFCuwBEMusCQrLbA5LLAAFrAEJbAEJiAuRyNHI2GwBkUrIyA8IC4jOLEkARQrLbA6LLEJBCVCsAAWsAQlsAQlIC5HI0cjYSCwBCNCsAZFKyCwYFBYILBAUVizAiADIBuzAiYDGllCQiMgR7AEQ7CAYmAgsAArIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbCAYmGwAiVGYTgjIDwjOBshICBGI0ewACsjYTghWbEkARQrLbA7LLAuKy6xJAEUKy2wPCywLyshIyAgPLAEI0IjOLEkARQrsARDLrAkKy2wPSywABUgR7AAI0KyAAEBFRQTLrAqKi2wPiywABUgR7AAI0KyAAEBFRQTLrAqKi2wPyyxAAEUE7ArKi2wQCywLSotsEEssAAWRSMgLiBGiiNhOLEkARQrLbBCLLAJI0KwQSstsEMssgAAOistsEQssgABOistsEUssgEAOistsEYssgEBOistsEcssgAAOystsEgssgABOystsEkssgEAOystsEossgEBOystsEsssgAANystsEwssgABNystsE0ssgEANystsE4ssgEBNystsE8ssgAAOSstsFAssgABOSstsFEssgEAOSstsFIssgEBOSstsFMssgAAPCstsFQssgABPCstsFUssgEAPCstsFYssgEBPCstsFcssgAAOCstsFgssgABOCstsFkssgEAOCstsFossgEBOCstsFsssDArLrEkARQrLbBcLLAwK7A0Ky2wXSywMCuwNSstsF4ssAAWsDArsDYrLbBfLLAxKy6xJAEUKy2wYCywMSuwNCstsGEssDErsDUrLbBiLLAxK7A2Ky2wYyywMisusSQBFCstsGQssDIrsDQrLbBlLLAyK7A1Ky2wZiywMiuwNistsGcssDMrLrEkARQrLbBoLLAzK7A0Ky2waSywMyuwNSstsGossDMrsDYrLbBrLCuwCGWwAyRQeLABFTAtAABLuADIUlixAQGOWbkIAAgAYyCwASNEILADI3CyBCgJRVJEswoLBgQrsQYBRLEkAYhRWLBAiFixBgNEsSYBiFFYuAQAiFixBgFEWVlZWbgB/4WwBI2xBQBE") format('truetype');
327
+ }
328
+
329
+ [class^="xray-icon-"]:before,
330
+ [class*=" xray-icon-"]:before {
331
+ font-family: 'xray-icons';
332
+ font-style: normal;
333
+ font-weight: normal;
334
+ speak: none;
335
+ display: inline-block;
336
+ text-decoration: inherit;
337
+ width: 1em;
338
+ margin-right: 0.1em;
339
+ text-align: center;
340
+ line-height: 1em;
341
+ }
342
+
343
+ .xray-icon-cog:before { content: '\e800'; } /* '' */
344
+ .xray-icon-flash:before { content: '\26a1'; } /* '⚡' */
345
+ .xray-icon-cancel:before { content: '\2715'; } /* '✕' */
346
+ .xray-icon-github:before { content: '\f056'; } /* '' */
347
+ .xray-icon-columns:before { content: '\f0db'; } /* '' */
348
+ .xray-icon-doc:before { content: '📄'; } /* '\1f4c4' */
349
+ .xray-icon-search:before { content: '🔍'; } /* '\1f50d' */
@@ -5,10 +5,10 @@ require 'copy_tuner_client/version'
5
5
  Gem::Specification.new do |s|
6
6
  s.add_dependency 'i18n', '>= 0.5.0'
7
7
  s.add_dependency 'json'
8
- s.add_development_dependency 'appraisal', '~> 1.0'
9
- s.add_development_dependency 'aruba', '~> 0.6.0'
8
+ s.add_development_dependency 'appraisal', '~> 0.4'
9
+ s.add_development_dependency 'aruba', '~> 0.3.2'
10
10
  s.add_development_dependency 'bourne'
11
- s.add_development_dependency 'cucumber', '~> 1.3.16'
11
+ s.add_development_dependency 'cucumber', '~> 0.10.0'
12
12
  s.add_development_dependency 'i18n'
13
13
  s.add_development_dependency 'rails', '~> 3.1.0'
14
14
  s.add_development_dependency 'rake'
@@ -29,7 +29,6 @@ Feature: Using copy_tuner in a rails app
29
29
  Then the log should contain "Downloaded translations"
30
30
  When I visit /users/
31
31
  Then the response should contain "This is a test"
32
- And I wait for changes to be synchronized
33
32
  And the log should not contain "DEPRECATION WARNING"
34
33
 
35
34
  Scenario: copy_tuner in the view
@@ -72,14 +71,11 @@ Feature: Using copy_tuner in a rails app
72
71
  <%= @text %>
73
72
  """
74
73
  When I start the application
75
- And I wait for changes to be synchronized
76
74
  And I visit /users/
77
75
  Then the response should contain "Old content"
78
- And I wait for changes to be synchronized
79
76
  When the the following blurbs are updated in the "abc123" project:
80
77
  | key | draft content |
81
78
  | en.users.index.controller-test | New content |
82
- And I wait for changes to be synchronized
83
79
  And I visit /users/
84
80
  Then the response should contain "New content"
85
81
 
@@ -98,10 +94,8 @@ Feature: Using copy_tuner in a rails app
98
94
  <%= t(".404", :default => "not found") %>
99
95
  """
100
96
  When I start the application
101
- And I wait for changes to be synchronized
102
97
  And I visit /users/
103
98
  Then the response should contain "not found"
104
- And I wait for changes to be synchronized
105
99
  And the "abc123" project should have the following blurbs:
106
100
  | key | draft content |
107
101
  | en.users.index.404 | not found |
@@ -150,9 +144,7 @@ Feature: Using copy_tuner in a rails app
150
144
  | test.one | expected one | unexpected one |
151
145
  | test.two | expected two | unexpected two |
152
146
  When I successfully rake "copy_tuner:deploy"
153
- And I wait for changes to be synchronized
154
147
  And the output should contain "Successfully marked all blurbs as published"
155
- And I wait for changes to be synchronized
156
148
  Then the "abc123" project should have the following blurbs:
157
149
  | key | draft content | published content |
158
150
  | test.one | expected one | expected one |
@@ -175,7 +167,6 @@ Feature: Using copy_tuner in a rails app
175
167
  """
176
168
  When I route the "users" resource
177
169
  And I start the application
178
- And I wait for changes to be synchronized
179
170
  And I visit /users/
180
171
  Then the response should contain "Hello, Joe"
181
172
  When I wait for changes to be synchronized
@@ -198,7 +189,6 @@ Feature: Using copy_tuner in a rails app
198
189
  <%= number_to_currency(2.5) %>
199
190
  """
200
191
  When I start the application
201
- And I wait for changes to be synchronized
202
192
  And I visit /users/
203
193
  Then the response should contain "$2.50"
204
194
  When I wait for changes to be synchronized
@@ -236,10 +226,9 @@ Feature: Using copy_tuner in a rails app
236
226
  """
237
227
  <%= @user.errors.full_messages.first %>
238
228
  """
239
- When I successfully rake "db:migrate RAILS_ENV=development"
229
+ When I successfully rake "db:migrate"
240
230
  And I configure the copy_tuner client to use published data
241
231
  And I start the application
242
- And I wait for changes to be synchronized
243
232
  And I visit /users/
244
233
  Then the response should contain "Name can't be blank"
245
234
  When I wait for changes to be synchronized
@@ -250,9 +239,7 @@ Feature: Using copy_tuner in a rails app
250
239
  Scenario: ensure keys are synced with short lived processes
251
240
  When I configure the copy_tuner client to have a polling delay of 86400 seconds
252
241
  And I start the application
253
- And I wait for changes to be synchronized
254
- And I run a short lived process that sets the key "threaded.key" to "all your base" in "development" environment
255
- And I wait for changes to be synchronized
242
+ And I run a short lived process that sets the key "threaded.key" to "all your base"
256
243
  Then the "abc123" project should have the following blurbs:
257
244
  | key | draft content |
258
245
  | en.threaded.key | all your base |
@@ -273,7 +260,6 @@ Feature: Using copy_tuner in a rails app
273
260
  <%= time_ago_in_words(2.hours.ago) %> ago
274
261
  """
275
262
  When I start the application
276
- And I wait for changes to be synchronized
277
263
  And I visit /users/
278
264
  Then the response should contain "1 hour ago"
279
265
  And the response should contain "2 hours ago"
@@ -15,7 +15,7 @@ Given /^the "([^"]*)" project has the following blurbs:$/ do |api_key, table|
15
15
  end
16
16
 
17
17
  When /^the the following blurbs are updated in the "([^"]*)" project:$/ do |api_key, table|
18
- step %{the "#{api_key}" project has the following blurbs:}, table
18
+ Given %{the "#{api_key}" project has the following blurbs:}, table
19
19
  end
20
20
 
21
21
  Then /^the "([^"]*)" project should have the following blurbs:$/ do |api_key, table|
@@ -6,9 +6,6 @@ When "I generate a rails application" do
6
6
  else
7
7
  options = '--skip-bundle'
8
8
  end
9
- elsif Rails::VERSION::MAJOR == 4
10
- subcommand = 'new'
11
- options = '--skip-bundle'
12
9
  else
13
10
  subcommand = ''
14
11
  options = ''
@@ -17,17 +14,16 @@ When "I generate a rails application" do
17
14
  run_simple("rails _#{Rails::VERSION::STRING}_ #{subcommand} testapp #{options}")
18
15
  cd("testapp")
19
16
 
20
- if Rails::VERSION::MAJOR == 3 or Rails::VERSION::MAJOR == 4
17
+ if Rails::VERSION::MAJOR == 3
21
18
  append_to_file("Gemfile", <<-GEMS)
22
19
  gem "thin"
23
20
  gem "sham_rack"
24
21
  gem "sinatra"
25
22
  gem "json"
26
23
  GEMS
27
- # bundle installには時間がかかるので、timeout値を2時間に設定
28
- run_simple("bundle install", true, 7200)
24
+ run_simple("bundle install --local")
29
25
 
30
- step(%{I remove lines containing "rjs" from "config/environments/development.rb"})
26
+ When %{I remove lines containing "rjs" from "config/environments/development.rb"}
31
27
  end
32
28
  end
33
29
 
@@ -43,7 +39,7 @@ When /^I configure the copy_tuner client with api key "([^"]*)"$/ do |api_key|
43
39
  end
44
40
  RUBY
45
41
 
46
- if Rails::VERSION::MAJOR == 3 or Rails::VERSION::MAJOR == 4
42
+ if Rails::VERSION::MAJOR == 3
47
43
  append_to_file("Gemfile", <<-GEMS)
48
44
  gem "copy_tuner_client", :path => "../../.."
49
45
  GEMS
@@ -54,7 +50,9 @@ When /^I configure the copy_tuner client with api key "([^"]*)"$/ do |api_key|
54
50
  end
55
51
 
56
52
  When "I start the application" do
57
- step(%{I start the application in the "development" environment})
53
+ in_current_dir do
54
+ RailsServer.start(ENV['RAILS_PORT'], @announce_stderr)
55
+ end
58
56
  end
59
57
 
60
58
  When /^I start the application in the "([^"]+)" environment$/ do |environment|
@@ -62,11 +60,6 @@ When /^I start the application in the "([^"]+)" environment$/ do |environment|
62
60
  old_environment = ENV['RAILS_ENV']
63
61
  begin
64
62
  ENV['RAILS_ENV'] = environment
65
- if environment == 'production' and Rails::VERSION::MAJOR == 4
66
- if Rails::VERSION::MINOR != 0
67
- ENV["SECRET_KEY_BASE"] = '4f7d3eb907e873d8a9cbfc6997fd07a88bd2b8d23518717378254ed4a0c6ada5f83061714019b2972a782d51299f5e1ca003ff4b6f4b2000f1be0b3d33522b68'
68
- end
69
- end
70
63
  RailsServer.start(ENV['RAILS_PORT'], @announce_stderr)
71
64
  ensure
72
65
  ENV['RAILS_ENV'] = old_environment
@@ -144,7 +137,7 @@ When /^show me the page$/ do
144
137
  end
145
138
 
146
139
  When /^I route the "([^"]+)" resource$/ do |resource|
147
- if Rails::VERSION::MAJOR == 3 or Rails::VERSION::MAJOR == 4
140
+ if Rails::VERSION::MAJOR == 3
148
141
  draw = "Testapp::Application.routes.draw do\n"
149
142
  else
150
143
  draw = "ActionController::Routing::Routes.draw do |map|\nmap."
@@ -155,13 +148,11 @@ When /^I route the "([^"]+)" resource$/ do |resource|
155
148
  overwrite_file("config/routes.rb", routes)
156
149
  end
157
150
 
158
- When /^I run a short lived process that sets the key "([^"]*)" to "([^"]*)" in "([^"]*)" environment$/ do |key, value, environment|
151
+ When /^I run a short lived process that sets the key "([^"]*)" to "([^"]*)"$/ do |key, value|
159
152
  if Rails::VERSION::MAJOR == 3
160
- run_simple %[script/rails runner -e #{environment} 'I18n.translate("#{key}", :default => "#{value}")']
161
- elsif Rails::VERSION::MAJOR == 4
162
- run_simple %[bin/rails runner -e #{environment} 'I18n.translate("#{key}", :default => "#{value}")']
153
+ run_simple %[script/rails runner 'I18n.translate("#{key}", :default => "#{value}")']
163
154
  else
164
- run_simple %[script/runner -e #{environment} 'I18n.translate("#{key}", :default => "#{value}")']
155
+ run_simple %[script/runner 'I18n.translate("#{key}", :default => "#{value}")']
165
156
  end
166
157
  end
167
158
 
@@ -37,7 +37,7 @@ class RailsServer
37
37
  require './config/environment'
38
38
  require 'thin'
39
39
 
40
- if Rails::VERSION::MAJOR == 3 or Rails::VERSION::MAJOR == 4
40
+ if Rails::VERSION::MAJOR == 3
41
41
  rails = Rails.application
42
42
  else
43
43
  rails = ActionController::Dispatcher.new
@@ -53,7 +53,7 @@ class RailsServer
53
53
  end
54
54
 
55
55
  def initialize(port, debug)
56
- @port = find_available_port
56
+ @port = (port || 3001).to_i
57
57
  @debug = debug
58
58
  end
59
59
 
@@ -68,24 +68,8 @@ class RailsServer
68
68
 
69
69
  def stop
70
70
  if @pid
71
- if ENV['TRAVIS']
72
- system("sudo kill -2 #{@pid}")
73
- else
74
- Process.kill('INT', @pid)
75
- end
76
-
77
- begin
78
- Timeout.timeout(10) do
79
- Process.waitpid(@pid)
80
- end
81
- rescue Timeout::Error
82
- if ENV['TRAVIS']
83
- system("sudo kill -9 #{@pid}")
84
- else
85
- Process.kill('KILL', @pid)
86
- end
87
- Process.waitpid(@pid)
88
- end
71
+ Process.kill('INT', @pid)
72
+ Process.wait(@pid)
89
73
  @pid = nil
90
74
  end
91
75
  end
@@ -122,16 +106,6 @@ class RailsServer
122
106
  "http://#{HOST}:#{@port}"
123
107
  end
124
108
 
125
- private
126
-
127
- def find_available_port
128
- server = TCPServer.new('127.0.0.1', 0)
129
- server.addr[1]
130
- ensure
131
- server.close if server
132
- end
133
-
134
-
135
109
  # From Capybara::Server
136
110
 
137
111
  class Identify
@@ -2,6 +2,6 @@
2
2
 
3
3
  source "http://rubygems.org"
4
4
 
5
- gem "rails", "4.0.8"
5
+ gem "rails", "2.3.16"
6
6
 
7
- gemspec :path => "../"
7
+ gemspec :path=>"../"