trackler 2.1.0.36 → 2.1.0.37

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/common/CONTRIBUTING.md +1 -1
  3. data/lib/trackler/version.rb +1 -1
  4. data/lib/trackler.rb +0 -5
  5. data/tracks/c/config.json +0 -5
  6. data/tracks/clojure/config.json +177 -59
  7. data/tracks/clojure/exercises/kindergarten-garden/src/example.clj +10 -8
  8. data/tracks/elisp/config.json +60 -24
  9. data/tracks/elixir/exercises/poker/poker_test.exs +1 -1
  10. data/tracks/fortran/config.json +6 -0
  11. data/tracks/fortran/exercises/pangram/example.f90 +33 -0
  12. data/tracks/fortran/exercises/pangram/pangram.fun +42 -0
  13. data/tracks/go/config.json +10 -4
  14. data/tracks/go/exercises/acronym/acronym.go +1 -1
  15. data/tracks/groovy/{SETUP.md → docs/EXERCISE_README_INSERT.md} +0 -0
  16. data/tracks/haskell/config.json +1 -1
  17. data/tracks/java/bin/journey-test.sh +3 -0
  18. data/tracks/java/config.json +14 -14
  19. data/tracks/java/exercises/binary-search/src/test/java/BinarySearchTest.java +20 -20
  20. data/tracks/java/exercises/binary-search-tree/src/test/java/BSTTest.java +32 -32
  21. data/tracks/java/exercises/build.gradle +57 -31
  22. data/tracks/java/exercises/hello-world/GETTING_STARTED.md +4 -0
  23. data/tracks/java/exercises/pythagorean-triplet/src/test/java/PythagoreanTripletTest.java +8 -8
  24. data/tracks/java/exercises/scrabble-score/src/example/java/Scrabble.java +1 -1
  25. data/tracks/java/exercises/scrabble-score/src/test/java/ScrabbleScoreTest.java +10 -5
  26. data/tracks/java/exercises/series/src/test/java/SeriesTest.java +20 -20
  27. data/tracks/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  28. data/tracks/java/gradle/wrapper/gradle-wrapper.properties +2 -2
  29. data/tracks/julia/runtests.jl +1 -6
  30. data/tracks/kotlin/.gitignore +0 -5
  31. data/tracks/kotlin/.travis.yml +21 -1
  32. data/tracks/kotlin/bin/build-jq.sh +11 -0
  33. data/tracks/kotlin/bin/fetch-configlet +1 -1
  34. data/tracks/kotlin/bin/journey-test.sh +34 -14
  35. data/tracks/kotlin/bin/unit-tests.sh +2 -2
  36. data/tracks/kotlin/config.json +230 -160
  37. data/tracks/kotlin/exercises/build.gradle +3 -0
  38. data/tracks/kotlin/exercises/collatz-conjecture/src/test/kotlin/CollatzCalculatorTest.kt +7 -1
  39. data/tracks/kotlin/exercises/gradle.properties +1 -0
  40. data/tracks/kotlin/exercises/list-ops/HINTS.md +5 -0
  41. data/tracks/kotlin/exercises/list-ops/build.gradle +28 -0
  42. data/tracks/kotlin/exercises/list-ops/src/example/kotlin/CustomListExtensions.kt +43 -0
  43. data/tracks/kotlin/exercises/list-ops/src/main/kotlin/.keep +0 -0
  44. data/tracks/kotlin/exercises/list-ops/src/test/kotlin/ListExtensionsTest.kt +157 -0
  45. data/tracks/kotlin/exercises/settings.gradle +13 -12
  46. data/tracks/kotlin/gradle/wrapper/gradle-wrapper.jar +0 -0
  47. data/tracks/kotlin/gradle/wrapper/gradle-wrapper.properties +6 -0
  48. data/tracks/kotlin/gradlew +172 -0
  49. data/tracks/kotlin/gradlew.bat +84 -0
  50. data/tracks/lfe/config.json +90 -30
  51. data/tracks/ocaml/.travis-ci.sh +1 -1
  52. data/tracks/ocaml/.travis.yml +1 -1
  53. data/tracks/ocaml/README.md +1 -1
  54. data/tracks/perl5/.travis.yml +3 -2
  55. data/tracks/perl6/bin/exercise-gen.pl6 +6 -3
  56. data/tracks/racket/config.json +63 -21
  57. data/tracks/ruby/exercises/bob/bob_test.rb +0 -1
  58. data/tracks/ruby/lib/generator/command_line.rb +7 -3
  59. data/tracks/ruby/lib/generator/exercise.rb +19 -0
  60. data/tracks/ruby/lib/generator/files/generator_cases.rb +0 -4
  61. data/tracks/ruby/lib/generator/files/metadata_files.rb +1 -1
  62. data/tracks/ruby/lib/generator/files/track_files.rb +3 -3
  63. data/tracks/ruby/lib/generator/implementation.rb +7 -11
  64. data/tracks/ruby/lib/generator/template_values.rb +5 -9
  65. data/tracks/ruby/lib/generator/underscore.rb +4 -0
  66. data/tracks/ruby/lib/generator.rb +2 -2
  67. data/tracks/ruby/test/fixtures/xruby/lib/generator/test_template.erb +3 -3
  68. data/tracks/ruby/test/generator/exercise_test.rb +20 -0
  69. data/tracks/ruby/test/generator/files/generate_cases_test.rb +0 -4
  70. data/tracks/ruby/test/generator/files/metadata_files_test.rb +2 -2
  71. data/tracks/ruby/test/generator/files/track_files_test.rb +4 -5
  72. data/tracks/ruby/test/generator/implementation_test.rb +12 -20
  73. data/tracks/ruby/test/generator/template_values_test.rb +2 -33
  74. data/tracks/ruby/test/generator/underscore_test.rb +4 -0
  75. data/tracks/ruby/test/generator_test.rb +2 -2
  76. data/tracks/rust/exercises/gigasecond/Cargo.lock +58 -13
  77. data/tracks/rust/exercises/gigasecond/Cargo.toml +1 -1
  78. data/tracks/scala/exercises/acronym/src/test/scala/AcronymTest.scala +32 -12
  79. data/tracks/scala/exercises/hamming/example.scala +1 -1
  80. data/tracks/scala/exercises/hamming/src/test/scala/HammingTest.scala +55 -19
  81. data/tracks/scala/exercises/phone-number/example.scala +10 -20
  82. data/tracks/scala/exercises/phone-number/src/test/scala/PhoneNumberTest.scala +28 -81
  83. data/tracks/scala/testgen/src/main/scala/AcronymTestGenerator.scala +16 -0
  84. data/tracks/scala/testgen/src/main/scala/HammingTestGenerator.scala +34 -0
  85. data/tracks/scala/testgen/src/main/scala/PhoneNumberTestGenerator.scala +34 -0
  86. data/tracks/scheme/config.json +43 -16
  87. metadata +21 -5
  88. data/lib/trackler/problem.rb +0 -7
  89. data/lib/trackler/problems.rb +0 -7
@@ -20,152 +20,212 @@
20
20
  {
21
21
  "difficulty": 1,
22
22
  "slug": "leap",
23
- "topics": []
23
+ "topics": [
24
+
25
+ ]
24
26
  },
25
27
  {
26
28
  "difficulty": 1,
27
29
  "slug": "rna-transcription",
28
- "topics": []
30
+ "topics": [
31
+
32
+ ]
29
33
  },
30
34
  {
31
35
  "difficulty": 1,
32
36
  "slug": "bob",
33
- "topics": []
37
+ "topics": [
38
+
39
+ ]
34
40
  },
35
41
  {
36
42
  "difficulty": 1,
37
43
  "slug": "sum-of-multiples",
38
- "topics": []
44
+ "topics": [
45
+
46
+ ]
39
47
  },
40
48
  {
41
49
  "difficulty": 1,
42
50
  "slug": "strain",
43
- "topics": []
51
+ "topics": [
52
+
53
+ ]
44
54
  },
45
55
  {
46
56
  "difficulty": 1,
47
57
  "slug": "hamming",
48
- "topics": []
58
+ "topics": [
59
+
60
+ ]
49
61
  },
50
62
  {
51
63
  "difficulty": 1,
52
64
  "slug": "space-age",
53
- "topics": []
65
+ "topics": [
66
+
67
+ ]
54
68
  },
55
69
  {
56
70
  "difficulty": 1,
57
71
  "slug": "grains",
58
- "topics": []
72
+ "topics": [
73
+
74
+ ]
59
75
  },
60
76
  {
61
77
  "difficulty": 1,
62
78
  "slug": "anagram",
63
- "topics": []
79
+ "topics": [
80
+
81
+ ]
64
82
  },
65
83
  {
66
84
  "difficulty": 1,
67
85
  "slug": "nucleotide-count",
68
- "topics": []
86
+ "topics": [
87
+
88
+ ]
69
89
  },
70
90
  {
71
91
  "difficulty": 1,
72
92
  "slug": "atbash-cipher",
73
- "topics": []
93
+ "topics": [
94
+
95
+ ]
74
96
  },
75
97
  {
76
98
  "difficulty": 1,
77
99
  "slug": "phone-number",
78
- "topics": []
100
+ "topics": [
101
+
102
+ ]
79
103
  },
80
104
  {
81
105
  "difficulty": 1,
82
106
  "slug": "robot-simulator",
83
- "topics": []
107
+ "topics": [
108
+
109
+ ]
84
110
  },
85
111
  {
86
112
  "difficulty": 1,
87
113
  "slug": "grade-school",
88
- "topics": []
114
+ "topics": [
115
+
116
+ ]
89
117
  },
90
118
  {
91
119
  "difficulty": 1,
92
120
  "slug": "binary",
93
- "topics": []
121
+ "topics": [
122
+
123
+ ]
94
124
  },
95
125
  {
96
126
  "difficulty": 1,
97
127
  "slug": "word-count",
98
- "topics": []
128
+ "topics": [
129
+
130
+ ]
99
131
  },
100
132
  {
101
133
  "difficulty": 1,
102
134
  "slug": "circular-buffer",
103
- "topics": []
135
+ "topics": [
136
+
137
+ ]
104
138
  },
105
139
  {
106
140
  "difficulty": 1,
107
141
  "slug": "etl",
108
- "topics": []
142
+ "topics": [
143
+
144
+ ]
109
145
  },
110
146
  {
111
147
  "difficulty": 1,
112
148
  "slug": "clock",
113
- "topics": []
149
+ "topics": [
150
+
151
+ ]
114
152
  },
115
153
  {
116
154
  "difficulty": 1,
117
155
  "slug": "gigasecond",
118
- "topics": []
156
+ "topics": [
157
+
158
+ ]
119
159
  },
120
160
  {
121
161
  "difficulty": 1,
122
162
  "slug": "beer-song",
123
- "topics": []
163
+ "topics": [
164
+
165
+ ]
124
166
  },
125
167
  {
126
168
  "difficulty": 1,
127
169
  "slug": "difference-of-squares",
128
- "topics": []
170
+ "topics": [
171
+
172
+ ]
129
173
  },
130
174
  {
131
175
  "difficulty": 1,
132
176
  "slug": "allergies",
133
- "topics": []
177
+ "topics": [
178
+
179
+ ]
134
180
  },
135
181
  {
136
182
  "difficulty": 1,
137
183
  "slug": "bank-account",
138
- "topics": []
184
+ "topics": [
185
+
186
+ ]
139
187
  },
140
188
  {
141
189
  "difficulty": 1,
142
190
  "slug": "luhn",
143
- "topics": []
191
+ "topics": [
192
+
193
+ ]
144
194
  },
145
195
  {
146
196
  "difficulty": 1,
147
197
  "slug": "series",
148
- "topics": []
198
+ "topics": [
199
+
200
+ ]
149
201
  },
150
202
  {
151
203
  "difficulty": 1,
152
204
  "slug": "trinary",
153
- "topics": []
205
+ "topics": [
206
+
207
+ ]
154
208
  },
155
209
  {
156
210
  "difficulty": 1,
157
211
  "slug": "largest-series-product",
158
- "topics": []
212
+ "topics": [
213
+
214
+ ]
159
215
  },
160
216
  {
161
217
  "difficulty": 1,
162
218
  "slug": "meetup",
163
- "topics": []
219
+ "topics": [
220
+
221
+ ]
164
222
  },
165
223
  {
166
224
  "difficulty": 1,
167
225
  "slug": "parallel-letter-frequency",
168
- "topics": []
226
+ "topics": [
227
+
228
+ ]
169
229
  }
170
230
  ]
171
231
  }
@@ -2,7 +2,7 @@
2
2
  OPAM_DEPENDS="ocamlfind core ounit react"
3
3
 
4
4
  case "$OCAML_VERSION,$OPAM_VERSION" in
5
- 4.04.0,1.2.2) ppa=avsm/ocaml42+opam12 ;;
5
+ 4.04.1,1.2.2) ppa=avsm/ocaml42+opam12 ;;
6
6
  *) echo Unknown $OCAML_VERSION,$OPAM_VERSION; exit 1 ;;
7
7
  esac
8
8
 
@@ -6,4 +6,4 @@ script:
6
6
  - bin/configlet .
7
7
 
8
8
  env:
9
- - OCAML_VERSION=4.04.0 OPAM_VERSION=1.2.2
9
+ - OCAML_VERSION=4.04.1 OPAM_VERSION=1.2.2
@@ -11,7 +11,7 @@ notes contain a few details specific to Ocaml.
11
11
 
12
12
  ## Prerequisites
13
13
 
14
- The OCaml track assumes installation of OCaml version 4.04.0, and installation of Core, OUnit, and React (for the Hangman exercise).
14
+ The OCaml track assumes installation of OCaml version 4.04.1, and installation of Core, OUnit, and React (for the Hangman exercise).
15
15
  Assuming you have opam, these can be installed with
16
16
  ```bash
17
17
  opam install core ounit react
@@ -1,15 +1,16 @@
1
1
  sudo: false
2
2
  language: perl
3
3
  perl:
4
+ - '5.26'
5
+ - '5.24'
4
6
  - '5.22'
5
7
  - '5.20'
6
8
  - '5.18'
7
9
  - '5.16'
8
10
  - '5.14'
9
11
  - '5.12'
10
- - '5.10'
11
12
  before_script:
12
13
  - bin/fetch-configlet
13
14
  script:
14
15
  - bin/configlet .
15
- - EXERCISM=1 prove -vr exercises/
16
+ - prove -r exercises/
@@ -23,9 +23,12 @@ if @*ARGS {
23
23
  }
24
24
 
25
25
  for @exercises -> $exercise {
26
- say "Generating $exercise...";
27
26
  my $exercise-dir = $base-dir.child("exercises/$exercise");
28
- next if (my $yaml = $exercise-dir.child('example.yaml')) !~~ :f;
27
+ if (my $yaml = $exercise-dir.child('example.yaml')) !~~ :f {
28
+ say "No example.yaml found for $exercise.";
29
+ next;
30
+ };
31
+ print "Generating $exercise... ";
29
32
 
30
33
  my %data = load-yaml $yaml.slurp;
31
34
  $_=.chomp when Str for @(%data.values);
@@ -41,7 +44,7 @@ for @exercises -> $exercise {
41
44
  %data<module_file> = %data<stub>;
42
45
  create-file "{%data<exercise>}.pm6", 'module';
43
46
 
44
- say "$exercise generated.";
47
+ say 'Generated.';
45
48
 
46
49
  sub create-file ($filename, $template) {
47
50
  spurt (my $file = $exercise-dir.child($filename)),
@@ -15,107 +15,149 @@
15
15
  {
16
16
  "difficulty": 1,
17
17
  "slug": "grains",
18
- "topics": []
18
+ "topics": [
19
+
20
+ ]
19
21
  },
20
22
  {
21
23
  "difficulty": 1,
22
24
  "slug": "leap",
23
- "topics": []
25
+ "topics": [
26
+
27
+ ]
24
28
  },
25
29
  {
26
30
  "difficulty": 1,
27
31
  "slug": "difference-of-squares",
28
- "topics": []
32
+ "topics": [
33
+
34
+ ]
29
35
  },
30
36
  {
31
37
  "difficulty": 1,
32
38
  "slug": "perfect-numbers",
33
- "topics": []
39
+ "topics": [
40
+
41
+ ]
34
42
  },
35
43
  {
36
44
  "difficulty": 1,
37
45
  "slug": "gigasecond",
38
- "topics": []
46
+ "topics": [
47
+
48
+ ]
39
49
  },
40
50
  {
41
51
  "difficulty": 1,
42
52
  "slug": "bob",
43
- "topics": []
53
+ "topics": [
54
+
55
+ ]
44
56
  },
45
57
  {
46
58
  "difficulty": 1,
47
59
  "slug": "hamming",
48
- "topics": []
60
+ "topics": [
61
+
62
+ ]
49
63
  },
50
64
  {
51
65
  "difficulty": 1,
52
66
  "slug": "scrabble-score",
53
- "topics": []
67
+ "topics": [
68
+
69
+ ]
54
70
  },
55
71
  {
56
72
  "difficulty": 1,
57
73
  "slug": "roman-numerals",
58
- "topics": []
74
+ "topics": [
75
+
76
+ ]
59
77
  },
60
78
  {
61
79
  "difficulty": 1,
62
80
  "slug": "anagram",
63
- "topics": []
81
+ "topics": [
82
+
83
+ ]
64
84
  },
65
85
  {
66
86
  "difficulty": 1,
67
87
  "slug": "rna-transcription",
68
- "topics": []
88
+ "topics": [
89
+
90
+ ]
69
91
  },
70
92
  {
71
93
  "difficulty": 1,
72
94
  "slug": "etl",
73
- "topics": []
95
+ "topics": [
96
+
97
+ ]
74
98
  },
75
99
  {
76
100
  "difficulty": 1,
77
101
  "slug": "word-count",
78
- "topics": []
102
+ "topics": [
103
+
104
+ ]
79
105
  },
80
106
  {
81
107
  "difficulty": 1,
82
108
  "slug": "phone-number",
83
- "topics": []
109
+ "topics": [
110
+
111
+ ]
84
112
  },
85
113
  {
86
114
  "difficulty": 1,
87
115
  "slug": "nucleotide-count",
88
- "topics": []
116
+ "topics": [
117
+
118
+ ]
89
119
  },
90
120
  {
91
121
  "difficulty": 1,
92
122
  "slug": "raindrops",
93
- "topics": []
123
+ "topics": [
124
+
125
+ ]
94
126
  },
95
127
  {
96
128
  "difficulty": 1,
97
129
  "slug": "grep",
98
- "topics": []
130
+ "topics": [
131
+
132
+ ]
99
133
  },
100
134
  {
101
135
  "difficulty": 1,
102
136
  "slug": "say",
103
- "topics": []
137
+ "topics": [
138
+
139
+ ]
104
140
  },
105
141
  {
106
142
  "difficulty": 1,
107
143
  "slug": "allergies",
108
- "topics": []
144
+ "topics": [
145
+
146
+ ]
109
147
  },
110
148
  {
111
149
  "difficulty": 1,
112
150
  "slug": "list-ops",
113
- "topics": []
151
+ "topics": [
152
+
153
+ ]
114
154
  },
115
155
  {
116
156
  "difficulty": 1,
117
157
  "slug": "acronym",
118
- "topics": []
158
+ "topics": [
159
+
160
+ ]
119
161
  }
120
162
  ],
121
163
  "deprecated": [
@@ -4,7 +4,6 @@ require_relative 'bob'
4
4
 
5
5
  # Common test data version: 1.0.0 65756b1
6
6
  class BobTest < Minitest::Test
7
-
8
7
  def test_stating_something
9
8
  # skip
10
9
  remark = "Tom-ay-to, tom-aaaah-to."
@@ -16,7 +16,7 @@ module Generator
16
16
  attr_reader :paths
17
17
 
18
18
  def generators
19
- implementations.map { |slug| generator(implementation(slug)) }
19
+ implementations.map { |slug| generator(implementation(exercise(slug))) }
20
20
  end
21
21
 
22
22
  def implementations
@@ -35,9 +35,13 @@ module Generator
35
35
  @options[:freeze] || @options[:all]
36
36
  end
37
37
 
38
- def implementation(slug)
38
+ def exercise(slug)
39
+ Exercise.new(slug: slug)
40
+ end
41
+
42
+ def implementation(exercise)
39
43
  LoggingImplementation.new(
40
- implementation: Implementation.new(paths: paths, slug: slug),
44
+ implementation: Implementation.new(paths: paths, exercise: exercise),
41
45
  logger: logger
42
46
  )
43
47
  end
@@ -0,0 +1,19 @@
1
+ module Generator
2
+ class Exercise
3
+ using Generator::Underscore
4
+
5
+ attr_reader :slug
6
+
7
+ def initialize(slug:)
8
+ @slug = slug
9
+ end
10
+
11
+ def name
12
+ @name ||= slug.underscore
13
+ end
14
+
15
+ def case_class
16
+ slug.camel_case + 'Case'
17
+ end
18
+ end
19
+ end
@@ -6,10 +6,6 @@ module Generator
6
6
  cases_filepaths(track_path).map { |filepath| slugify(filepath) }.sort
7
7
  end
8
8
 
9
- def class_name(exercise_name_or_slug)
10
- filename(exercise_name_or_slug).split('_').map(&:capitalize).join
11
- end
12
-
13
9
  def source_filepath(track_path, slug)
14
10
  path = meta_generator_path(track_path, slug)
15
11
  filename = filename(slug) + '.rb'
@@ -10,7 +10,7 @@ module Generator
10
10
  private
11
11
 
12
12
  def exercise_metadata_path
13
- File.join(paths.metadata, 'exercises', slug)
13
+ File.join(paths.metadata, 'exercises', exercise.slug)
14
14
  end
15
15
  end
16
16
 
@@ -22,7 +22,7 @@ module Generator
22
22
  private
23
23
 
24
24
  def exercise_path
25
- File.join(paths.track, 'exercises', slug)
25
+ File.join(paths.track, 'exercises', exercise.slug)
26
26
  end
27
27
 
28
28
  def meta_path
@@ -34,7 +34,7 @@ module Generator
34
34
  end
35
35
 
36
36
  def minitest_tests_filename
37
- "#{exercise_name}_test.rb"
37
+ "#{exercise.name}_test.rb"
38
38
  end
39
39
 
40
40
  def version_filename
@@ -42,7 +42,7 @@ module Generator
42
42
  end
43
43
 
44
44
  def example_filename
45
- "#{exercise_name}.rb"
45
+ "#{exercise.name}.rb"
46
46
  end
47
47
 
48
48
  def tests_template_absolute_filename
@@ -6,12 +6,12 @@ module Generator
6
6
  include Files::MetadataFiles
7
7
  include TemplateValuesFactory
8
8
 
9
- def initialize(paths:, slug:)
9
+ def initialize(paths:, exercise:)
10
10
  @paths = paths
11
- @slug = slug
11
+ @exercise = exercise
12
12
  end
13
13
 
14
- attr_reader :paths, :slug
14
+ attr_reader :paths, :exercise
15
15
 
16
16
  def version
17
17
  tests_version.to_i
@@ -25,16 +25,12 @@ module Generator
25
25
  example_solution.update_version(version)
26
26
  end
27
27
 
28
- def create_tests_file
28
+ def build_tests
29
29
  minitest_tests.generate(
30
30
  template: tests_template.to_s,
31
31
  values: template_values
32
32
  )
33
33
  end
34
-
35
- def exercise_name
36
- @exercise_name ||= slug.tr('-', '_')
37
- end
38
34
  end
39
35
 
40
36
  # This exists to give us a clue as to what we are delegating to.
@@ -58,9 +54,9 @@ module Generator
58
54
  @logger.debug "Updated version in example solution to #{version}"
59
55
  end
60
56
 
61
- def create_tests_file
62
- @implementation.create_tests_file
63
- @logger.info "Generated #{slug} tests version #{version}"
57
+ def build_tests
58
+ @implementation.build_tests
59
+ @logger.info "Generated #{exercise.slug} tests version #{version}"
64
60
  end
65
61
  end
66
62
  end
@@ -28,30 +28,26 @@ module Generator
28
28
  abbreviated_commit_hash: canonical_data.abbreviated_commit_hash,
29
29
  canonical_data_version: canonical_data.version,
30
30
  version: version,
31
- exercise_name: slug_underscore,
31
+ exercise_name: exercise.name,
32
32
  test_cases: extract
33
33
  )
34
34
  end
35
35
 
36
36
  private
37
37
 
38
- def slug_underscore
39
- slug ? slug.tr('-_', '_') : ''
40
- end
41
-
42
38
  def extract
43
39
  load cases_load_name
44
40
  extractor.cases(canonical_data.to_s)
45
41
  end
46
42
 
47
43
  def extractor
48
- CaseValues::Extractor.new(
49
- case_class: Object.const_get(Files::GeneratorCases.class_name(slug))
50
- )
44
+ CaseValues::Extractor.new(
45
+ case_class: Object.const_get(exercise.case_class)
46
+ )
51
47
  end
52
48
 
53
49
  def cases_load_name
54
- Files::GeneratorCases.source_filepath(paths.track, slug)
50
+ Files::GeneratorCases.source_filepath(paths.track, exercise.slug)
55
51
  end
56
52
  end
57
53
  end
@@ -4,6 +4,10 @@ module Generator
4
4
  def underscore
5
5
  downcase.gsub(/[- ]/, '_').gsub(/[^\w?]/, '')
6
6
  end
7
+
8
+ def camel_case
9
+ underscore.split('_').map(&:capitalize).join
10
+ end
7
11
  end
8
12
 
9
13
  refine Fixnum do