copy_tuner_client 0.0.15 → 0.1.0.beta

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.
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=>"../"