trackler 2.0.6.1 → 2.0.6.2
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 +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/go/exercises/word-count/cases_test.go +23 -4
- data/tracks/go/exercises/word-count/example.go +6 -2
- data/tracks/go/exercises/word-count/word_count.go +1 -1
- data/tracks/go/exercises/word-count/word_count_test.go +1 -1
- data/tracks/pony/.travis.yml +16 -4
- data/tracks/pony/bin/install-deps +12 -0
- data/tracks/pony/bin/test-exercises +22 -0
- data/tracks/ruby/Gemfile +1 -0
- data/tracks/ruby/Rakefile +1 -1
- data/tracks/ruby/bin/generate +4 -29
- data/tracks/ruby/exercises/all-your-base/.meta/.version +1 -0
- data/tracks/ruby/exercises/all-your-base/all_your_base_test.rb +50 -60
- data/tracks/ruby/exercises/all-your-base/example.rb +13 -8
- data/tracks/ruby/exercises/all-your-base/example.tt +17 -0
- data/tracks/ruby/lib/all_your_base_cases.rb +109 -0
- data/tracks/ruby/lib/generator.rb +21 -100
- data/tracks/ruby/lib/generator/command_line.rb +119 -0
- data/tracks/ruby/lib/generator/files.rb +58 -0
- data/tracks/ruby/lib/generator/files/metadata_files.rb +22 -0
- data/tracks/ruby/lib/generator/files/track_files.rb +83 -0
- data/tracks/ruby/lib/generator/git_command.rb +8 -0
- data/tracks/ruby/lib/generator/repository.rb +62 -0
- data/tracks/ruby/lib/generator/template_values.rb +47 -0
- data/tracks/ruby/lib/helper.rb +5 -2
- data/tracks/ruby/test/fixtures/metadata/exercises/alpha/canonical-data.json +8 -9
- data/tracks/ruby/test/fixtures/{exercises → xruby/exercises}/alpha/.meta/.version +0 -0
- data/tracks/ruby/test/fixtures/{exercises → xruby/exercises}/alpha/example.rb +0 -0
- data/tracks/ruby/test/fixtures/xruby/exercises/alpha/example.tt +20 -0
- data/tracks/ruby/test/fixtures/xruby/lib/alpha_cases.rb +20 -0
- data/tracks/ruby/test/fixtures/xruby/lib/beta_cases.rb +0 -0
- data/tracks/ruby/test/generator/command_line_test.rb +83 -0
- data/tracks/ruby/test/generator/files/metadata_files_test.rb +25 -0
- data/tracks/ruby/test/generator/files/track_files_test.rb +117 -0
- data/tracks/ruby/test/generator/files_test.rb +63 -0
- data/tracks/ruby/test/generator/git_command_test.rb +9 -0
- data/tracks/ruby/test/generator/repository_test.rb +98 -0
- data/tracks/ruby/test/generator/template_values_test.rb +59 -0
- data/tracks/ruby/test/generator_test.rb +19 -63
- data/tracks/ruby/test/test_helper.rb +8 -5
- metadata +26 -6
- data/tracks/ruby/test/fixtures/exercises/alpha/alpha_test.rb +0 -1
- data/tracks/ruby/test/fixtures/exercises/alpha/example.tt +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4e158fdc06604fcbf8f1d27f05a396e4261aaf1
|
4
|
+
data.tar.gz: 9f340d289a11e75954cff74b6443048991f45def
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f72f08277f2e36d640b7e99a9a527e11b48ff5160457a57590e7c48beed426b75b4191faf5286bf97880a39bf5fea9c49ad6716202c804617551b30c4d6190d
|
7
|
+
data.tar.gz: 908336cbfd218c1e95f05f6a2c16c1f9e158a05b43bac7df5d1e1af15a196ec9341597fad8a61cbf0760f240082b350fedd0d04b06a90660fafe99ba1fd864a9
|
data/lib/trackler/version.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
package wordcount
|
2
2
|
|
3
3
|
// Source: exercism/x-common
|
4
|
-
// Commit: 3b07e53 Merge pull request #117 from mikeyjcat/add-raindrops-json
|
5
4
|
|
6
5
|
var testCases = []struct {
|
7
6
|
description string
|
@@ -23,9 +22,19 @@ var testCases = []struct {
|
|
23
22
|
"one fish two fish red fish blue fish",
|
24
23
|
Frequency{"blue": 1, "fish": 4, "one": 1, "red": 1, "two": 1},
|
25
24
|
},
|
25
|
+
{
|
26
|
+
"handles cramped lists",
|
27
|
+
"one,two,three",
|
28
|
+
Frequency{"one": 1, "three": 1, "two": 1},
|
29
|
+
},
|
30
|
+
{
|
31
|
+
"handles expanded lists",
|
32
|
+
"one,\ntwo,\nthree",
|
33
|
+
Frequency{"one": 1, "three": 1, "two": 1},
|
34
|
+
},
|
26
35
|
{
|
27
36
|
"ignore punctuation",
|
28
|
-
"car
|
37
|
+
"car: carpet as java: javascript!!&@$%^&",
|
29
38
|
Frequency{"as": 1, "car": 1, "carpet": 1, "java": 1, "javascript": 1},
|
30
39
|
},
|
31
40
|
{
|
@@ -35,7 +44,17 @@ var testCases = []struct {
|
|
35
44
|
},
|
36
45
|
{
|
37
46
|
"normalize case",
|
38
|
-
"go Go GO",
|
39
|
-
Frequency{"go": 3},
|
47
|
+
"go Go GO Stop stop",
|
48
|
+
Frequency{"go": 3, "stop": 2},
|
49
|
+
},
|
50
|
+
{
|
51
|
+
"with apostrophes",
|
52
|
+
"First: don't laugh. Then: don't cry.",
|
53
|
+
Frequency{"cry": 1, "don't": 2, "first": 1, "laugh": 1, "then": 1},
|
54
|
+
},
|
55
|
+
{
|
56
|
+
"with_quotations",
|
57
|
+
"Joe can't tell between 'large' and large.",
|
58
|
+
Frequency{"and": 1, "between": 1, "can't": 1, "joe": 1, "large": 2, "tell": 1},
|
40
59
|
},
|
41
60
|
}
|
@@ -5,20 +5,24 @@ import (
|
|
5
5
|
"strings"
|
6
6
|
)
|
7
7
|
|
8
|
-
const testVersion =
|
8
|
+
const testVersion = 3
|
9
9
|
|
10
|
+
// Frequency is a map of the frequency of occurrence keyed to the unique word.
|
10
11
|
type Frequency map[string]int
|
11
12
|
|
13
|
+
// WordCount returns the map of frequency of words based on the input phrase.
|
12
14
|
func WordCount(phrase string) Frequency {
|
13
15
|
freq := Frequency{}
|
14
16
|
for _, word := range strings.Fields(normalize(phrase)) {
|
17
|
+
word = strings.Trim(word, "'")
|
15
18
|
freq[word]++
|
16
19
|
}
|
17
20
|
return freq
|
18
21
|
}
|
19
22
|
|
20
23
|
func normalize(phrase string) string {
|
21
|
-
|
24
|
+
// Allow for apostrophes in words.
|
25
|
+
r, _ := regexp.Compile(`[^\w|']`)
|
22
26
|
phrase = strings.ToLower(phrase)
|
23
27
|
return r.ReplaceAllLiteralString(phrase, " ")
|
24
28
|
}
|
data/tracks/pony/.travis.yml
CHANGED
@@ -1,6 +1,18 @@
|
|
1
1
|
---
|
2
|
-
language:
|
2
|
+
language: c
|
3
|
+
|
4
|
+
sudo: true
|
5
|
+
|
6
|
+
install:
|
7
|
+
- sudo apt-get update -q
|
8
|
+
- sudo apt-get install -y python-software-properties
|
9
|
+
- sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
|
10
|
+
- sudo apt-get update -q
|
11
|
+
- sudo apt-get install -y wget git apt-transport-https g++-5 build-essential zlib1g-dev libncurses5-dev libssl-dev
|
12
|
+
|
13
|
+
- sudo bash bin/install-deps
|
14
|
+
|
3
15
|
script:
|
4
|
-
- bin/fetch-configlet
|
5
|
-
- bin/configlet .
|
6
|
-
|
16
|
+
- bin/fetch-configlet
|
17
|
+
- bin/configlet .
|
18
|
+
- bin/test-exercises
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# Install pcre2
|
4
|
+
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre2-10.21.tar.bz2
|
5
|
+
tar -xjvf pcre2-10.21.tar.bz2
|
6
|
+
cd pcre2-10.21 && ./configure --prefix=/usr && make && sudo make install && cd -
|
7
|
+
rm -r pcre2-10.21
|
8
|
+
|
9
|
+
# Insall ponyc
|
10
|
+
echo "deb https://dl.bintray.com/pony-language/ponyc-debian pony-language main" | sudo tee -a /etc/apt/sources.list
|
11
|
+
sudo apt-get update -q
|
12
|
+
sudo apt-get install -y --force-yes ponyc-release
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
set -eu
|
4
|
+
|
5
|
+
run_tests() {
|
6
|
+
local path=$1
|
7
|
+
local base=$(basename $path)
|
8
|
+
printf "\nRunning tests for %s\n\n" $base
|
9
|
+
(
|
10
|
+
cd $path
|
11
|
+
ponyc -d -V0
|
12
|
+
./$base
|
13
|
+
rm $base
|
14
|
+
)
|
15
|
+
}
|
16
|
+
|
17
|
+
exercises_dir="exercises/*"
|
18
|
+
|
19
|
+
for path in $exercises_dir; do
|
20
|
+
[ -d "${path}" ] || continue
|
21
|
+
run_tests $path
|
22
|
+
done
|
data/tracks/ruby/Gemfile
CHANGED
data/tracks/ruby/Rakefile
CHANGED
data/tracks/ruby/bin/generate
CHANGED
@@ -3,34 +3,9 @@
|
|
3
3
|
require_relative '../lib/helper'
|
4
4
|
require 'generator'
|
5
5
|
|
6
|
-
|
7
|
-
cases = File.join( __dir__, '../lib/*_cases.rb')
|
8
|
-
Dir[cases].map {|filename| /([^\/]*)_cases\.rb$/.match(filename).captures}
|
9
|
-
end
|
6
|
+
paths = Generator::Paths.new(track: XRUBY_ROOT, metadata: METADATA_REPOSITORY_PATH)
|
10
7
|
|
11
|
-
|
12
|
-
|
13
|
-
"Available exercise generators:\n" +
|
14
|
-
available_generators.sort.join(' ')
|
15
|
-
end
|
16
|
-
|
17
|
-
exercise = ARGV[0]
|
18
|
-
|
19
|
-
unless exercise
|
20
|
-
STDERR.puts "Exercise name required!\n"
|
21
|
-
puts usage
|
22
|
-
exit
|
23
|
-
end
|
24
|
-
|
25
|
-
cases = "#{exercise.tr('-','_')}_cases"
|
26
|
-
|
27
|
-
begin
|
28
|
-
require "#{cases}"
|
29
|
-
rescue LoadError
|
30
|
-
puts "A generator does not currently exist for #{exercise}!"
|
31
|
-
exit(1)
|
32
|
-
end
|
33
|
-
|
34
|
-
klass = Object.const_get(cases.split('_').map(&:capitalize).join)
|
35
|
-
Generator.new(exercise, klass).generate
|
8
|
+
generator = Generator::CommandLine.new(paths).parse(ARGV)
|
9
|
+
exit 1 unless generator
|
36
10
|
|
11
|
+
generator.call
|
@@ -0,0 +1 @@
|
|
1
|
+
2
|
@@ -1,9 +1,10 @@
|
|
1
|
-
gem 'minitest', '>= 5.0.0'
|
2
1
|
require 'minitest/autorun'
|
3
2
|
require_relative 'all_your_base'
|
4
3
|
|
4
|
+
# Test data version: aa12f2e
|
5
5
|
class AllYourBaseTest < Minitest::Test
|
6
|
-
def
|
6
|
+
def test_single_bit_one_to_decimal
|
7
|
+
# skip
|
7
8
|
digits = [1]
|
8
9
|
input_base = 2
|
9
10
|
output_base = 10
|
@@ -131,7 +132,7 @@ class AllYourBaseTest < Minitest::Test
|
|
131
132
|
def test_single_zero
|
132
133
|
skip
|
133
134
|
digits = [0]
|
134
|
-
input_base
|
135
|
+
input_base = 10
|
135
136
|
output_base = 2
|
136
137
|
expected = [0]
|
137
138
|
|
@@ -142,10 +143,10 @@ class AllYourBaseTest < Minitest::Test
|
|
142
143
|
"Expected #{expected} but got #{converted}."
|
143
144
|
end
|
144
145
|
|
145
|
-
def
|
146
|
+
def test_multiple_zeros
|
146
147
|
skip
|
147
148
|
digits = [0, 0, 0]
|
148
|
-
input_base
|
149
|
+
input_base = 10
|
149
150
|
output_base = 2
|
150
151
|
expected = [0]
|
151
152
|
|
@@ -175,13 +176,10 @@ class AllYourBaseTest < Minitest::Test
|
|
175
176
|
digits = [1, -1, 1, 0, 1, 0]
|
176
177
|
input_base = 2
|
177
178
|
output_base = 10
|
178
|
-
expected = nil
|
179
|
-
|
180
|
-
converted = BaseConverter.convert(input_base, digits, output_base)
|
181
179
|
|
182
|
-
|
183
|
-
|
184
|
-
|
180
|
+
assert_raises ArgumentError do
|
181
|
+
BaseConverter.convert(input_base, digits, output_base)
|
182
|
+
end
|
185
183
|
end
|
186
184
|
|
187
185
|
def test_invalid_positive_digit
|
@@ -189,13 +187,10 @@ class AllYourBaseTest < Minitest::Test
|
|
189
187
|
digits = [1, 2, 1, 0, 1, 0]
|
190
188
|
input_base = 2
|
191
189
|
output_base = 10
|
192
|
-
expected = nil
|
193
|
-
|
194
|
-
converted = BaseConverter.convert(input_base, digits, output_base)
|
195
190
|
|
196
|
-
|
197
|
-
|
198
|
-
|
191
|
+
assert_raises ArgumentError do
|
192
|
+
BaseConverter.convert(input_base, digits, output_base)
|
193
|
+
end
|
199
194
|
end
|
200
195
|
|
201
196
|
def test_first_base_is_one
|
@@ -203,13 +198,10 @@ class AllYourBaseTest < Minitest::Test
|
|
203
198
|
digits = []
|
204
199
|
input_base = 1
|
205
200
|
output_base = 10
|
206
|
-
expected = nil
|
207
201
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
"Input base: #{input_base}, output base #{output_base}. " \
|
212
|
-
"Expected #{expected} but got #{converted}."
|
202
|
+
assert_raises ArgumentError do
|
203
|
+
BaseConverter.convert(input_base, digits, output_base)
|
204
|
+
end
|
213
205
|
end
|
214
206
|
|
215
207
|
def test_second_base_is_one
|
@@ -217,13 +209,10 @@ class AllYourBaseTest < Minitest::Test
|
|
217
209
|
digits = [1, 0, 1, 0, 1, 0]
|
218
210
|
input_base = 2
|
219
211
|
output_base = 1
|
220
|
-
expected = nil
|
221
|
-
|
222
|
-
converted = BaseConverter.convert(input_base, digits, output_base)
|
223
212
|
|
224
|
-
|
225
|
-
|
226
|
-
|
213
|
+
assert_raises ArgumentError do
|
214
|
+
BaseConverter.convert(input_base, digits, output_base)
|
215
|
+
end
|
227
216
|
end
|
228
217
|
|
229
218
|
def test_first_base_is_zero
|
@@ -231,13 +220,10 @@ class AllYourBaseTest < Minitest::Test
|
|
231
220
|
digits = []
|
232
221
|
input_base = 0
|
233
222
|
output_base = 10
|
234
|
-
expected = nil
|
235
|
-
|
236
|
-
converted = BaseConverter.convert(input_base, digits, output_base)
|
237
223
|
|
238
|
-
|
239
|
-
|
240
|
-
|
224
|
+
assert_raises ArgumentError do
|
225
|
+
BaseConverter.convert(input_base, digits, output_base)
|
226
|
+
end
|
241
227
|
end
|
242
228
|
|
243
229
|
def test_second_base_is_zero
|
@@ -245,13 +231,10 @@ class AllYourBaseTest < Minitest::Test
|
|
245
231
|
digits = [7]
|
246
232
|
input_base = 10
|
247
233
|
output_base = 0
|
248
|
-
expected = nil
|
249
234
|
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
"Input base: #{input_base}, output base #{output_base}. " \
|
254
|
-
"Expected #{expected} but got #{converted}."
|
235
|
+
assert_raises ArgumentError do
|
236
|
+
BaseConverter.convert(input_base, digits, output_base)
|
237
|
+
end
|
255
238
|
end
|
256
239
|
|
257
240
|
def test_first_base_is_negative
|
@@ -259,13 +242,10 @@ class AllYourBaseTest < Minitest::Test
|
|
259
242
|
digits = [1]
|
260
243
|
input_base = -2
|
261
244
|
output_base = 10
|
262
|
-
expected = nil
|
263
|
-
|
264
|
-
converted = BaseConverter.convert(input_base, digits, output_base)
|
265
245
|
|
266
|
-
|
267
|
-
|
268
|
-
|
246
|
+
assert_raises ArgumentError do
|
247
|
+
BaseConverter.convert(input_base, digits, output_base)
|
248
|
+
end
|
269
249
|
end
|
270
250
|
|
271
251
|
def test_second_base_is_negative
|
@@ -273,13 +253,10 @@ class AllYourBaseTest < Minitest::Test
|
|
273
253
|
digits = [1]
|
274
254
|
input_base = 2
|
275
255
|
output_base = -7
|
276
|
-
expected = nil
|
277
|
-
|
278
|
-
converted = BaseConverter.convert(input_base, digits, output_base)
|
279
256
|
|
280
|
-
|
281
|
-
|
282
|
-
|
257
|
+
assert_raises ArgumentError do
|
258
|
+
BaseConverter.convert(input_base, digits, output_base)
|
259
|
+
end
|
283
260
|
end
|
284
261
|
|
285
262
|
def test_both_bases_are_negative
|
@@ -287,17 +264,30 @@ class AllYourBaseTest < Minitest::Test
|
|
287
264
|
digits = [1]
|
288
265
|
input_base = -2
|
289
266
|
output_base = -7
|
290
|
-
expected = nil
|
291
267
|
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
"Input base: #{input_base}, output base #{output_base}. " \
|
296
|
-
"Expected #{expected} but got #{converted}."
|
268
|
+
assert_raises ArgumentError do
|
269
|
+
BaseConverter.convert(input_base, digits, output_base)
|
270
|
+
end
|
297
271
|
end
|
298
272
|
|
273
|
+
# Problems in exercism evolve over time, as we find better ways to ask
|
274
|
+
# questions.
|
275
|
+
# The version number refers to the version of the problem you solved,
|
276
|
+
# not your solution.
|
277
|
+
#
|
278
|
+
# Define a constant named VERSION inside of the top level BookKeeping
|
279
|
+
# module, which may be placed near the end of your file.
|
280
|
+
#
|
281
|
+
# In your file, it will look like this:
|
282
|
+
#
|
283
|
+
# module BookKeeping
|
284
|
+
# VERSION = 1 # Where the version number matches the one in the test.
|
285
|
+
# end
|
286
|
+
#
|
287
|
+
# If you are curious, read more about constants on RubyDoc:
|
288
|
+
# http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html
|
299
289
|
def test_bookkeeping
|
300
290
|
skip
|
301
|
-
assert_equal
|
291
|
+
assert_equal 2, BookKeeping::VERSION
|
302
292
|
end
|
303
293
|
end
|
@@ -1,21 +1,26 @@
|
|
1
1
|
module BookKeeping
|
2
|
-
VERSION =
|
2
|
+
VERSION = 2
|
3
3
|
end
|
4
4
|
|
5
5
|
class BaseConverter
|
6
6
|
def self.convert(base_from, number_array, base_to)
|
7
|
-
|
8
|
-
return if base_from <= 1 || base_to <= 1
|
7
|
+
fail ArgumentError if invalid_inputs?(base_from, number_array, base_to)
|
9
8
|
return [] unless number_array.any?
|
10
9
|
number_in_canonical_base = convert_to_canonical_base(number_array, base_from)
|
11
10
|
convert_from_canonical_base(number_in_canonical_base, base_to)
|
12
11
|
end
|
13
12
|
|
14
|
-
|
13
|
+
private_class_method
|
14
|
+
|
15
|
+
def self.invalid_inputs?(base_from, number_array, base_to)
|
16
|
+
number_array.any? { |number| number < 0 || number >= base_from } ||
|
17
|
+
base_from <= 1 || base_to <= 1
|
18
|
+
end
|
19
|
+
|
15
20
|
def self.convert_to_canonical_base(number_array, base)
|
16
21
|
total = 0
|
17
22
|
number_array.reverse.each_with_index do |number, index|
|
18
|
-
total += number * base
|
23
|
+
total += number * base**index
|
19
24
|
end
|
20
25
|
total
|
21
26
|
end
|
@@ -23,9 +28,9 @@ class BaseConverter
|
|
23
28
|
def self.convert_from_canonical_base(number, base_to)
|
24
29
|
result = []
|
25
30
|
current_number = number
|
26
|
-
while current_number >= base_to
|
27
|
-
|
28
|
-
|
31
|
+
while current_number >= base_to
|
32
|
+
result << current_number % base_to
|
33
|
+
current_number /= base_to
|
29
34
|
end
|
30
35
|
result << current_number % base_to
|
31
36
|
result.reverse
|