trackler 2.1.0.21 → 2.1.0.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/delphi/exercises/allergies/uAllergiesExample.pas +10 -3
  4. data/tracks/ocaml/.travis-ci.sh +3 -1
  5. data/tracks/ocaml/exercises/acronym/Makefile +1 -1
  6. data/tracks/ocaml/exercises/acronym/example.ml +1 -1
  7. data/tracks/ocaml/exercises/acronym/test.ml +2 -4
  8. data/tracks/ocaml/exercises/all-your-base/example.ml +1 -1
  9. data/tracks/ocaml/exercises/all-your-base/test.ml +1 -1
  10. data/tracks/ocaml/exercises/anagram/example.ml +1 -1
  11. data/tracks/ocaml/exercises/anagram/test.ml +1 -1
  12. data/tracks/ocaml/exercises/atbash-cipher/example.ml +1 -1
  13. data/tracks/ocaml/exercises/atbash-cipher/test.ml +1 -1
  14. data/tracks/ocaml/exercises/beer-song/example.ml +1 -1
  15. data/tracks/ocaml/exercises/beer-song/test.ml +1 -1
  16. data/tracks/ocaml/exercises/binary-search/Makefile +1 -1
  17. data/tracks/ocaml/exercises/binary-search/example.ml +5 -5
  18. data/tracks/ocaml/exercises/binary-search/test.ml +1 -1
  19. data/tracks/ocaml/exercises/bob/example.ml +1 -1
  20. data/tracks/ocaml/exercises/bob/test.ml +1 -1
  21. data/tracks/ocaml/exercises/bowling/bowling.mli +1 -1
  22. data/tracks/ocaml/exercises/bowling/example.ml +1 -1
  23. data/tracks/ocaml/exercises/bowling/test.ml +1 -1
  24. data/tracks/ocaml/exercises/bracket-push/example.ml +1 -1
  25. data/tracks/ocaml/exercises/bracket-push/test.ml +1 -1
  26. data/tracks/ocaml/exercises/change/example.ml +1 -1
  27. data/tracks/ocaml/exercises/change/test.ml +1 -1
  28. data/tracks/ocaml/exercises/connect/example.ml +1 -1
  29. data/tracks/ocaml/exercises/connect/test.ml +1 -1
  30. data/tracks/ocaml/exercises/difference-of-squares/example.ml +1 -1
  31. data/tracks/ocaml/exercises/difference-of-squares/test.ml +1 -1
  32. data/tracks/ocaml/exercises/dominoes/example.ml +1 -1
  33. data/tracks/ocaml/exercises/dominoes/test.ml +1 -1
  34. data/tracks/ocaml/exercises/etl/example.ml +1 -1
  35. data/tracks/ocaml/exercises/etl/test.ml +1 -1
  36. data/tracks/ocaml/exercises/grade-school/example.ml +1 -1
  37. data/tracks/ocaml/exercises/grade-school/grade_school.mli +1 -1
  38. data/tracks/ocaml/exercises/grade-school/test.ml +1 -1
  39. data/tracks/ocaml/exercises/hamming/example.ml +1 -1
  40. data/tracks/ocaml/exercises/hamming/test.ml +1 -1
  41. data/tracks/ocaml/exercises/hangman/example.ml +1 -1
  42. data/tracks/ocaml/exercises/hello-world/test.ml +1 -1
  43. data/tracks/ocaml/exercises/hexadecimal/example.ml +1 -1
  44. data/tracks/ocaml/exercises/hexadecimal/test.ml +1 -1
  45. data/tracks/ocaml/exercises/leap/test.ml +1 -1
  46. data/tracks/ocaml/exercises/list-ops/test.ml +1 -1
  47. data/tracks/ocaml/exercises/luhn/example.ml +1 -1
  48. data/tracks/ocaml/exercises/luhn/test.ml +1 -1
  49. data/tracks/ocaml/exercises/meetup/example.ml +1 -1
  50. data/tracks/ocaml/exercises/meetup/test.ml +1 -1
  51. data/tracks/ocaml/exercises/minesweeper/example.ml +1 -1
  52. data/tracks/ocaml/exercises/minesweeper/test.ml +1 -1
  53. data/tracks/ocaml/exercises/nucleotide-count/example.ml +1 -1
  54. data/tracks/ocaml/exercises/nucleotide-count/nucleotide_count.mli +1 -1
  55. data/tracks/ocaml/exercises/nucleotide-count/test.ml +1 -1
  56. data/tracks/ocaml/exercises/pangram/example.ml +1 -1
  57. data/tracks/ocaml/exercises/pangram/test.ml +1 -1
  58. data/tracks/ocaml/exercises/phone-number/example.ml +1 -1
  59. data/tracks/ocaml/exercises/phone-number/test.ml +1 -1
  60. data/tracks/ocaml/exercises/prime-factors/example.ml +1 -1
  61. data/tracks/ocaml/exercises/prime-factors/test.ml +1 -1
  62. data/tracks/ocaml/exercises/raindrops/example.ml +1 -1
  63. data/tracks/ocaml/exercises/raindrops/test.ml +1 -1
  64. data/tracks/ocaml/exercises/rna-transcription/example.ml +1 -1
  65. data/tracks/ocaml/exercises/rna-transcription/test.ml +1 -1
  66. data/tracks/ocaml/exercises/robot-name/example.ml +1 -1
  67. data/tracks/ocaml/exercises/robot-name/test.ml +1 -1
  68. data/tracks/ocaml/exercises/roman-numerals/test.ml +1 -1
  69. data/tracks/ocaml/exercises/run-length-encoding/example.ml +1 -1
  70. data/tracks/ocaml/exercises/run-length-encoding/test.ml +1 -1
  71. data/tracks/ocaml/exercises/say/example.ml +1 -1
  72. data/tracks/ocaml/exercises/say/test.ml +1 -1
  73. data/tracks/ocaml/exercises/space-age/example.ml +1 -1
  74. data/tracks/ocaml/exercises/space-age/test.ml +1 -1
  75. data/tracks/ocaml/exercises/triangle/example.ml +1 -1
  76. data/tracks/ocaml/exercises/triangle/test.ml +1 -1
  77. data/tracks/ocaml/exercises/word-count/example.ml +1 -1
  78. data/tracks/ocaml/exercises/word-count/test.ml +1 -1
  79. data/tracks/ocaml/exercises/word-count/word_count.mli +1 -3
  80. data/tracks/ocaml/exercises/zipper/example.ml +1 -1
  81. data/tracks/ocaml/exercises/zipper/test.ml +1 -1
  82. data/tracks/ocaml/exercises/zipper/tree.ml +1 -1
  83. data/tracks/ocaml/exercises/zipper/tree.mli +1 -1
  84. data/tracks/ocaml/exercises/zipper/zipper.mli +1 -1
  85. data/tracks/ocaml/tools/test-generator/src/canonical_data_checker.ml +1 -1
  86. data/tracks/ocaml/tools/test-generator/src/codegen.ml +1 -1
  87. data/tracks/ocaml/tools/test-generator/src/controller.ml +1 -1
  88. data/tracks/ocaml/tools/test-generator/src/debug.ml +1 -1
  89. data/tracks/ocaml/tools/test-generator/src/files.ml +1 -1
  90. data/tracks/ocaml/tools/test-generator/src/model.ml +1 -1
  91. data/tracks/ocaml/tools/test-generator/src/parser.ml +5 -5
  92. data/tracks/ocaml/tools/test-generator/src/special_cases.ml +1 -1
  93. data/tracks/ocaml/tools/test-generator/src/template.ml +1 -1
  94. data/tracks/ocaml/tools/test-generator/src/test_gen.ml +1 -1
  95. data/tracks/ocaml/tools/test-generator/src/utils.ml +2 -2
  96. data/tracks/ocaml/tools/test-generator/templates/acronym/template.ml +1 -1
  97. data/tracks/ocaml/tools/test-generator/templates/all-your-base/template.ml +1 -1
  98. data/tracks/ocaml/tools/test-generator/templates/anagram/template.ml +1 -1
  99. data/tracks/ocaml/tools/test-generator/templates/atbash-cipher/template.ml +1 -1
  100. data/tracks/ocaml/tools/test-generator/templates/beer-song/template.ml +1 -1
  101. data/tracks/ocaml/tools/test-generator/templates/binary-search/template.ml +1 -1
  102. data/tracks/ocaml/tools/test-generator/templates/bob/template.ml +1 -1
  103. data/tracks/ocaml/tools/test-generator/templates/bowling/template.ml +1 -1
  104. data/tracks/ocaml/tools/test-generator/templates/bracket-push/template.ml +1 -1
  105. data/tracks/ocaml/tools/test-generator/templates/change/template.ml +1 -1
  106. data/tracks/ocaml/tools/test-generator/templates/connect/template.ml +1 -1
  107. data/tracks/ocaml/tools/test-generator/templates/difference-of-squares/template.ml +1 -1
  108. data/tracks/ocaml/tools/test-generator/templates/dominoes/template.ml +1 -1
  109. data/tracks/ocaml/tools/test-generator/templates/etl/template.ml +1 -1
  110. data/tracks/ocaml/tools/test-generator/templates/hamming/template.ml +1 -1
  111. data/tracks/ocaml/tools/test-generator/templates/hello-world/template.ml +1 -1
  112. data/tracks/ocaml/tools/test-generator/templates/leap/template.ml +1 -1
  113. data/tracks/ocaml/tools/test-generator/templates/luhn/template.ml +1 -1
  114. data/tracks/ocaml/tools/test-generator/templates/minesweeper/template.ml +1 -1
  115. data/tracks/ocaml/tools/test-generator/templates/pangram/template.ml +1 -1
  116. data/tracks/ocaml/tools/test-generator/templates/phone-number/template.ml +1 -1
  117. data/tracks/ocaml/tools/test-generator/templates/prime-factors/template.ml +1 -1
  118. data/tracks/ocaml/tools/test-generator/templates/raindrops/template.ml +1 -1
  119. data/tracks/ocaml/tools/test-generator/templates/roman-numerals/template.ml +1 -1
  120. data/tracks/ocaml/tools/test-generator/templates/run-length-encoding/template.ml +1 -1
  121. data/tracks/ocaml/tools/test-generator/templates/say/template.ml +1 -1
  122. data/tracks/ocaml/tools/test-generator/templates/space-age/template.ml +1 -1
  123. data/tracks/ocaml/tools/test-generator/templates/triangle/template.ml +1 -1
  124. data/tracks/ocaml/tools/test-generator/templates/word-count/template.ml +1 -1
  125. data/tracks/ocaml/tools/test-generator/test/all_tests.ml +1 -1
  126. data/tracks/ocaml/tools/test-generator/test/codegen_test.ml +1 -1
  127. data/tracks/ocaml/tools/test-generator/test/model_test.ml +1 -1
  128. data/tracks/ocaml/tools/test-generator/test/parser_test.ml +1 -1
  129. data/tracks/ocaml/tools/test-generator/test/special_cases_test.ml +1 -1
  130. data/tracks/ocaml/tools/test-generator/test/template_test.ml +1 -1
  131. data/tracks/ocaml/tools/test-generator/test/utils_test.ml +1 -1
  132. data/tracks/r/.travis.yml +13 -2
  133. data/tracks/r/README.md +35 -16
  134. data/tracks/r/bin/run_lints.R +30 -0
  135. data/tracks/r/bin/run_tests.R +35 -0
  136. data/tracks/r/exercises/anagram/anagram.R +1 -1
  137. data/tracks/r/exercises/anagram/example.R +5 -5
  138. data/tracks/r/exercises/anagram/test_anagram.R +1 -15
  139. data/tracks/r/exercises/bob/bob.R +1 -1
  140. data/tracks/r/exercises/bob/example.R +2 -2
  141. data/tracks/r/exercises/bob/test_bob.R +1 -13
  142. data/tracks/r/exercises/difference-of-squares/example.R +5 -5
  143. data/tracks/r/exercises/difference-of-squares/test_difference-of-squares.R +2 -0
  144. data/tracks/r/exercises/grains/example.R +6 -6
  145. data/tracks/r/exercises/grains/grains.R +2 -2
  146. data/tracks/r/exercises/grains/test_grains.R +1 -2
  147. data/tracks/r/exercises/hamming/example.R +3 -3
  148. data/tracks/r/exercises/hamming/hamming.R +1 -1
  149. data/tracks/r/exercises/hamming/test_hamming.R +1 -1
  150. data/tracks/r/exercises/hello-world/example.R +1 -1
  151. data/tracks/r/exercises/hello-world/test_hello-world.R +1 -1
  152. data/tracks/r/exercises/isogram/example.R +4 -4
  153. data/tracks/r/exercises/isogram/isogram.R +1 -1
  154. data/tracks/r/exercises/isogram/test_isogram.R +1 -1
  155. data/tracks/r/exercises/largest-series-product/example.R +11 -11
  156. data/tracks/r/exercises/largest-series-product/largest-series-product.R +2 -2
  157. data/tracks/r/exercises/largest-series-product/test_largest-series-product.R +16 -16
  158. data/tracks/r/exercises/leap/leap.R +1 -1
  159. data/tracks/r/exercises/leap/test_leap.R +1 -1
  160. data/tracks/r/exercises/luhn/example.R +16 -10
  161. data/tracks/r/exercises/luhn/test_luhn.R +1 -1
  162. data/tracks/r/exercises/pascals-triangle/example.R +10 -10
  163. data/tracks/r/exercises/pascals-triangle/pascals-triangle.R +2 -2
  164. data/tracks/r/exercises/pascals-triangle/test_pascals-triangle.R +8 -8
  165. data/tracks/r/exercises/perfect-numbers/example.R +3 -3
  166. data/tracks/r/exercises/perfect-numbers/perfect-numbers.R +1 -1
  167. data/tracks/r/exercises/perfect-numbers/test_perfect-numbers.R +12 -12
  168. data/tracks/r/exercises/phone-number/example.R +8 -8
  169. data/tracks/r/exercises/phone-number/phone-number.R +1 -1
  170. data/tracks/r/exercises/phone-number/test_phone-number.R +11 -11
  171. data/tracks/r/exercises/prime-factors/example.R +2 -2
  172. data/tracks/r/exercises/prime-factors/prime-factors.R +1 -1
  173. data/tracks/r/exercises/prime-factors/test_prime-factors.R +1 -1
  174. data/tracks/r/exercises/raindrops/example.R +12 -11
  175. data/tracks/r/exercises/raindrops/test_raindrops.R +3 -2
  176. data/tracks/r/exercises/rna-transcription/example.R +3 -3
  177. data/tracks/r/exercises/rna-transcription/test_rna-transcription.R +1 -1
  178. data/tracks/r/exercises/rotational-cipher/example.R +7 -7
  179. data/tracks/r/exercises/rotational-cipher/test_rotational-cipher.R +3 -2
  180. data/tracks/r/exercises/scrabble-score/example.R +5 -4
  181. data/tracks/r/exercises/scrabble-score/scrabble-score.R +1 -1
  182. data/tracks/r/exercises/scrabble-score/test_scrabble-score.R +12 -12
  183. data/tracks/r/exercises/secret-handshake/example.R +6 -6
  184. data/tracks/r/exercises/secret-handshake/test_secret-handshake.R +5 -3
  185. data/tracks/r/exercises/sieve/test_sieve.R +1 -1
  186. data/tracks/r/exercises/space-age/example.R +8 -3
  187. data/tracks/r/exercises/space-age/space-age.R +1 -1
  188. data/tracks/r/exercises/space-age/test_space-age.R +1 -1
  189. data/tracks/r/exercises/sum-of-multiples/test_sum-of-multiples.R +1 -1
  190. data/tracks/r/exercises/tournament/example.R +14 -8
  191. data/tracks/r/exercises/tournament/test_tournament.R +1 -1
  192. data/tracks/r/exercises/word-count/example.R +9 -2
  193. data/tracks/r/exercises/word-count/test_word-count.R +1 -1
  194. data/tracks/r/exercises/word-count/word-count.R +1 -1
  195. data/tracks/vimscript/README.md +14 -9
  196. metadata +4 -2
@@ -1,6 +1,6 @@
1
- open Core.Std
2
1
  open OUnit2
3
2
  open Binary_search
3
+ open Core
4
4
 
5
5
  let option_to_string f = function
6
6
  | None -> "None"
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Bob
4
4
 
@@ -1,4 +1,4 @@
1
- open! Core.Std
1
+ open! Core
2
2
  open OUnit2
3
3
  open Bowling
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Bracket_push
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Change
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Connect
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Difference_of_squares
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Dominoes
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Etl
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
 
4
4
  let printer n =
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Hello_world
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Leap
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Luhn
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Minesweeper
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Pangram
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Phone_number
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Prime_factors
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Raindrops
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Roman_numerals
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Run_length_encoding
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Say
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Space_age
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Triangle
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Word_count
4
4
 
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Codegen_test
4
4
  open Model_test
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Codegen
4
4
  open Model
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Codegen
4
4
  open Model
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Parser
4
4
  open Model
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Model
4
4
  open Codegen
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Codegen
4
4
  open Template
@@ -1,4 +1,4 @@
1
- open Core.Std
1
+ open Core
2
2
  open OUnit2
3
3
  open Codegen
4
4
  open Utils
data/tracks/r/.travis.yml CHANGED
@@ -1,6 +1,17 @@
1
1
  ---
2
- language: bash
2
+ language: R
3
+ cache: packages
4
+ r:
5
+ - oldrel
6
+ - release
7
+ - devel
8
+ install:
9
+ - R -e "install.packages('testthat')"
10
+ - R -e "install.packages('jsonlite')"
11
+ - R -e "install.packages('lintr')"
12
+ - R -e "install.packages('magrittr')"
3
13
  script:
4
14
  - bin/fetch-configlet
5
15
  - bin/configlet .
6
- sudo: false
16
+ - R -e "source('bin/run_tests.R')"
17
+ - R -e "source('bin/run_lints.R')"
data/tracks/r/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # xR
2
2
 
3
+ [![Build Status](https://travis-ci.org/exercism/xr.svg?branch=master)](https://travis-ci.org/exercism/xr)
4
+ [![Gitter](https://badges.gitter.im/exercism/dev.svg)](https://gitter.im/exercism/dev?utm_source=share-link&utm_medium=link&utm_campaign=share-link)
5
+
3
6
  Exercism problems in R
4
7
 
5
8
  ## Contributing Guide
@@ -52,8 +55,19 @@ A general description of all the files and directories can be found [here](https
52
55
 
53
56
  #### Directory structure
54
57
  ```bash
58
+ ├── .gitignore
59
+ ├── .travis.yml
60
+ ├── .github
61
+ │ └── stale.yml
62
+ ├── config.json
63
+ ├── README.md
64
+ └── LICENSE
65
+ ├── img
66
+ │ └── icon.png
55
67
  ├── bin
56
- └── fetch‐configlet
68
+ ├── fetch‐configlet
69
+ │ ├── run_lints.R
70
+ │ └── run_tests.R
57
71
  ├── docs
58
72
  │ ├── ABOUT.md
59
73
  │ ├── INSTALLATION.md
@@ -62,31 +76,24 @@ A general description of all the files and directories can be found [here](https
62
76
  │ └── TESTS.md
63
77
  └── exercises
64
78
  ├── TRACK_HINTS.md
65
- └── <exercise-name>
79
+ ├── <exercise-name>
66
80
  │ ├── <exercise-name>.R
67
- └── example.R
81
+ ├── example.R
68
82
  │ └── test_<exercise-name>.R
69
- └── <exercise-name>
83
+ ├── <exercise-name>
70
84
  │ ├── <exercise-name>.R
71
- └── example.R
85
+ ├── example.R
72
86
  │ └── test_<exercise-name>.R
73
87
  └── ...
74
- └── img
75
- └── icon.png
76
- ├── .gitignore
77
- ├── .travis.yml
78
- ├── LICENSE
79
- ├── README.md
80
- └── config.json
81
88
  ```
82
89
  - `config.json`: Note that every exercise has to be registered here, with a unique name and a difficulty. The sequence order in this file determines the default order in which the exercises are fetched.
83
90
 
84
91
  #### Exercise structure
85
92
  Each exercise has the following structure:
86
- - `HINTS.md` is an optional file containing instructions and/or hints. It is used together with the respective `description.md` for the exercise from [x-common](https://github.com/exercism/x-common) to build the `README.md` file.
87
93
  - `<exercise-name>.R` usually contains an empty function declaration, as a starting point for the required solution.
88
94
  - `example.R` is the source code of the sample solution.
89
95
  - `test_<exercise-name>.R` is the [test suite](#test-suite).
96
+ - `HINTS.md` is an optional file containing instructions and/or hints. It is used together with the respective `description.md` for the exercise from [x-common](https://github.com/exercism/x-common) to build the `README.md` file.
90
97
 
91
98
  ### Writing an issue
92
99
  To report a bug you should [create an issue](https://help.github.com/articles/creating-an-issue/) [here](https://github.com/exercism/xr/issues).
@@ -104,17 +111,29 @@ The example solution doesn't have to be perfect, but should pass all of the test
104
111
  The test suite should be derived from the respective `x-common/exercises/<exercise-name>/canonical-data.json` and comply to some formatting and coding standards (to get an idea you can look at some of the existing tests).
105
112
 
106
113
  ### Running tests
107
- To run the tests for an exercise, simply run `source('test_<exercise-name>.R')` from within the exercise's directory. Note that when testing locally you'll need to (temporarily) replace the first line of `test_<exercise-name>.R` (which sources `<exercise-name>.R`) with `source('example.R')`.
114
+ To run the tests for just a single exercise, run `source('test_<exercise-name>.R')` from within the exercise's directory. Note that when testing locally you'll need to replace the first line of `test_<exercise-name>.R` (which sources `<exercise-name>.R`) with `source('example.R')`. If you do this, remember to change it back before submitting any pull requests.
115
+
116
+ Alternatively, to run tests for all exercises at once, simply run `source("bin/run_tests.R")`.
108
117
 
109
118
  The example solutions must pass the tests without failures. Additionally the tests should not run longer than a few seconds.
110
119
 
111
- In order to be accepted by Travis-CI, every exercise must be registered in `config.json`.
120
+ In order to be accepted by Travis-CI, each exercise must be registered in `config.json`.
112
121
 
113
122
  ### Style guide
114
- Given that there are a variety of R style guides in circulation, at this stage we don't enforce a particular style guide, but our preference is to have R code in this repository follow Hadley Wickham's [R style guide](http://adv-r.had.co.nz/Style.html).
123
+ There are a variety of R style guides in circulation and opinions on the topic can vary widely which does make it hard to settle on specific standards. Our preference is to have R code in this repository follow Hadley Wickham's [R style guide](http://adv-r.had.co.nz/Style.html).
115
124
 
116
125
  You are thus encouraged to run [`lintr`](https://github.com/jimhester/lintr) on your R scripts before opening a [pull request](#writing-a-pull-request) in order to check that your code adheres to this style guide before submitting it for review.
117
126
 
127
+ Note however that at the moment only the following linting rules are strictly enforced:
128
+
129
+ - line length should be less than 80 characters
130
+ - objects should not be in camelCase, snake_case is preferred
131
+ - the assignment operator <- should be used
132
+ - all commas should be followed by a space (but not preceded by one)
133
+ - no absolute paths should be used
134
+
135
+ To perform these specific checks locally, run `source("bin/run_lints.R")`.
136
+
118
137
  ## License
119
138
 
120
139
  The MIT License (MIT)
@@ -0,0 +1,30 @@
1
+ library(lintr)
2
+
3
+ linters <- list(
4
+ a = line_length_linter(80),
5
+ b = camel_case_linter,
6
+ c = assignment_linter,
7
+ d = commas_linter,
8
+ e = absolute_paths_linter
9
+ )
10
+
11
+ files <- list.files(path = "exercises", pattern = ".+\\.R$", recursive = TRUE, full.names = TRUE)
12
+ lints <- lintr:::flatten_lints(lapply(files, function(file) {
13
+ if (interactive()) {
14
+ message(".", appendLF = FALSE)
15
+ }
16
+ lint(file, linters, parse_settings = FALSE)
17
+ }))
18
+ if (interactive()) {
19
+ message()
20
+ }
21
+ lints <- lintr:::reorder_lints(lints)
22
+ class(lints) <- "lints"
23
+
24
+ has_lints <- length(lints) > 0
25
+ lint_output <- NULL
26
+ if (has_lints) {
27
+ lint_output <- paste(collapse = "\n", capture.output(print(lints)))
28
+ }
29
+
30
+ testthat::expect(!has_lints, paste(sep = "\n", "Not lint free", lint_output))
@@ -0,0 +1,35 @@
1
+ library(jsonlite)
2
+ library(testthat)
3
+ library(magrittr)
4
+
5
+ test_exercise <- function(exercise) {
6
+
7
+ solution_file <- paste0(exercise, ".R")
8
+ test_file <- paste0("test_", exercise, ".R")
9
+
10
+ file.copy(
11
+ file.path("..", "exercises", exercise, "example.R"),
12
+ solution_file
13
+ )
14
+ file.copy(
15
+ file.path("..", "exercises", exercise, test_file),
16
+ test_file
17
+ )
18
+
19
+ source(test_file)
20
+ rm(list = ls())
21
+
22
+ }
23
+
24
+ # create temp directory for testing purposes
25
+ temp_dir <- "temp"
26
+ dir.create(temp_dir)
27
+ setwd(temp_dir)
28
+
29
+ # read config and test all exercises
30
+ config <- fromJSON(file.path("..", "config.json"))
31
+ lapply(config$exercises$slug, test_exercise)
32
+
33
+ # clean up
34
+ setwd(dir = "../")
35
+ unlink("temp", recursive = TRUE)
@@ -1,3 +1,3 @@
1
- anagram <- function() {
1
+ anagram <- function(subject, candidates) {
2
2
 
3
3
  }
@@ -1,18 +1,18 @@
1
- anagram <- function(subject,candidates) {
1
+ anagram <- function(subject, candidates) {
2
2
  # subject is a string
3
3
  # candidates is a character vector
4
4
  # break subject into vector of characters
5
5
  subject <- tolower(subject)
6
6
  test_candidates <- tolower(candidates)
7
- l <- strsplit(subject,"")[[1]]
7
+ l <- strsplit(subject, "")[[1]]
8
8
  # sub out each character from l in candidates
9
9
  for (i in l) {
10
- test_candidates <- sub(i,"",test_candidates)
10
+ test_candidates <- sub(i, "", test_candidates)
11
11
  }
12
- result <- candidates[test_candidates=="" &
12
+ result <- candidates[test_candidates == "" &
13
13
  tolower(candidates) != subject &
14
14
  nchar(candidates) == length(l)]
15
- if (length(result)==0) {
15
+ if (length(result) == 0) {
16
16
  return(c())
17
17
  }
18
18
  return(result)