helena 1.0.0.rc2 → 1.0.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +97 -90
- data/README.md +2 -2
- data/app/models/helena/question_group.rb +2 -2
- data/app/models/helena/session.rb +6 -26
- data/app/models/helena/version.rb +3 -2
- data/app/views/helena/questions/_bipolar_radio_matrix.html.haml +48 -25
- data/app/views/helena/questions/_radio_matrix.html.haml +45 -21
- data/app/views/helena/questions/_static_text.html.slim +6 -1
- data/db/seeds.rb +1 -1
- data/helena.gemspec +6 -4
- data/lib/helena.rb +1 -1
- data/lib/helena/survey_importer.rb +3 -3
- data/lib/helena/version.rb +1 -1
- data/lib/helena/version_publisher.rb +7 -20
- data/spec/dummy/config/application.rb +1 -0
- data/spec/lib/version_publisher_spec.rb +13 -5
- data/spec/models/helena/session_spec.rb +3 -11
- data/spec/spec_helper.rb +1 -1
- metadata +40 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: acadeb9841bf21c2de938861517824219cd1e517
|
4
|
+
data.tar.gz: d9a338d54c6551a53b85f6f496a4ce3d11475594
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74cb384bc70e07c17c593792da8ca7aa3c7a7b5ce7b4543a357a7e8be432cc7466412f54aeed35678495dc54fa6eec165dadc6d32abffa845d0551f9de0861ba
|
7
|
+
data.tar.gz: 96e6a034c109870e6bad4cbf0950ff8d38546df49395cd9e3d1424a6a22b32547d0acc3cec09caeca394ae511d7262429608d7c4784c9ca049413332df70d515
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
helena (1.0.0.
|
4
|
+
helena (1.0.0.rc3)
|
5
5
|
bootstrap-sass (~> 3.2)
|
6
6
|
breadcrumbs_on_rails (~> 2.3)
|
7
|
-
|
8
|
-
|
7
|
+
browser (~> 0.8)
|
8
|
+
haml-rails (~> 0.9)
|
9
|
+
jquery-rails (~> 4.0)
|
9
10
|
mongoid (~> 4.0)
|
10
11
|
mongoid-simple-tags (~> 0.1)
|
12
|
+
mongoid-tree (~> 2.0)
|
11
13
|
mongoid_orderable (~> 4.1)
|
12
|
-
rails (~> 4.
|
14
|
+
rails (~> 4.2)
|
13
15
|
rails-i18n (~> 4.0)
|
14
16
|
responders (~> 2.0)
|
15
17
|
sass-rails (~> 5.0)
|
@@ -19,44 +21,44 @@ PATH
|
|
19
21
|
GEM
|
20
22
|
remote: https://rubygems.org/
|
21
23
|
specs:
|
22
|
-
actionmailer (4.2.
|
23
|
-
actionpack (= 4.2.
|
24
|
-
actionview (= 4.2.
|
25
|
-
activejob (= 4.2.
|
24
|
+
actionmailer (4.2.2)
|
25
|
+
actionpack (= 4.2.2)
|
26
|
+
actionview (= 4.2.2)
|
27
|
+
activejob (= 4.2.2)
|
26
28
|
mail (~> 2.5, >= 2.5.4)
|
27
29
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
28
|
-
actionpack (4.2.
|
29
|
-
actionview (= 4.2.
|
30
|
-
activesupport (= 4.2.
|
30
|
+
actionpack (4.2.2)
|
31
|
+
actionview (= 4.2.2)
|
32
|
+
activesupport (= 4.2.2)
|
31
33
|
rack (~> 1.6)
|
32
34
|
rack-test (~> 0.6.2)
|
33
35
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
34
36
|
rails-html-sanitizer (~> 1.0, >= 1.0.1)
|
35
|
-
actionview (4.2.
|
36
|
-
activesupport (= 4.2.
|
37
|
+
actionview (4.2.2)
|
38
|
+
activesupport (= 4.2.2)
|
37
39
|
builder (~> 3.1)
|
38
40
|
erubis (~> 2.7.0)
|
39
41
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
40
42
|
rails-html-sanitizer (~> 1.0, >= 1.0.1)
|
41
|
-
activejob (4.2.
|
42
|
-
activesupport (= 4.2.
|
43
|
+
activejob (4.2.2)
|
44
|
+
activesupport (= 4.2.2)
|
43
45
|
globalid (>= 0.3.0)
|
44
|
-
activemodel (4.2.
|
45
|
-
activesupport (= 4.2.
|
46
|
+
activemodel (4.2.2)
|
47
|
+
activesupport (= 4.2.2)
|
46
48
|
builder (~> 3.1)
|
47
|
-
activerecord (4.2.
|
48
|
-
activemodel (= 4.2.
|
49
|
-
activesupport (= 4.2.
|
49
|
+
activerecord (4.2.2)
|
50
|
+
activemodel (= 4.2.2)
|
51
|
+
activesupport (= 4.2.2)
|
50
52
|
arel (~> 6.0)
|
51
|
-
activesupport (4.2.
|
53
|
+
activesupport (4.2.2)
|
52
54
|
i18n (~> 0.7)
|
53
55
|
json (~> 1.7, >= 1.7.7)
|
54
56
|
minitest (~> 5.1)
|
55
57
|
thread_safe (~> 0.3, >= 0.3.4)
|
56
58
|
tzinfo (~> 1.1)
|
57
59
|
addressable (2.3.8)
|
58
|
-
arel (6.0.
|
59
|
-
autoprefixer-rails (5.1
|
60
|
+
arel (6.0.2)
|
61
|
+
autoprefixer-rails (5.2.1)
|
60
62
|
execjs
|
61
63
|
json
|
62
64
|
better_errors (2.1.1)
|
@@ -65,13 +67,14 @@ GEM
|
|
65
67
|
rack (>= 0.9.0)
|
66
68
|
binding_of_caller (0.7.2)
|
67
69
|
debug_inspector (>= 0.0.1)
|
68
|
-
bootstrap-sass (3.3.
|
70
|
+
bootstrap-sass (3.3.5)
|
69
71
|
autoprefixer-rails (>= 5.0.0.1)
|
70
72
|
sass (>= 3.2.19)
|
71
73
|
breadcrumbs_on_rails (2.3.0)
|
72
|
-
|
74
|
+
browser (0.8.0)
|
75
|
+
bson (3.1.0)
|
73
76
|
builder (3.2.2)
|
74
|
-
byebug (
|
77
|
+
byebug (5.0.0)
|
75
78
|
columnize (= 0.9.0)
|
76
79
|
capybara (2.4.4)
|
77
80
|
mime-types (>= 1.16)
|
@@ -84,10 +87,10 @@ GEM
|
|
84
87
|
coderay (1.1.0)
|
85
88
|
columnize (0.9.0)
|
86
89
|
connection_pool (2.2.0)
|
87
|
-
coveralls (0.8.
|
88
|
-
|
90
|
+
coveralls (0.8.2)
|
91
|
+
json (~> 1.8)
|
89
92
|
rest-client (>= 1.6.8, < 2)
|
90
|
-
simplecov (~> 0.
|
93
|
+
simplecov (~> 0.10.0)
|
91
94
|
term-ansicolor (~> 1.3)
|
92
95
|
thor (~> 0.19.1)
|
93
96
|
database_cleaner (1.4.1)
|
@@ -107,7 +110,8 @@ GEM
|
|
107
110
|
factory_girl_rails (4.5.0)
|
108
111
|
factory_girl (~> 4.5.0)
|
109
112
|
railties (>= 3.0.0)
|
110
|
-
|
113
|
+
faker (1.4.3)
|
114
|
+
i18n (~> 0.5)
|
111
115
|
ffi (1.9.8)
|
112
116
|
globalid (0.3.5)
|
113
117
|
activesupport (>= 4.1.0)
|
@@ -119,7 +123,7 @@ GEM
|
|
119
123
|
haml (>= 4.0.6, < 5.0)
|
120
124
|
html2haml (>= 1.0.1)
|
121
125
|
railties (>= 4.0.1)
|
122
|
-
highline (1.7.
|
126
|
+
highline (1.7.2)
|
123
127
|
html2haml (2.0.0)
|
124
128
|
erubis (~> 2.7.0)
|
125
129
|
haml (~> 4.0.0)
|
@@ -128,7 +132,7 @@ GEM
|
|
128
132
|
http-cookie (1.0.2)
|
129
133
|
domain_name (~> 0.5)
|
130
134
|
i18n (0.7.0)
|
131
|
-
i18n-tasks (0.8.
|
135
|
+
i18n-tasks (0.8.3)
|
132
136
|
activesupport
|
133
137
|
easy_translate (>= 0.5.0)
|
134
138
|
erubis
|
@@ -136,39 +140,42 @@ GEM
|
|
136
140
|
i18n
|
137
141
|
term-ansicolor
|
138
142
|
terminal-table
|
139
|
-
jquery-rails (
|
140
|
-
|
143
|
+
jquery-rails (4.0.4)
|
144
|
+
rails-dom-testing (~> 1.0)
|
145
|
+
railties (>= 4.2.0)
|
141
146
|
thor (>= 0.14, < 2.0)
|
142
|
-
json (1.8.
|
147
|
+
json (1.8.3)
|
143
148
|
launchy (2.4.3)
|
144
149
|
addressable (~> 2.3)
|
145
|
-
loofah (2.0.
|
150
|
+
loofah (2.0.2)
|
146
151
|
nokogiri (>= 1.5.9)
|
147
152
|
mail (2.6.3)
|
148
153
|
mime-types (>= 1.16, < 3)
|
149
154
|
method_source (0.8.2)
|
150
|
-
mime-types (2.
|
155
|
+
mime-types (2.6.1)
|
151
156
|
mini_portile (0.6.2)
|
152
|
-
minitest (5.
|
157
|
+
minitest (5.7.0)
|
153
158
|
mongoid (4.0.2)
|
154
159
|
activemodel (~> 4.0)
|
155
160
|
moped (~> 2.0.0)
|
156
161
|
origin (~> 2.1)
|
157
162
|
tzinfo (>= 0.3.37)
|
158
|
-
mongoid-rspec (2.
|
163
|
+
mongoid-rspec (2.2.0)
|
159
164
|
mongoid (~> 4.0.0)
|
160
165
|
rake
|
161
166
|
rspec (~> 3.1)
|
162
167
|
mongoid-simple-tags (0.1.3)
|
163
168
|
json (~> 1.8)
|
164
169
|
mongoid (>= 3.0.3)
|
170
|
+
mongoid-tree (2.0.0)
|
171
|
+
mongoid (>= 4.0, <= 5.0)
|
165
172
|
mongoid_orderable (4.1.1)
|
166
173
|
mongoid
|
167
|
-
moped (2.0.
|
168
|
-
bson (~>
|
174
|
+
moped (2.0.6)
|
175
|
+
bson (~> 3.0)
|
169
176
|
connection_pool (~> 2.0)
|
170
177
|
optionable (~> 0.2.0)
|
171
|
-
multi_json (1.11.
|
178
|
+
multi_json (1.11.1)
|
172
179
|
netrc (0.10.3)
|
173
180
|
nokogiri (1.6.6.2)
|
174
181
|
mini_portile (~> 0.6.0)
|
@@ -178,24 +185,24 @@ GEM
|
|
178
185
|
coderay (~> 1.1.0)
|
179
186
|
method_source (~> 0.8.1)
|
180
187
|
slop (~> 3.4)
|
181
|
-
pry-byebug (3.
|
182
|
-
byebug (~>
|
188
|
+
pry-byebug (3.2.0)
|
189
|
+
byebug (~> 5.0)
|
183
190
|
pry (~> 0.10)
|
184
191
|
quiet_assets (1.1.0)
|
185
192
|
railties (>= 3.1, < 5.0)
|
186
|
-
rack (1.6.
|
193
|
+
rack (1.6.4)
|
187
194
|
rack-test (0.6.3)
|
188
195
|
rack (>= 1.0)
|
189
|
-
rails (4.2.
|
190
|
-
actionmailer (= 4.2.
|
191
|
-
actionpack (= 4.2.
|
192
|
-
actionview (= 4.2.
|
193
|
-
activejob (= 4.2.
|
194
|
-
activemodel (= 4.2.
|
195
|
-
activerecord (= 4.2.
|
196
|
-
activesupport (= 4.2.
|
196
|
+
rails (4.2.2)
|
197
|
+
actionmailer (= 4.2.2)
|
198
|
+
actionpack (= 4.2.2)
|
199
|
+
actionview (= 4.2.2)
|
200
|
+
activejob (= 4.2.2)
|
201
|
+
activemodel (= 4.2.2)
|
202
|
+
activerecord (= 4.2.2)
|
203
|
+
activesupport (= 4.2.2)
|
197
204
|
bundler (>= 1.3.0, < 2.0)
|
198
|
-
railties (= 4.2.
|
205
|
+
railties (= 4.2.2)
|
199
206
|
sprockets-rails
|
200
207
|
rails-deprecated_sanitizer (1.0.3)
|
201
208
|
activesupport (>= 4.2.0.alpha)
|
@@ -208,9 +215,9 @@ GEM
|
|
208
215
|
rails-i18n (4.0.4)
|
209
216
|
i18n (~> 0.6)
|
210
217
|
railties (~> 4.0)
|
211
|
-
railties (4.2.
|
212
|
-
actionpack (= 4.2.
|
213
|
-
activesupport (= 4.2.
|
218
|
+
railties (4.2.2)
|
219
|
+
actionpack (= 4.2.2)
|
220
|
+
activesupport (= 4.2.2)
|
214
221
|
rake (>= 0.8.7)
|
215
222
|
thor (>= 0.18.1, < 2.0)
|
216
223
|
rake (10.4.2)
|
@@ -220,75 +227,75 @@ GEM
|
|
220
227
|
http-cookie (>= 1.0.2, < 2.0)
|
221
228
|
mime-types (>= 1.16, < 3.0)
|
222
229
|
netrc (~> 0.7)
|
223
|
-
rspec (3.
|
224
|
-
rspec-core (~> 3.
|
225
|
-
rspec-expectations (~> 3.
|
226
|
-
rspec-mocks (~> 3.
|
230
|
+
rspec (3.3.0)
|
231
|
+
rspec-core (~> 3.3.0)
|
232
|
+
rspec-expectations (~> 3.3.0)
|
233
|
+
rspec-mocks (~> 3.3.0)
|
227
234
|
rspec-collection_matchers (1.1.2)
|
228
235
|
rspec-expectations (>= 2.99.0.beta1)
|
229
|
-
rspec-core (3.2
|
230
|
-
rspec-support (~> 3.
|
231
|
-
rspec-expectations (3.
|
236
|
+
rspec-core (3.3.2)
|
237
|
+
rspec-support (~> 3.3.0)
|
238
|
+
rspec-expectations (3.3.1)
|
232
239
|
diff-lcs (>= 1.2.0, < 2.0)
|
233
|
-
rspec-support (~> 3.
|
234
|
-
rspec-mocks (3.2
|
240
|
+
rspec-support (~> 3.3.0)
|
241
|
+
rspec-mocks (3.3.2)
|
235
242
|
diff-lcs (>= 1.2.0, < 2.0)
|
236
|
-
rspec-support (~> 3.
|
237
|
-
rspec-rails (3.
|
243
|
+
rspec-support (~> 3.3.0)
|
244
|
+
rspec-rails (3.3.3)
|
238
245
|
actionpack (>= 3.0, < 4.3)
|
239
246
|
activesupport (>= 3.0, < 4.3)
|
240
247
|
railties (>= 3.0, < 4.3)
|
241
|
-
rspec-core (~> 3.
|
242
|
-
rspec-expectations (~> 3.
|
243
|
-
rspec-mocks (~> 3.
|
244
|
-
rspec-support (~> 3.
|
245
|
-
rspec-support (3.
|
248
|
+
rspec-core (~> 3.3.0)
|
249
|
+
rspec-expectations (~> 3.3.0)
|
250
|
+
rspec-mocks (~> 3.3.0)
|
251
|
+
rspec-support (~> 3.3.0)
|
252
|
+
rspec-support (3.3.0)
|
246
253
|
ruby-progressbar (1.7.5)
|
247
|
-
ruby_parser (3.
|
254
|
+
ruby_parser (3.7.0)
|
248
255
|
sexp_processor (~> 4.1)
|
249
256
|
rubyzip (1.1.7)
|
250
|
-
sass (3.4.
|
251
|
-
sass-rails (5.0.
|
257
|
+
sass (3.4.14)
|
258
|
+
sass-rails (5.0.3)
|
252
259
|
railties (>= 4.0.0, < 5.0)
|
253
260
|
sass (~> 3.1)
|
254
261
|
sprockets (>= 2.8, < 4.0)
|
255
262
|
sprockets-rails (>= 2.0, < 4.0)
|
256
263
|
tilt (~> 1.1)
|
257
|
-
selenium-webdriver (2.
|
264
|
+
selenium-webdriver (2.46.2)
|
258
265
|
childprocess (~> 0.5)
|
259
266
|
multi_json (~> 1.0)
|
260
267
|
rubyzip (~> 1.0)
|
261
268
|
websocket (~> 1.0)
|
262
|
-
sexp_processor (4.
|
269
|
+
sexp_processor (4.6.0)
|
263
270
|
shoulda-matchers (2.8.0)
|
264
271
|
activesupport (>= 3.0.0)
|
265
272
|
simple_form (3.1.0)
|
266
273
|
actionpack (~> 4.0)
|
267
274
|
activemodel (~> 4.0)
|
268
|
-
simplecov (0.
|
275
|
+
simplecov (0.10.0)
|
269
276
|
docile (~> 1.1.0)
|
270
|
-
|
271
|
-
simplecov-html (~> 0.
|
272
|
-
simplecov-html (0.
|
273
|
-
slim (3.0.
|
277
|
+
json (~> 1.8)
|
278
|
+
simplecov-html (~> 0.10.0)
|
279
|
+
simplecov-html (0.10.0)
|
280
|
+
slim (3.0.6)
|
274
281
|
temple (~> 0.7.3)
|
275
282
|
tilt (>= 1.3.3, < 2.1)
|
276
283
|
slop (3.6.0)
|
277
|
-
sprockets (3.0
|
284
|
+
sprockets (3.2.0)
|
278
285
|
rack (~> 1.0)
|
279
|
-
sprockets-rails (2.2
|
286
|
+
sprockets-rails (2.3.2)
|
280
287
|
actionpack (>= 3.0)
|
281
288
|
activesupport (>= 3.0)
|
282
289
|
sprockets (>= 2.8, < 4.0)
|
283
|
-
temple (0.7.
|
284
|
-
term-ansicolor (1.3.
|
290
|
+
temple (0.7.6)
|
291
|
+
term-ansicolor (1.3.2)
|
285
292
|
tins (~> 1.0)
|
286
293
|
terminal-table (1.4.5)
|
287
294
|
thor (0.19.1)
|
288
295
|
thread (0.2.0)
|
289
296
|
thread_safe (0.3.5)
|
290
297
|
tilt (1.4.1)
|
291
|
-
tins (1.
|
298
|
+
tins (1.5.4)
|
292
299
|
tzinfo (1.2.2)
|
293
300
|
thread_safe (~> 0.1)
|
294
301
|
unf (0.1.4)
|
@@ -310,12 +317,12 @@ DEPENDENCIES
|
|
310
317
|
coveralls
|
311
318
|
database_cleaner (~> 1.3)
|
312
319
|
factory_girl_rails (~> 4.4)
|
313
|
-
|
320
|
+
faker (~> 1.4)
|
314
321
|
helena!
|
315
322
|
i18n-tasks
|
316
323
|
jquery-rails
|
317
324
|
launchy
|
318
|
-
mongoid-rspec
|
325
|
+
mongoid-rspec
|
319
326
|
pry
|
320
327
|
pry-byebug
|
321
328
|
quiet_assets
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
[![Build Status](https://img.shields.io/travis/gurix/helena/master.svg?style=flat)](https://travis-ci.org/gurix/helena)
|
2
2
|
[![Code Climate](https://img.shields.io/codeclimate/github/gurix/helena.svg?style=flat)](https://codeclimate.com/github/gurix/helena)
|
3
3
|
[![Dependency Status](https://img.shields.io/gemnasium/gurix/helena.svg?style=flat)](https://gemnasium.com/gurix/helena)
|
4
|
-
[![
|
5
|
-
[![
|
4
|
+
[![Rubygems Version](https://img.shields.io/gem/v/helena.svg?style=flat)](https://rubygems.org/gems/helena)
|
5
|
+
[![Coverage Status](https://coveralls.io/repos/gurix/helena/badge.svg?branch=master&service=github)](https://coveralls.io/github/gurix/helena?branch=master)
|
6
6
|
# Helena
|
7
7
|
Helena is an online survey/test framework designed for agile survey/test development, longitudinal studies and instant feedback.
|
8
8
|
|
@@ -5,7 +5,7 @@ module Helena
|
|
5
5
|
|
6
6
|
belongs_to :version
|
7
7
|
|
8
|
-
has_many :questions, inverse_of: :question_group, class_name: 'Helena::Question', dependent: :destroy
|
8
|
+
has_many :questions, inverse_of: :question_group, class_name: 'Helena::Question', dependent: :destroy, autosave: true
|
9
9
|
|
10
10
|
orderable scope: :version
|
11
11
|
|
@@ -13,7 +13,7 @@ module Helena
|
|
13
13
|
field :allow_to_go_back, type: Boolean
|
14
14
|
|
15
15
|
def question_codes
|
16
|
-
questions.map { |question| [question.code] +
|
16
|
+
questions.map { |question| [question.code] + question.sub_questions.map(&:code) }.flatten
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -14,10 +14,13 @@ module Helena
|
|
14
14
|
|
15
15
|
validates :token, :view_token, uniqueness: true
|
16
16
|
|
17
|
+
index created_at: 1
|
18
|
+
index updated_at: 1
|
19
|
+
|
17
20
|
before_create :reset_tokens
|
18
21
|
|
19
22
|
def answers_as_yaml
|
20
|
-
Hash[answers.map { |
|
23
|
+
Hash[answers.map { |answer| [answer.code, answer.value] }.sort].to_yaml
|
21
24
|
end
|
22
25
|
|
23
26
|
def answers_as_yaml=(yaml)
|
@@ -33,15 +36,6 @@ module Helena
|
|
33
36
|
self.view_token = generate_token(25) until unique_token_for?(:view_token)
|
34
37
|
end
|
35
38
|
|
36
|
-
def self.to_csv
|
37
|
-
CSV.generate do |csv|
|
38
|
-
csv << fields.keys + uniq_answer_codes
|
39
|
-
all.each do |session|
|
40
|
-
csv << session.attributes.values_at(*fields.keys) + answer_values_in(session)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
39
|
def as_json(options)
|
46
40
|
session = super(options)
|
47
41
|
session[:answer] = answers_as_hash
|
@@ -49,19 +43,11 @@ module Helena
|
|
49
43
|
end
|
50
44
|
|
51
45
|
def answers_as_hash
|
52
|
-
answers.map { |answer| [answer[:code], answer[:value]] }.
|
46
|
+
Hash[*answers.map { |answer| [answer[:code], answer[:value]] }.flatten]
|
53
47
|
end
|
54
48
|
|
55
49
|
private
|
56
50
|
|
57
|
-
def self.answer_values_in(session)
|
58
|
-
answers = []
|
59
|
-
answer_codes.each do |code|
|
60
|
-
answers << session.answers.where(code: code).first.try(&:value)
|
61
|
-
end
|
62
|
-
answers
|
63
|
-
end
|
64
|
-
|
65
51
|
def self.answer_codes
|
66
52
|
answer_codes = []
|
67
53
|
all.each do |session|
|
@@ -70,12 +56,6 @@ module Helena
|
|
70
56
|
answer_codes
|
71
57
|
end
|
72
58
|
|
73
|
-
def self.uniq_answer_codes
|
74
|
-
answer_codes.map do |code|
|
75
|
-
fields.keys.include?(code) ? "answer_#{code}" : code
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
59
|
def generate_token(size)
|
80
60
|
SecureRandom.base64(size).delete('/+=')[0, size]
|
81
61
|
end
|
@@ -85,7 +65,7 @@ module Helena
|
|
85
65
|
end
|
86
66
|
|
87
67
|
def update_answers(parsed_answers)
|
88
|
-
parsed_answers.each do |
|
68
|
+
parsed_answers.each do |code, value|
|
89
69
|
answer = answers.where(code: code).first
|
90
70
|
if answer
|
91
71
|
next if answer.value == value
|
@@ -2,6 +2,7 @@ module Helena
|
|
2
2
|
class Version
|
3
3
|
include Helena::Concerns::ApplicationModel
|
4
4
|
include Mongoid::Orderable # Needed, because the embedded objects needs this, see
|
5
|
+
include Mongoid::Tree
|
5
6
|
|
6
7
|
field :version, type: Integer, default: 0
|
7
8
|
field :notes, type: String
|
@@ -11,8 +12,8 @@ module Helena
|
|
11
12
|
|
12
13
|
belongs_to :survey
|
13
14
|
|
14
|
-
has_many :question_groups, inverse_of: :version, dependent: :destroy, class_name: 'Helena::QuestionGroup'
|
15
|
-
has_many :sessions, inverse_of: :version, dependent: :destroy, class_name: 'Helena::Session'
|
15
|
+
has_many :question_groups, inverse_of: :version, dependent: :destroy, class_name: 'Helena::QuestionGroup', autosave: true
|
16
|
+
has_many :sessions, inverse_of: :version, dependent: :destroy, class_name: 'Helena::Session', autosave: true
|
16
17
|
|
17
18
|
embeds_one :survey_detail, class_name: 'Helena::SurveyDetail'
|
18
19
|
|
@@ -1,33 +1,56 @@
|
|
1
1
|
- label_width = "#{60 / question.labels.count}%"
|
2
|
+
- mobile = (browser.mobile? || browser.tablet?) # Use a special layout for this devices
|
2
3
|
|
3
4
|
.radio_matrix.form-group{ class: "#{'has-error' if errors.present?}" }
|
4
5
|
%label{class: "#{'text-danger' if errors.present?}"}
|
5
6
|
!= question.question_text
|
6
7
|
= ' *' if question.required
|
7
|
-
|
8
|
-
|
9
|
-
%
|
10
|
-
%
|
11
|
-
%th
|
12
|
-
- question.labels.each do |label|
|
13
|
-
%th{ width: label_width }
|
14
|
-
= label.text
|
15
|
-
%th
|
16
|
-
|
17
|
-
%tbody
|
18
|
-
- question.sub_questions.each do |sub_question|
|
8
|
+
- unless mobile
|
9
|
+
.table-responsive
|
10
|
+
%table.table
|
11
|
+
%thead
|
19
12
|
%tr
|
20
|
-
%
|
21
|
-
= sub_question.parts.first
|
22
|
-
- if errors[sub_question.code]
|
23
|
-
.help-block.text-danger= errors[sub_question.code]
|
13
|
+
%th
|
24
14
|
- question.labels.each do |label|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
15
|
+
%th{ width: label_width }
|
16
|
+
= label.text
|
17
|
+
%th
|
18
|
+
|
19
|
+
%tbody
|
20
|
+
- question.sub_questions.each do |sub_question|
|
21
|
+
%tr
|
22
|
+
%td.text-right
|
23
|
+
= sub_question.parts.first
|
24
|
+
- if errors[sub_question.code]
|
25
|
+
.help-block.text-danger= errors[sub_question.code]
|
26
|
+
- question.labels.each do |label|
|
27
|
+
- checked = answers[sub_question.code].to_s == label.value.to_s if answers[sub_question.code].present?
|
28
|
+
- checked ||= (label.preselected? ? true : false)
|
29
|
+
%td{ width: label_width }
|
30
|
+
%label
|
31
|
+
= form.simple_fields_for :answers do |answer_form|
|
32
|
+
= answer_form.radio_button sub_question.code, label.value, checked: checked
|
33
|
+
%span.hide-text= label.text
|
34
|
+
%td
|
35
|
+
= sub_question.parts.last if sub_question.splitted?
|
36
|
+
- if mobile
|
37
|
+
.mobile
|
38
|
+
- question.sub_questions.each do |sub_question|
|
39
|
+
%table.table.well
|
40
|
+
%tbody
|
41
|
+
%tr
|
42
|
+
%td.part= sub_question.parts.first
|
43
|
+
%tr
|
44
|
+
%td
|
45
|
+
- question.labels.each do |label|
|
46
|
+
- checked = answers[sub_question.code].to_s == label.value.to_s if answers[sub_question.code].present?
|
47
|
+
- checked ||= (label.preselected? ? true : false)
|
48
|
+
.radio
|
49
|
+
%label.responsive_label
|
50
|
+
= form.simple_fields_for :answers do |answer_form|
|
51
|
+
= answer_form.radio_button sub_question.code, label.value, checked: checked
|
52
|
+
= label.text
|
53
|
+
|
54
|
+
- if sub_question.splitted?
|
55
|
+
%tr
|
56
|
+
%td.part= sub_question.parts.last
|
@@ -1,29 +1,53 @@
|
|
1
1
|
- label_width = "#{80 / question.labels.count}%"
|
2
|
+
- mobile = (browser.mobile? || browser.tablet?) # Use a special layout for this devices
|
2
3
|
|
3
4
|
.radio_matrix.form-group{ class: "#{'has-error' if errors.present?}" }
|
4
5
|
%label{class: "#{'text-danger' if errors.present?}"}
|
5
6
|
!= question.question_text
|
6
7
|
= ' *' if question.required
|
7
|
-
|
8
|
-
|
9
|
-
%
|
10
|
-
%
|
11
|
-
%th
|
12
|
-
- question.labels.each do |label|
|
13
|
-
%th{ width: label_width }
|
14
|
-
= label.text
|
15
|
-
%tbody
|
16
|
-
- question.sub_questions.each do |sub_question|
|
8
|
+
- unless mobile
|
9
|
+
.table-responsive
|
10
|
+
%table.table
|
11
|
+
%thead
|
17
12
|
%tr
|
18
|
-
%
|
19
|
-
= sub_question.parts.first
|
20
|
-
- if errors[sub_question.code]
|
21
|
-
.help-block.text-danger= errors[sub_question.code]
|
13
|
+
%th
|
22
14
|
- question.labels.each do |label|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
15
|
+
%th{ width: label_width }
|
16
|
+
= label.text
|
17
|
+
%tbody
|
18
|
+
- question.sub_questions.each do |sub_question|
|
19
|
+
%tr
|
20
|
+
%td
|
21
|
+
= sub_question.parts.first
|
22
|
+
- if errors[sub_question.code]
|
23
|
+
.help-block.text-danger= errors[sub_question.code]
|
24
|
+
- question.labels.each do |label|
|
25
|
+
- checked = answers[sub_question.code].to_s == label.value.to_s if answers[sub_question.code].present?
|
26
|
+
- checked ||= (label.preselected? ? true : false)
|
27
|
+
%td{ width: label_width }
|
28
|
+
%label
|
29
|
+
= form.simple_fields_for :answers do |answer_form|
|
30
|
+
= answer_form.radio_button sub_question.code, label.value, checked: checked
|
31
|
+
%span.hide-text= label.text
|
32
|
+
|
33
|
+
- if mobile
|
34
|
+
.mobile
|
35
|
+
- question.sub_questions.each do |sub_question|
|
36
|
+
%table.table.well
|
37
|
+
%tbody
|
38
|
+
%tr
|
39
|
+
%td.part= sub_question.parts.first
|
40
|
+
%tr
|
41
|
+
%td
|
42
|
+
- question.labels.each do |label|
|
43
|
+
- checked = answers[sub_question.code].to_s == label.value.to_s if answers[sub_question.code].present?
|
44
|
+
- checked ||= (label.preselected? ? true : false)
|
45
|
+
.radio
|
46
|
+
%label.responsive_label
|
47
|
+
= form.simple_fields_for :answers do |answer_form|
|
48
|
+
= answer_form.radio_button sub_question.code, label.value, checked: checked
|
49
|
+
= label.text
|
50
|
+
|
51
|
+
- if sub_question.splitted?
|
52
|
+
%tr
|
53
|
+
%td.part= sub_question.parts.last
|
data/db/seeds.rb
CHANGED
data/helena.gemspec
CHANGED
@@ -19,24 +19,26 @@ survey/test development, longitudinal studies and instant feedback.'
|
|
19
19
|
s.files = `git ls-files`.split("\n")
|
20
20
|
s.test_files = `git ls-files -- {spec}/*`.split("\n")
|
21
21
|
|
22
|
-
s.add_dependency 'rails', '~> 4.
|
22
|
+
s.add_dependency 'rails', '~> 4.2'
|
23
23
|
s.add_dependency 'mongoid', '~> 4.0'
|
24
24
|
s.add_dependency 'mongoid_orderable', '~> 4.1'
|
25
25
|
s.add_dependency 'mongoid-simple-tags', '~> 0.1'
|
26
|
-
s.add_dependency 'haml-rails', '~> 0.
|
26
|
+
s.add_dependency 'haml-rails', '~> 0.9'
|
27
27
|
s.add_dependency 'slim', '~> 3.0'
|
28
|
-
s.add_dependency 'jquery-rails', '~>
|
28
|
+
s.add_dependency 'jquery-rails', '~> 4.0'
|
29
29
|
s.add_dependency 'sass-rails', '~> 5.0'
|
30
30
|
s.add_dependency 'bootstrap-sass', '~> 3.2'
|
31
31
|
s.add_dependency 'simple_form', '~> 3.1.0.rc2'
|
32
32
|
s.add_dependency 'breadcrumbs_on_rails', '~> 2.3'
|
33
33
|
s.add_dependency 'rails-i18n', '~> 4.0'
|
34
34
|
s.add_dependency 'responders', '~> 2.0'
|
35
|
+
s.add_dependency 'browser', '~> 0.8'
|
36
|
+
s.add_dependency 'mongoid-tree', '~> 2.0'
|
35
37
|
|
36
38
|
s.add_development_dependency 'rspec-rails', '~> 3'
|
37
39
|
s.add_development_dependency 'rspec-collection_matchers', '~> 1'
|
38
40
|
s.add_development_dependency 'factory_girl_rails', '~> 4.4'
|
39
41
|
s.add_development_dependency 'database_cleaner', '~> 1.3'
|
40
|
-
s.add_development_dependency '
|
42
|
+
s.add_development_dependency 'faker', '~> 1.4'
|
41
43
|
s.add_development_dependency 'capybara', '~> 2.3'
|
42
44
|
end
|
data/lib/helena.rb
CHANGED
@@ -13,7 +13,7 @@ module Helena
|
|
13
13
|
private
|
14
14
|
|
15
15
|
def create_survey
|
16
|
-
@survey = Helena::Survey.
|
16
|
+
@survey = Helena::Survey.find_or_initialize_by @parsed.except('versions')
|
17
17
|
return unless @survey.save!
|
18
18
|
return unless @parsed['versions']
|
19
19
|
@parsed['versions'].each { |parsed_version| create_version parsed_version }
|
@@ -21,7 +21,7 @@ module Helena
|
|
21
21
|
|
22
22
|
def create_version(parsed_version)
|
23
23
|
version = build_version(parsed_version)
|
24
|
-
|
24
|
+
return unless version.new_record? # We ignore already imported versions
|
25
25
|
return unless version.save!
|
26
26
|
return unless parsed_version.last['question_groups']
|
27
27
|
parsed_version.last['question_groups'].each { |parsed_question_group| create_question_group version, parsed_question_group }
|
@@ -43,7 +43,7 @@ module Helena
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def build_version(parsed_version)
|
46
|
-
version = @survey.versions.
|
46
|
+
version = @survey.versions.find_or_initialize_by parsed_version.last.except('question_groups', 'survey_detail')
|
47
47
|
version.version = parsed_version.first
|
48
48
|
version.survey_detail = parsed_version.last['survey_detail']
|
49
49
|
version
|
data/lib/helena/version.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module Helena
|
2
2
|
class VersionPublisher
|
3
3
|
def self.publish(version)
|
4
|
-
copied_version =
|
4
|
+
copied_version = build_copied_version_from(version)
|
5
5
|
|
6
6
|
version.question_groups.each do |original_question_group|
|
7
|
-
question_group = copied_version.question_groups.
|
7
|
+
question_group = copied_version.question_groups.build original_question_group.clone.attributes
|
8
8
|
original_question_group.questions.each do |original_question|
|
9
|
-
question = question_group.questions.
|
9
|
+
question = question_group.questions.build original_question.clone.attributes
|
10
10
|
question.labels = original_question.labels
|
11
11
|
question.sub_questions = original_question.sub_questions
|
12
12
|
end
|
@@ -16,6 +16,7 @@ module Helena
|
|
16
16
|
|
17
17
|
def self.adjust_copied_attributes(version, copied_version)
|
18
18
|
copied_version.version = newest_version_of(version.survey) + 1
|
19
|
+
copied_version.survey_detail = version.survey_detail.attributes if version.survey_detail
|
19
20
|
copied_version.created_at = DateTime.now
|
20
21
|
copied_version.updated_at = DateTime.now
|
21
22
|
copied_version.active = false
|
@@ -26,23 +27,9 @@ module Helena
|
|
26
27
|
survey.newest_version.version
|
27
28
|
end
|
28
29
|
|
29
|
-
def self.
|
30
|
-
copied_version =
|
31
|
-
|
32
|
-
copied_version.survey_detail = reset_ids(version.survey_detail.attributes) if version.survey_detail
|
33
|
-
copied_version.save
|
34
|
-
copied_version
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.reset_ids(attributes)
|
38
|
-
attributes.each do |key, value|
|
39
|
-
if key == '_id' && value.is_a?(BSON::ObjectId)
|
40
|
-
attributes[key] = BSON::ObjectId.new
|
41
|
-
elsif value.is_a?(Hash) || value.is_a?(Array)
|
42
|
-
attributes[key] = reset_ids(value)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
attributes
|
30
|
+
def self.build_copied_version_from(version)
|
31
|
+
copied_version = version.clone
|
32
|
+
adjust_copied_attributes(version, copied_version)
|
46
33
|
end
|
47
34
|
end
|
48
35
|
end
|
@@ -3,21 +3,29 @@ require 'spec_helper'
|
|
3
3
|
describe Helena::VersionPublisher do
|
4
4
|
let!(:survey) { create :survey }
|
5
5
|
let!(:source_version) { survey.versions.create version: 42, active: true }
|
6
|
-
let!(:survey_detail) { source_version.survey_detail = build :survey_detail }
|
6
|
+
let!(:survey_detail) { source_version.survey_detail = build :survey_detail, title: 'Bla Bla' }
|
7
7
|
let!(:question_group) { source_version.question_groups.create }
|
8
|
-
let!(:question) {
|
9
|
-
let!(:label) {
|
10
|
-
let!(:sub_question) {
|
8
|
+
let!(:question) { create(:radio_matrix_question, code: 'abc', question_group: question_group) }
|
9
|
+
let!(:label) { create(:label, text: 'xyz', value: 'asdf', question: question) }
|
10
|
+
let!(:sub_question) { create(:sub_question, text: 'ymca', code: 'cde', question: question) }
|
11
11
|
|
12
12
|
it 'creates a new version' do
|
13
13
|
allow(DateTime).to receive(:now).and_return('Tue, 24 Jun 2014 10:24:08 +0200')
|
14
14
|
|
15
15
|
new_version = Helena::VersionPublisher.publish(source_version)
|
16
|
+
new_version.save
|
16
17
|
|
17
18
|
expect(new_version.version).to eq 43
|
18
|
-
expect(new_version.survey_detail).to
|
19
|
+
expect(new_version.survey_detail.title).to eq 'Bla Bla'
|
20
|
+
|
19
21
|
expect(new_version).to have(1).question_groups
|
22
|
+
expect(Helena::QuestionGroup.count).to eq 2
|
23
|
+
expect(new_version.question_groups.first.id).not_to eq source_version.question_groups.first.id
|
24
|
+
|
20
25
|
expect(new_version.question_groups.first).to have_exactly(1).questions
|
26
|
+
expect(new_version.question_groups.first.questions.first.id).not_to eq source_version.question_groups.first.questions.first.id
|
27
|
+
expect(Helena::Question.count).to eq 2
|
28
|
+
|
21
29
|
expect(new_version.question_groups.first.questions.first).to have_exactly(1).labels
|
22
30
|
expect(new_version.question_groups.first.questions.first).to have_exactly(1).sub_questions
|
23
31
|
expect(new_version.created_at).to eq 'Tue, 24 Jun 2014 10:24:08 +0200'
|
@@ -13,6 +13,9 @@ describe Helena::Session do
|
|
13
13
|
it { expect(subject).to validate_uniqueness_of(:token) }
|
14
14
|
it { expect(subject).to validate_uniqueness_of(:view_token) }
|
15
15
|
|
16
|
+
it { expect(subject).to have_index_for(created_at: 1) }
|
17
|
+
it { expect(subject).to have_index_for(updated_at: 1) }
|
18
|
+
|
16
19
|
it 'has a valid factory' do
|
17
20
|
expect(build :session).to be_valid
|
18
21
|
end
|
@@ -22,17 +25,6 @@ describe Helena::Session do
|
|
22
25
|
expect(create(:session_without_token).token).to eq 'a493oP'
|
23
26
|
end
|
24
27
|
|
25
|
-
it 'exports as CSV with answers' do
|
26
|
-
session.answers << Helena::Answer.build_generic('a', 42, '192.168.0.1')
|
27
|
-
session.answers << Helena::Answer.build_generic('b', true, '192.235.0.1')
|
28
|
-
session.answers << Helena::Answer.build_generic('c', 'Barbra Streisand!!', '192.999.0.1')
|
29
|
-
|
30
|
-
csv = Helena::Session.to_csv
|
31
|
-
|
32
|
-
expect(csv).to include 'a,b,c'
|
33
|
-
expect(csv).to include '42,true,Barbra Streisand!!'
|
34
|
-
end
|
35
|
-
|
36
28
|
describe '#answers_as_yaml and #answer_as_yaml=' do
|
37
29
|
before do
|
38
30
|
session.answers << Helena::Answer.build_generic('c', 'Barbra Streisand!!', '192.999.0.1')
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: helena
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.rc3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Graf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '4.
|
19
|
+
version: '4.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '4.
|
26
|
+
version: '4.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: mongoid
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '0.
|
75
|
+
version: '0.9'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '0.
|
82
|
+
version: '0.9'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: slim
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
103
|
+
version: '4.0'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '4.0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: sass-rails
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,6 +192,34 @@ dependencies:
|
|
192
192
|
- - "~>"
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '2.0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: browser
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0.8'
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0.8'
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: mongoid-tree
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - "~>"
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: '2.0'
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - "~>"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: '2.0'
|
195
223
|
- !ruby/object:Gem::Dependency
|
196
224
|
name: rspec-rails
|
197
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -249,19 +277,19 @@ dependencies:
|
|
249
277
|
- !ruby/object:Gem::Version
|
250
278
|
version: '1.3'
|
251
279
|
- !ruby/object:Gem::Dependency
|
252
|
-
name:
|
280
|
+
name: faker
|
253
281
|
requirement: !ruby/object:Gem::Requirement
|
254
282
|
requirements:
|
255
283
|
- - "~>"
|
256
284
|
- !ruby/object:Gem::Version
|
257
|
-
version: '1.
|
285
|
+
version: '1.4'
|
258
286
|
type: :development
|
259
287
|
prerelease: false
|
260
288
|
version_requirements: !ruby/object:Gem::Requirement
|
261
289
|
requirements:
|
262
290
|
- - "~>"
|
263
291
|
- !ruby/object:Gem::Version
|
264
|
-
version: '1.
|
292
|
+
version: '1.4'
|
265
293
|
- !ruby/object:Gem::Dependency
|
266
294
|
name: capybara
|
267
295
|
requirement: !ruby/object:Gem::Requirement
|
@@ -447,7 +475,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
447
475
|
version: 1.3.1
|
448
476
|
requirements: []
|
449
477
|
rubyforge_project:
|
450
|
-
rubygems_version: 2.
|
478
|
+
rubygems_version: 2.4.5
|
451
479
|
signing_key:
|
452
480
|
specification_version: 4
|
453
481
|
summary: Helena is an online survey/test framework designed for agile survey/test
|