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