trackler 2.0.6.1 → 2.0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/go/exercises/word-count/cases_test.go +23 -4
  4. data/tracks/go/exercises/word-count/example.go +6 -2
  5. data/tracks/go/exercises/word-count/word_count.go +1 -1
  6. data/tracks/go/exercises/word-count/word_count_test.go +1 -1
  7. data/tracks/pony/.travis.yml +16 -4
  8. data/tracks/pony/bin/install-deps +12 -0
  9. data/tracks/pony/bin/test-exercises +22 -0
  10. data/tracks/ruby/Gemfile +1 -0
  11. data/tracks/ruby/Rakefile +1 -1
  12. data/tracks/ruby/bin/generate +4 -29
  13. data/tracks/ruby/exercises/all-your-base/.meta/.version +1 -0
  14. data/tracks/ruby/exercises/all-your-base/all_your_base_test.rb +50 -60
  15. data/tracks/ruby/exercises/all-your-base/example.rb +13 -8
  16. data/tracks/ruby/exercises/all-your-base/example.tt +17 -0
  17. data/tracks/ruby/lib/all_your_base_cases.rb +109 -0
  18. data/tracks/ruby/lib/generator.rb +21 -100
  19. data/tracks/ruby/lib/generator/command_line.rb +119 -0
  20. data/tracks/ruby/lib/generator/files.rb +58 -0
  21. data/tracks/ruby/lib/generator/files/metadata_files.rb +22 -0
  22. data/tracks/ruby/lib/generator/files/track_files.rb +83 -0
  23. data/tracks/ruby/lib/generator/git_command.rb +8 -0
  24. data/tracks/ruby/lib/generator/repository.rb +62 -0
  25. data/tracks/ruby/lib/generator/template_values.rb +47 -0
  26. data/tracks/ruby/lib/helper.rb +5 -2
  27. data/tracks/ruby/test/fixtures/metadata/exercises/alpha/canonical-data.json +8 -9
  28. data/tracks/ruby/test/fixtures/{exercises → xruby/exercises}/alpha/.meta/.version +0 -0
  29. data/tracks/ruby/test/fixtures/{exercises → xruby/exercises}/alpha/example.rb +0 -0
  30. data/tracks/ruby/test/fixtures/xruby/exercises/alpha/example.tt +20 -0
  31. data/tracks/ruby/test/fixtures/xruby/lib/alpha_cases.rb +20 -0
  32. data/tracks/ruby/test/fixtures/xruby/lib/beta_cases.rb +0 -0
  33. data/tracks/ruby/test/generator/command_line_test.rb +83 -0
  34. data/tracks/ruby/test/generator/files/metadata_files_test.rb +25 -0
  35. data/tracks/ruby/test/generator/files/track_files_test.rb +117 -0
  36. data/tracks/ruby/test/generator/files_test.rb +63 -0
  37. data/tracks/ruby/test/generator/git_command_test.rb +9 -0
  38. data/tracks/ruby/test/generator/repository_test.rb +98 -0
  39. data/tracks/ruby/test/generator/template_values_test.rb +59 -0
  40. data/tracks/ruby/test/generator_test.rb +19 -63
  41. data/tracks/ruby/test/test_helper.rb +8 -5
  42. metadata +26 -6
  43. data/tracks/ruby/test/fixtures/exercises/alpha/alpha_test.rb +0 -1
  44. 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: e0a5ee73b9501fd6101f3faf9913c4634acd6cf8
4
- data.tar.gz: 4c49bfef6fa06b4a9b9fed119dd455a7a2dd6859
3
+ metadata.gz: b4e158fdc06604fcbf8f1d27f05a396e4261aaf1
4
+ data.tar.gz: 9f340d289a11e75954cff74b6443048991f45def
5
5
  SHA512:
6
- metadata.gz: 240744071c995385c5f96242c76a12c41ae1d60f4bc82194771c9feb90d9b0d2ee2efe97925a11a57ebb0969927572f6ecec12e721a7eb303111e5bde0d021ee
7
- data.tar.gz: 76be73161db9c3d6114e2b2f2f7409c59ad09de0b79d56515b52e2df3d4a03b7909e9b0229ad84d4e0e88976ba37dae44f394a09a17d5512851cb83d7149fa7f
6
+ metadata.gz: 5f72f08277f2e36d640b7e99a9a527e11b48ff5160457a57590e7c48beed426b75b4191faf5286bf97880a39bf5fea9c49ad6716202c804617551b30c4d6190d
7
+ data.tar.gz: 908336cbfd218c1e95f05f6a2c16c1f9e158a05b43bac7df5d1e1af15a196ec9341597fad8a61cbf0760f240082b350fedd0d04b06a90660fafe99ba1fd864a9
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.0.6.1"
2
+ VERSION = "2.0.6.2"
3
3
  end
@@ -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 : carpet as java : javascript!!&@$%^&",
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 = 2
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
- r, _ := regexp.Compile(`[^\w]`)
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
  }
@@ -1,6 +1,6 @@
1
1
  package wordcount
2
2
 
3
- const testVersion = 2
3
+ const testVersion = 3
4
4
 
5
5
  // Use this return type.
6
6
  type Frequency map[string]int
@@ -5,7 +5,7 @@ import (
5
5
  "testing"
6
6
  )
7
7
 
8
- const targetTestVersion = 2
8
+ const targetTestVersion = 3
9
9
 
10
10
  func TestWordCount(t *testing.T) {
11
11
  if testVersion != targetTestVersion {
@@ -1,6 +1,18 @@
1
1
  ---
2
- language: bash
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
- sudo: false
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
@@ -4,3 +4,4 @@ gem 'minitest'
4
4
  gem 'rubocop', '0.36.0'
5
5
  gem 'simplecov'
6
6
  gem 'rake'
7
+ gem 'require_all'
@@ -5,5 +5,5 @@ desc 'rake with no argument will run "rake test"'
5
5
  task default: :test
6
6
 
7
7
  Rake::TestTask.new do |task|
8
- task.pattern = 'test/*_test.rb'
8
+ task.pattern = 'test/**/*_test.rb'
9
9
  end
@@ -3,34 +3,9 @@
3
3
  require_relative '../lib/helper'
4
4
  require 'generator'
5
5
 
6
- def available_generators
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
- def usage
12
- "Usage: #{$PROGRAM_NAME} exercise_generator\n\n" +
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
@@ -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 test_single_bit_to_one_decimal
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 = 10
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 test_multiple_zeroes
146
+ def test_multiple_zeros
146
147
  skip
147
148
  digits = [0, 0, 0]
148
- input_base = 10
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
- assert_equal expected, converted,
183
- "Input base: #{input_base}, output base #{output_base}. " \
184
- "Expected #{expected} but got #{converted}."
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
- assert_equal expected, converted,
197
- "Input base: #{input_base}, output base #{output_base}. " \
198
- "Expected #{expected} but got #{converted}."
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
- converted = BaseConverter.convert(input_base, digits, output_base)
209
-
210
- assert_equal expected, converted,
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
- assert_equal expected, converted,
225
- "Input base: #{input_base}, output base #{output_base}. " \
226
- "Expected #{expected} but got #{converted}."
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
- assert_equal expected, converted,
239
- "Input base: #{input_base}, output base #{output_base}. " \
240
- "Expected #{expected} but got #{converted}."
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
- converted = BaseConverter.convert(input_base, digits, output_base)
251
-
252
- assert_equal expected, converted,
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
- assert_equal expected, converted,
267
- "Input base: #{input_base}, output base #{output_base}. " \
268
- "Expected #{expected} but got #{converted}."
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
- assert_equal expected, converted,
281
- "Input base: #{input_base}, output base #{output_base}. " \
282
- "Expected #{expected} but got #{converted}."
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
- converted = BaseConverter.convert(input_base, digits, output_base)
293
-
294
- assert_equal expected, converted,
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 1, BookKeeping::VERSION
291
+ assert_equal 2, BookKeeping::VERSION
302
292
  end
303
293
  end
@@ -1,21 +1,26 @@
1
1
  module BookKeeping
2
- VERSION = 1
2
+ VERSION = 2
3
3
  end
4
4
 
5
5
  class BaseConverter
6
6
  def self.convert(base_from, number_array, base_to)
7
- return if number_array.any?{|number| number < 0 || number >= base_from}
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
- private
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 ** index
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 do
27
- result << current_number % base_to
28
- current_number = current_number / base_to
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