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.
- checksums.yaml +15 -0
- data/.gitignore +0 -1
- data/.travis.yml +5 -5
- data/Appraisals +10 -7
- data/Gemfile.lock +33 -34
- data/README.md +2 -16
- data/Rakefile +3 -1
- data/app/assets/javascripts/copyray.js.coffee +285 -0
- data/app/assets/stylesheets/copyray.css +349 -0
- data/copy_tuner_client.gemspec +3 -3
- data/features/rails.feature +2 -16
- data/features/step_definitions/copycopter_server_steps.rb +1 -1
- data/features/step_definitions/rails_steps.rb +11 -20
- data/features/support/rails_server.rb +4 -30
- data/gemfiles/{4.0.gemfile → 2.3.gemfile} +2 -2
- data/gemfiles/2.3.gemfile.lock +108 -0
- data/gemfiles/{4.1.gemfile → 3.0.gemfile} +2 -2
- data/gemfiles/3.0.gemfile.lock +153 -0
- data/gemfiles/3.1.gemfile +11 -0
- data/gemfiles/3.1.gemfile.lock +191 -0
- data/lib/copy_tuner_client/cache.rb +0 -2
- data/lib/copy_tuner_client/configuration.rb +4 -4
- data/lib/copy_tuner_client/copyray.rb +29 -0
- data/lib/copy_tuner_client/copyray_middleware.rb +65 -0
- data/lib/copy_tuner_client/engine.rb +29 -0
- data/lib/copy_tuner_client/i18n_backend.rb +1 -2
- data/lib/copy_tuner_client/rails.rb +1 -1
- data/lib/copy_tuner_client/simple_form_extention.rb +19 -0
- data/lib/copy_tuner_client/version.rb +1 -1
- data/spec/copy_tuner_client/cache_spec.rb +3 -15
- data/spec/copy_tuner_client/configuration_spec.rb +1 -1
- data/spec/copy_tuner_client/request_sync_spec.rb +4 -4
- data/spec/support/fake_copy_tuner_app.rb +11 -14
- metadata +25 -60
- data/.ruby-version +0 -1
- data/gemfiles/3.2.gemfile +0 -7
- 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' */
|
data/copy_tuner_client.gemspec
CHANGED
@@ -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', '~>
|
9
|
-
s.add_development_dependency 'aruba', '~> 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', '~>
|
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'
|
data/features/rails.feature
CHANGED
@@ -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
|
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
|
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
|
-
|
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
|
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
|
-
|
28
|
-
run_simple("bundle install", true, 7200)
|
24
|
+
run_simple("bundle install --local")
|
29
25
|
|
30
|
-
|
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
|
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
|
-
|
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
|
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 "([^"]*)"
|
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
|
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
|
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
|
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 =
|
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
|
-
|
72
|
-
|
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
|