trackler 2.1.0.24 → 2.1.0.25
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitmodules +3 -0
- data/CONTRIBUTING.md +5 -8
- data/README.md +7 -7
- data/common/CONTRIBUTING.md +0 -5
- data/common/exercises/accumulate/description.md +4 -1
- data/common/exercises/acronym/description.md +1 -1
- data/common/exercises/bank-account/description.md +2 -1
- data/common/exercises/book-store/description.md +2 -5
- data/common/exercises/bracket-push/description.md +2 -4
- data/common/exercises/change/description.md +2 -5
- data/common/exercises/circular-buffer/description.md +0 -2
- data/common/exercises/clock/description.md +0 -2
- data/common/exercises/collatz-conjecture/canonical-data.json +36 -0
- data/common/exercises/collatz-conjecture/description.md +25 -0
- data/common/exercises/collatz-conjecture/metadata.yml +4 -0
- data/common/exercises/counter/description.md +1 -2
- data/common/exercises/diamond/description.md +0 -4
- data/common/exercises/flatten-array/description.md +1 -1
- data/common/exercises/grade-school/description.md +2 -1
- data/common/exercises/grains/description.md +2 -1
- data/common/exercises/grep/description.md +3 -2
- data/common/exercises/kindergarten-garden/description.md +2 -1
- data/common/exercises/largest-series-product/description.md +2 -1
- data/common/exercises/matrix/description.md +2 -1
- data/common/exercises/nucleotide-codons/description.md +2 -1
- data/common/exercises/ocr-numbers/description.md +2 -1
- data/common/exercises/octal/description.md +3 -1
- data/common/exercises/pangram/description.md +2 -1
- data/common/exercises/perfect-numbers/description.md +2 -1
- data/common/exercises/poker/description.md +0 -2
- data/common/exercises/protein-translation/description.md +3 -2
- data/common/exercises/proverb/description.md +2 -1
- data/common/exercises/pythagorean-triplet/description.md +4 -2
- data/common/exercises/queen-attack/description.md +2 -1
- data/common/exercises/rectangles/description.md +1 -3
- data/common/exercises/rotational-cipher/description.md +0 -4
- data/common/exercises/scale-generator/description.md +0 -2
- data/common/exercises/secret-handshake/description.md +2 -2
- data/common/exercises/series/description.md +2 -1
- data/common/exercises/sieve/description.md +2 -1
- data/common/exercises/space-age/description.md +0 -2
- data/common/exercises/strain/description.md +4 -5
- data/common/exercises/sublist/description.md +3 -6
- data/common/exercises/sum-of-multiples/description.md +2 -1
- data/common/exercises/tournament/description.md +4 -3
- data/common/exercises/transpose/description.md +1 -3
- data/common/exercises/trinary/description.md +2 -1
- data/common/exercises/two-bucket/description.md +1 -3
- data/common/exercises/two-fer/canonical-data.json +24 -0
- data/common/exercises/two-fer/description.md +40 -0
- data/common/exercises/two-fer/metadata.yml +4 -0
- data/common/exercises/word-search/description.md +2 -4
- data/common/exercises/zebra-puzzle/description.md +1 -1
- data/lib/trackler.rb +10 -5
- data/lib/trackler/description.rb +2 -2
- data/lib/trackler/guaranteed_file.rb +15 -15
- data/lib/trackler/implementation.rb +5 -5
- data/lib/trackler/implementations.rb +2 -2
- data/lib/trackler/metadata.rb +2 -2
- data/lib/trackler/problem.rb +2 -96
- data/lib/trackler/problems.rb +3 -48
- data/lib/trackler/specification.rb +101 -0
- data/lib/trackler/specifications.rb +52 -0
- data/lib/trackler/track.rb +6 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/bash/LICENSE +21 -0
- data/tracks/bash/README.md +0 -5
- data/tracks/c/LICENSE +21 -0
- data/tracks/c/README.md +0 -5
- data/tracks/clojure/LICENSE +2 -2
- data/tracks/clojure/README.org +0 -5
- data/tracks/clojure/config.json +5 -0
- data/tracks/clojure/exercises/sublist/project.clj +4 -0
- data/tracks/clojure/exercises/sublist/src/example.clj +19 -0
- data/tracks/clojure/exercises/sublist/sublist.mustache +9 -0
- data/tracks/clojure/exercises/sublist/test/sublist_test.clj +40 -0
- data/tracks/cpp/LICENSE +2 -2
- data/tracks/cpp/README.md +0 -5
- data/tracks/csharp/LICENSE +2 -2
- data/tracks/csharp/README.md +0 -5
- data/tracks/delphi/LICENSE +2 -2
- data/tracks/delphi/README.md +0 -5
- data/tracks/ecmascript/LICENSE +2 -2
- data/tracks/ecmascript/README.md +0 -5
- data/tracks/elisp/.travis.yml +7 -3
- data/tracks/elisp/LICENSE +2 -2
- data/tracks/elisp/README.org +3 -6
- data/tracks/elisp/bin/test-examples +27 -0
- data/tracks/elisp/config.json +10 -0
- data/tracks/elisp/docs/LEARNING.org +0 -3
- data/tracks/elisp/exercises/grains/example.el +18 -0
- data/tracks/elisp/exercises/grains/grains-test.el +38 -0
- data/tracks/elisp/exercises/grains/grains.el +10 -0
- data/tracks/elisp/exercises/phone-number/example.el +34 -0
- data/tracks/elisp/exercises/phone-number/phone-number-test.el +43 -0
- data/tracks/elisp/exercises/phone-number/phone-number.el +9 -0
- data/tracks/elixir/LICENSE +2 -2
- data/tracks/elixir/README.md +0 -5
- data/tracks/elm/LICENSE +2 -2
- data/tracks/elm/README.md +0 -5
- data/tracks/erlang/LICENSE +2 -2
- data/tracks/erlang/README.md +0 -5
- data/tracks/erlang/SETUP.md +7 -0
- data/tracks/erlang/exercises/rotational-cipher/rebar.config +5 -5
- data/tracks/erlang/exercises/rotational-cipher/test/rotational_cipher_tests.erl +18 -18
- data/tracks/factor/LICENSE +2 -2
- data/tracks/fortran/.github/PULL_REQUEST_TEMPLATE.md +23 -0
- data/tracks/fortran/.gitignore +4 -0
- data/tracks/fortran/.travis.yml +17 -0
- data/tracks/fortran/LICENSE +21 -0
- data/tracks/fortran/Makefile +40 -0
- data/tracks/fortran/README.md +72 -0
- data/tracks/fortran/bin/fetch-configlet +32 -0
- data/tracks/fortran/config.json +32 -0
- data/tracks/{kotlin/SETUP.md → fortran/docs/ABOUT.md} +0 -0
- data/tracks/fortran/docs/INSTALLATION.md +0 -0
- data/tracks/fortran/docs/LEARNING.md +0 -0
- data/tracks/fortran/docs/RESOURCES.md +0 -0
- data/tracks/fortran/docs/TESTS.md +0 -0
- data/tracks/fortran/exercises/TRACK_HINTS.md +0 -0
- data/tracks/fortran/exercises/bob/bob.fun +114 -0
- data/tracks/fortran/exercises/bob/example.f90 +61 -0
- data/tracks/fortran/exercises/hello_world/example.f90 +9 -0
- data/tracks/fortran/exercises/hello_world/hello_world.fun +10 -0
- data/tracks/fortran/img/.keep +0 -0
- data/tracks/fsharp/LICENSE +2 -2
- data/tracks/fsharp/README.md +0 -5
- data/tracks/go/LICENSE +2 -2
- data/tracks/go/README.md +0 -5
- data/tracks/haskell/LICENSE +2 -2
- data/tracks/haskell/README.md +0 -5
- data/tracks/idris/LICENSE +2 -2
- data/tracks/idris/README.md +0 -5
- data/tracks/java/LICENSE +2 -2
- data/tracks/java/README.md +0 -7
- data/tracks/java/{SETUP.md → TRACK_HINTS.md} +0 -0
- data/tracks/java/config.json +5 -0
- data/tracks/java/exercises/_template/build.gradle +1 -0
- data/tracks/java/exercises/accumulate/build.gradle +1 -0
- data/tracks/java/exercises/acronym/build.gradle +1 -0
- data/tracks/java/exercises/all-your-base/build.gradle +1 -0
- data/tracks/java/exercises/allergies/build.gradle +1 -0
- data/tracks/java/exercises/anagram/build.gradle +1 -0
- data/tracks/java/exercises/atbash-cipher/build.gradle +1 -0
- data/tracks/java/exercises/beer-song/build.gradle +1 -0
- data/tracks/java/exercises/binary-search/build.gradle +1 -0
- data/tracks/java/exercises/binary/build.gradle +1 -0
- data/tracks/java/exercises/bob/build.gradle +1 -0
- data/tracks/java/exercises/book-store/build.gradle +1 -0
- data/tracks/java/exercises/bracket-push/build.gradle +1 -0
- data/tracks/java/exercises/change/build.gradle +1 -0
- data/tracks/java/exercises/clock/build.gradle +2 -1
- data/tracks/java/exercises/collatz-conjecture/build.gradle +18 -0
- data/tracks/java/exercises/collatz-conjecture/src/example/java/CollatzCalculator.java +19 -0
- data/tracks/java/exercises/collatz-conjecture/src/main/java/CollatzCalculator.java +7 -0
- data/tracks/java/exercises/collatz-conjecture/src/test/java/CollatzCalculatorTest.java +59 -0
- data/tracks/java/exercises/crypto-square/build.gradle +1 -0
- data/tracks/java/exercises/diamond/build.gradle +1 -0
- data/tracks/java/exercises/diamond/src/example/java/DiamondPrinter.java +4 -4
- data/tracks/java/exercises/diamond/src/test/java/DiamondPrinterTest.java +6 -2
- data/tracks/java/exercises/difference-of-squares/build.gradle +1 -0
- data/tracks/java/exercises/difference-of-squares/src/main/java/.keep +0 -0
- data/tracks/java/exercises/etl/build.gradle +1 -0
- data/tracks/java/exercises/flatten-array/build.gradle +1 -0
- data/tracks/java/exercises/gigasecond/build.gradle +1 -0
- data/tracks/java/exercises/grade-school/build.gradle +1 -0
- data/tracks/java/exercises/hamming/build.gradle +1 -0
- data/tracks/java/exercises/hexadecimal/build.gradle +1 -0
- data/tracks/java/exercises/isogram/build.gradle +1 -0
- data/tracks/java/exercises/kindergarten-garden/build.gradle +1 -0
- data/tracks/java/exercises/largest-series-product/build.gradle +1 -0
- data/tracks/java/exercises/linked-list/build.gradle +1 -0
- data/tracks/java/exercises/luhn/build.gradle +1 -0
- data/tracks/java/exercises/matrix/build.gradle +2 -1
- data/tracks/java/exercises/meetup/build.gradle +1 -0
- data/tracks/java/exercises/minesweeper/build.gradle +1 -0
- data/tracks/java/exercises/nth-prime/build.gradle +1 -0
- data/tracks/java/exercises/ocr-numbers/build.gradle +1 -0
- data/tracks/java/exercises/octal/build.gradle +1 -0
- data/tracks/java/exercises/pangram/build.gradle +1 -0
- data/tracks/java/exercises/pascals-triangle/build.gradle +1 -0
- data/tracks/java/exercises/perfect-numbers/build.gradle +1 -0
- data/tracks/java/exercises/phone-number/build.gradle +1 -0
- data/tracks/java/exercises/pig-latin/build.gradle +1 -0
- data/tracks/java/exercises/queen-attack/build.gradle +1 -0
- data/tracks/java/exercises/raindrops/build.gradle +1 -0
- data/tracks/java/exercises/rectangles/build.gradle +1 -0
- data/tracks/java/exercises/rna-transcription/build.gradle +1 -0
- data/tracks/java/exercises/robot-simulator/build.gradle +1 -0
- data/tracks/java/exercises/roman-numerals/build.gradle +1 -0
- data/tracks/java/exercises/run-length-encoding/build.gradle +1 -0
- data/tracks/java/exercises/saddle-points/build.gradle +1 -0
- data/tracks/java/exercises/scrabble-score/build.gradle +1 -0
- data/tracks/java/exercises/secret-handshake/build.gradle +1 -0
- data/tracks/java/exercises/series/build.gradle +1 -0
- data/tracks/java/exercises/settings.gradle +1 -0
- data/tracks/java/exercises/sieve/build.gradle +1 -0
- data/tracks/java/exercises/simple-cipher/build.gradle +1 -0
- data/tracks/java/exercises/simple-linked-list/build.gradle +1 -0
- data/tracks/java/exercises/space-age/build.gradle +1 -0
- data/tracks/java/exercises/strain/build.gradle +1 -0
- data/tracks/java/exercises/sublist/build.gradle +1 -0
- data/tracks/java/exercises/sum-of-multiples/build.gradle +1 -0
- data/tracks/java/exercises/triangle/build.gradle +1 -0
- data/tracks/java/exercises/trinary/build.gradle +1 -0
- data/tracks/java/exercises/twelve-days/build.gradle +2 -1
- data/tracks/java/exercises/word-count/build.gradle +1 -0
- data/tracks/java/exercises/wordy/build.gradle +1 -0
- data/tracks/javascript/LICENSE +2 -2
- data/tracks/javascript/README.md +0 -5
- data/tracks/julia/LICENSE +2 -2
- data/tracks/kotlin/LICENSE +2 -2
- data/tracks/kotlin/README.md +0 -7
- data/tracks/kotlin/TRACK_HINTS.md +1 -0
- data/tracks/kotlin/exercises/phone-number/src/example/kotlin/PhoneNumber.kt +1 -1
- data/tracks/kotlin/exercises/phone-number/src/test/kotlin/PhoneNumberTest.kt +7 -8
- data/tracks/kotlin/exercises/rna-transcription/src/test/kotlin/RnaTranscriptionTest.kt +6 -6
- data/tracks/lfe/LICENSE +2 -2
- data/tracks/lfe/README.md +0 -5
- data/tracks/lisp/LICENSE +2 -2
- data/tracks/lisp/README.md +0 -5
- data/tracks/lua/LICENSE +2 -2
- data/tracks/lua/README.md +0 -5
- data/tracks/mips/LICENSE +2 -2
- data/tracks/mips/README.md +0 -5
- data/tracks/objective-c/LICENSE +2 -2
- data/tracks/objective-c/README.md +0 -5
- data/tracks/ocaml/LICENSE +2 -2
- data/tracks/ocaml/README.md +0 -5
- data/tracks/ocaml/config.json +54 -25
- data/tracks/ocaml/exercises/forth/.merlin +5 -0
- data/tracks/ocaml/exercises/forth/Makefile +11 -0
- data/tracks/ocaml/exercises/forth/example.ml +89 -0
- data/tracks/ocaml/exercises/forth/forth.mli +1 -0
- data/tracks/ocaml/exercises/forth/test.ml +147 -0
- data/tracks/ocaml/exercises/react/.merlin +5 -0
- data/tracks/ocaml/exercises/react/HINT.md +3 -0
- data/tracks/ocaml/exercises/react/Makefile +11 -0
- data/tracks/ocaml/exercises/react/example.ml +106 -0
- data/tracks/ocaml/exercises/react/react.mli +26 -0
- data/tracks/ocaml/exercises/react/test.ml +157 -0
- data/tracks/ocaml/tools/test-generator/src/special_cases.ml +5 -2
- data/tracks/ocaml/tools/test-generator/templates/forth/template.ml +114 -0
- data/tracks/perl5/LICENSE +2 -2
- data/tracks/perl6/LICENSE +2 -2
- data/tracks/perl6/README.md +0 -5
- data/tracks/perl6/config.json +5 -0
- data/tracks/perl6/exercises/clock/Example.pm6 +2 -2
- data/tracks/perl6/exercises/flatten-array/Example.pm6 +13 -0
- data/tracks/perl6/exercises/flatten-array/FlattenArray.pm6 +4 -0
- data/tracks/perl6/exercises/flatten-array/example.yaml +6 -0
- data/tracks/perl6/exercises/flatten-array/flatten-array.t +80 -0
- data/tracks/php/LICENSE +2 -2
- data/tracks/php/README.md +0 -5
- data/tracks/powershell/.travis.yml +1 -0
- data/tracks/python/LICENSE +2 -2
- data/tracks/python/README.md +0 -5
- data/tracks/python/config.json +8 -0
- data/tracks/python/exercises/protein-translation/example.py +25 -0
- data/tracks/python/exercises/protein-translation/protein_translation.py +6 -0
- data/tracks/python/exercises/protein-translation/protein_translation_test.py +59 -0
- data/tracks/r/LICENSE +2 -2
- data/tracks/r/README.md +0 -5
- data/tracks/racket/LICENSE +2 -2
- data/tracks/racket/README.md +0 -5
- data/tracks/racket/config.json +5 -0
- data/tracks/racket/exercises/acronym/acronym-test.rkt +40 -0
- data/tracks/racket/exercises/acronym/acronym.rkt +3 -0
- data/tracks/racket/exercises/acronym/example.rkt +25 -0
- data/tracks/racket/exercises/grep/example.rkt +60 -26
- data/tracks/racket/exercises/grep/grep-test.rkt +154 -17
- data/tracks/racket/exercises/grep/grep.rkt +1 -18
- data/tracks/racket/exercises/grep/iliad.txt +9 -0
- data/tracks/racket/exercises/grep/midsummer-night.txt +7 -0
- data/tracks/racket/exercises/grep/paradise-lost.txt +8 -0
- data/tracks/ruby/README.md +4 -1
- data/tracks/ruby/exercises/acronym/.meta/.version +1 -1
- data/tracks/ruby/exercises/acronym/.meta/solutions/acronym.rb +1 -1
- data/tracks/ruby/exercises/acronym/acronym_test.rb +2 -7
- data/tracks/ruby/exercises/anagram/.meta/generator/anagram_case.rb +1 -1
- data/tracks/ruby/exercises/beer-song/.meta/generator/beer_song_case.rb +1 -1
- data/tracks/ruby/exercises/clock/.meta/generator/clock_case.rb +1 -1
- data/tracks/ruby/exercises/connect/.meta/generator/connect_case.rb +0 -3
- data/tracks/ruby/exercises/connect/.meta/generator/test_template.erb +1 -1
- data/tracks/ruby/exercises/difference-of-squares/.meta/.version +1 -1
- data/tracks/ruby/exercises/difference-of-squares/.meta/solutions/difference_of_squares.rb +1 -1
- data/tracks/ruby/exercises/difference-of-squares/difference_of_squares_test.rb +12 -17
- data/tracks/ruby/exercises/triangle/.meta/generator/triangle_case.rb +10 -2
- data/tracks/ruby/exercises/triangle/triangle_test.rb +17 -17
- data/tracks/ruby/exercises/wordy/.meta/generator/wordy_case.rb +1 -1
- data/tracks/ruby/lib/generator/case_values.rb +1 -1
- data/tracks/ruby/lib/generator/exercise_case.rb +16 -2
- data/tracks/ruby/lib/generator/exercise_case/assertion.rb +4 -4
- data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/generator/alpha_case.rb +1 -1
- data/tracks/ruby/test/generator/case_values_test.rb +28 -7
- data/tracks/ruby/test/generator/exercise_case/assertion_test.rb +7 -7
- data/tracks/ruby/test/generator/exercise_case_test.rb +21 -25
- data/tracks/ruby/test/wordy_cases_test.rb +4 -4
- data/tracks/rust/LICENSE +2 -2
- data/tracks/rust/README.md +0 -5
- data/tracks/rust/config.json +1 -0
- data/tracks/rust/exercises/etl/Cargo.toml +1 -1
- data/tracks/rust/exercises/etl/example.rs +2 -2
- data/tracks/rust/exercises/etl/tests/etl.rs +26 -32
- data/tracks/rust/exercises/forth/tests/forth.rs +20 -22
- data/tracks/rust/exercises/minesweeper/Cargo.toml +1 -1
- data/tracks/rust/exercises/minesweeper/example.rs +3 -0
- data/tracks/rust/exercises/minesweeper/tests/minesweeper.rs +44 -46
- data/tracks/rust/exercises/raindrops/Cargo.toml +1 -1
- data/tracks/rust/exercises/raindrops/tests/raindrops.rs +12 -0
- data/tracks/rust/exercises/rna-transcription/Cargo.toml +1 -1
- data/tracks/rust/exercises/rna-transcription/example.rs +13 -9
- data/tracks/rust/exercises/rna-transcription/tests/rna-transcription.rs +23 -5
- data/tracks/scala/LICENSE +2 -2
- data/tracks/scala/README.md +0 -5
- data/tracks/scheme/LICENSE +2 -2
- data/tracks/scheme/README.org +0 -6
- data/tracks/swift/Dangerfile +1 -1
- data/tracks/swift/LICENSE +2 -2
- data/tracks/swift/README.md +0 -6
- data/tracks/vbnet/.travis.yml +1 -0
- data/tracks/vimscript/.travis.yml +4 -0
- data/tracks/vimscript/.vintrc.yaml +5 -0
- data/tracks/vimscript/TRACK_HINTS.md +19 -1
- data/tracks/vimscript/bin/pre-push +18 -0
- data/tracks/vimscript/config.json +8 -1
- data/tracks/vimscript/docs/ABOUT.md +7 -6
- data/tracks/vimscript/docs/TESTS.md +4 -4
- data/tracks/vimscript/exercises/allergies/allergies.vader +68 -0
- data/tracks/vimscript/exercises/allergies/allergies.vim +29 -0
- data/tracks/vimscript/exercises/allergies/example.vim +23 -0
- data/tracks/vimscript/lib/generate.vim +89 -0
- metadata +81 -6
- data/tracks/java/exercises/difference-of-squares/src/main/java/DifferenceOfSquaresCalculator.java +0 -15
- data/tracks/ocaml/.vscode/launch.json +0 -13
data/lib/trackler/problems.rb
CHANGED
@@ -1,52 +1,7 @@
|
|
1
|
+
require_relative 'specifications'
|
2
|
+
|
1
3
|
module Trackler
|
2
4
|
# Problems is the collection of problems that we have metadata for.
|
3
|
-
class Problems
|
4
|
-
include Enumerable
|
5
|
-
|
6
|
-
attr_reader :root
|
7
|
-
def initialize(root)
|
8
|
-
@root = root
|
9
|
-
end
|
10
|
-
|
11
|
-
def each
|
12
|
-
active.each do |problem|
|
13
|
-
yield problem
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def [](slug)
|
18
|
-
by_slug[slug]
|
19
|
-
end
|
20
|
-
|
21
|
-
# rubocop:disable Style/OpMethod
|
22
|
-
def -(slugs)
|
23
|
-
(by_slug.keys - slugs).sort
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def active
|
29
|
-
@active ||= all.select(&:active?)
|
30
|
-
end
|
31
|
-
|
32
|
-
def all
|
33
|
-
@all_problems ||= exercise_slugs.map { |slug| Problem.new(slug, root) }
|
34
|
-
end
|
35
|
-
|
36
|
-
def exercise_slugs
|
37
|
-
Dir["%s/common/exercises/*/" % root].map { |path| File.basename(path) }.sort
|
38
|
-
end
|
39
|
-
|
40
|
-
def by_slug
|
41
|
-
@by_slug ||= problem_map
|
42
|
-
end
|
43
|
-
|
44
|
-
def problem_map
|
45
|
-
hash = Hash.new { |_, k| Problem.new(k, root) }
|
46
|
-
active.each do |problem|
|
47
|
-
hash[problem.slug] = problem
|
48
|
-
end
|
49
|
-
hash
|
50
|
-
end
|
5
|
+
class Problems < Trackler::Specifications
|
51
6
|
end
|
52
7
|
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require_relative 'metadata'
|
3
|
+
require_relative 'description'
|
4
|
+
require_relative 'null_track'
|
5
|
+
|
6
|
+
module Trackler
|
7
|
+
# Specification is a language-independent definition of a problem to solve.
|
8
|
+
class Specification
|
9
|
+
attr_reader :slug, :root, :metadata
|
10
|
+
def initialize(slug, root, track = NullTrack.new)
|
11
|
+
@slug = slug
|
12
|
+
@root = root
|
13
|
+
@file_root = File.join(root, 'common', 'exercises', self.slug)
|
14
|
+
@repo_root = "https://github.com/exercism/x-common/blob/master/exercises/%s/" % self.slug
|
15
|
+
|
16
|
+
@metadata = Metadata.for(specification: self, track: track)
|
17
|
+
self.description_object = Description.for(specification: self, track: track)
|
18
|
+
end
|
19
|
+
|
20
|
+
def exists?
|
21
|
+
description_object.exists? && metadata.exists?
|
22
|
+
end
|
23
|
+
|
24
|
+
def deprecated?
|
25
|
+
@deprecated ||= File.exists?(file_path(deprecation_file_name, @file_root))
|
26
|
+
end
|
27
|
+
|
28
|
+
def active?
|
29
|
+
exists? && !deprecated?
|
30
|
+
end
|
31
|
+
|
32
|
+
def name
|
33
|
+
slug.split('-').map(&:capitalize).join(' ')
|
34
|
+
end
|
35
|
+
|
36
|
+
def description
|
37
|
+
description_object.to_s
|
38
|
+
end
|
39
|
+
|
40
|
+
def source_markdown
|
41
|
+
text = [source, markdown_link(source_url)].reject(&:empty?).join(" ")
|
42
|
+
text.empty? ? text : "## Source\n\n#{text}"
|
43
|
+
end
|
44
|
+
|
45
|
+
def description_url
|
46
|
+
description_object.url
|
47
|
+
end
|
48
|
+
|
49
|
+
def canonical_data_url
|
50
|
+
repo_url(canonical_data_file_name) if File.exists?(file_path(canonical_data_file_name, @file_root))
|
51
|
+
end
|
52
|
+
|
53
|
+
def metadata_url
|
54
|
+
metadata.url
|
55
|
+
end
|
56
|
+
|
57
|
+
def blurb
|
58
|
+
metadata.blurb
|
59
|
+
end
|
60
|
+
|
61
|
+
def source
|
62
|
+
metadata.source
|
63
|
+
end
|
64
|
+
|
65
|
+
def source_url
|
66
|
+
metadata.source_url
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
attr_accessor :description_object
|
72
|
+
|
73
|
+
def canonical_data_file_name
|
74
|
+
"canonical-data.json"
|
75
|
+
end
|
76
|
+
|
77
|
+
def description_file_name
|
78
|
+
"description.md"
|
79
|
+
end
|
80
|
+
|
81
|
+
def metadata_file_name
|
82
|
+
"metadata.yml"
|
83
|
+
end
|
84
|
+
|
85
|
+
def deprecation_file_name
|
86
|
+
".deprecated"
|
87
|
+
end
|
88
|
+
|
89
|
+
def repo_url(filename)
|
90
|
+
@repo_root + filename
|
91
|
+
end
|
92
|
+
|
93
|
+
def file_path(filename, root = @file_root)
|
94
|
+
File.join(root, filename)
|
95
|
+
end
|
96
|
+
|
97
|
+
def markdown_link(url)
|
98
|
+
url.empty? ? url : format("[%s](%s)", url, url)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Trackler
|
2
|
+
# Specifications is the collection of problems that we have metadata for.
|
3
|
+
class Specifications
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
attr_reader :root
|
7
|
+
def initialize(root)
|
8
|
+
@root = root
|
9
|
+
end
|
10
|
+
|
11
|
+
def each
|
12
|
+
active.each do |specification|
|
13
|
+
yield specification
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def [](slug)
|
18
|
+
by_slug[slug]
|
19
|
+
end
|
20
|
+
|
21
|
+
# rubocop:disable Style/OpMethod
|
22
|
+
def -(slugs)
|
23
|
+
(by_slug.keys - slugs).sort
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def active
|
29
|
+
@active ||= all.select(&:active?)
|
30
|
+
end
|
31
|
+
|
32
|
+
def all
|
33
|
+
@all_specifications ||= exercise_slugs.map { |slug| Specification.new(slug, root) }
|
34
|
+
end
|
35
|
+
|
36
|
+
def exercise_slugs
|
37
|
+
Dir["%s/common/exercises/*/" % root].map { |path| File.basename(path) }.sort
|
38
|
+
end
|
39
|
+
|
40
|
+
def by_slug
|
41
|
+
@by_slug ||= specification_map
|
42
|
+
end
|
43
|
+
|
44
|
+
def specification_map
|
45
|
+
hash = Hash.new { |_, k| Specification.new(k, root) }
|
46
|
+
active.each do |specification|
|
47
|
+
hash[specification.slug] = specification
|
48
|
+
end
|
49
|
+
hash
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/trackler/track.rb
CHANGED
@@ -68,10 +68,12 @@ module Trackler
|
|
68
68
|
@icon ||= svg_icon.exists? ? svg_icon : png_icon
|
69
69
|
end
|
70
70
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
71
|
+
def language
|
72
|
+
config['language'].to_s.strip
|
73
|
+
end
|
74
|
+
|
75
|
+
def repository
|
76
|
+
config['repository'].to_s.strip
|
75
77
|
end
|
76
78
|
|
77
79
|
def test_pattern
|
data/lib/trackler/version.rb
CHANGED
data/tracks/bash/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2017 Exercism, Inc
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/tracks/bash/README.md
CHANGED
@@ -8,11 +8,6 @@ Exercism Exercises in Bash
|
|
8
8
|
|
9
9
|
Please see the [contributing guide](https://github.com/exercism/x-api/blob/master/CONTRIBUTING.md#the-exercise-data)
|
10
10
|
|
11
|
-
## License
|
12
|
-
|
13
|
-
The MIT License (MIT)
|
14
|
-
|
15
|
-
Copyright (c) 2014 Katrina Owen, _@kytrinyx.com
|
16
11
|
|
17
12
|
### Bash icon
|
18
13
|
We are using an unofficial logo of the GNU Bash project created by Justin Dorfman. It's not clear under which terms it's released. We believe that our adaptation, changing the colours, falls under fair use.
|
data/tracks/c/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2017 Exercism, Inc
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/tracks/c/README.md
CHANGED
@@ -26,8 +26,3 @@ indent -nbad -bap -nbc -bbo -hnl -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -d0 -d
|
|
26
26
|
|
27
27
|
See the [GNU `indent` manual](https://www.gnu.org/software/indent/manual/indent.html#SEC4) for more information.
|
28
28
|
|
29
|
-
## License
|
30
|
-
|
31
|
-
The MIT License (MIT)
|
32
|
-
|
33
|
-
Copyright (c) 2014 Katrina Owen, _@kytrinyx.com
|
data/tracks/clojure/LICENSE
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
MIT License
|
2
2
|
|
3
|
-
Copyright (c)
|
3
|
+
Copyright (c) 2017 Exercism, Inc
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
data/tracks/clojure/README.org
CHANGED
@@ -8,11 +8,6 @@ Exercism exercises in Clojure
|
|
8
8
|
* Contributing Guide
|
9
9
|
Please see the [[https://github.com/exercism/x-api/blob/master/CONTRIBUTING.md#the-exercise-data][contributing guide]].
|
10
10
|
|
11
|
-
* License
|
12
|
-
The MIT License (MIT)
|
13
|
-
|
14
|
-
Copyright (c) 2014 Katrina Owen, _@kytrinyx.com
|
15
|
-
|
16
11
|
*** [[https://github.com/exercism/xclojure/tree/master/img/icon.png][Clojure icon]]
|
17
12
|
The Clojure logo is owned by Rich Hickey.
|
18
13
|
We are using it to identify the Clojure language itself, not any part of Exercism, which we believe to be admissible under fair use.
|
data/tracks/clojure/config.json
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
(ns sublist)
|
2
|
+
|
3
|
+
(defn- list-contains?
|
4
|
+
"Returns truthy when list2 is contained within list1, nil otherwise"
|
5
|
+
[list1 list2]
|
6
|
+
(some #(when (= % list2) val)
|
7
|
+
(partition (count list2) 1 list1)))
|
8
|
+
|
9
|
+
(defn classify
|
10
|
+
"Classifies two lists based on whether coll1 is the same list, a superlist,
|
11
|
+
a sublist, or disjoint (unequal) from coll2."
|
12
|
+
[coll1 coll2]
|
13
|
+
(let [len1 (count coll1)
|
14
|
+
len2 (count coll2)]
|
15
|
+
(cond
|
16
|
+
(= coll1 coll2) :equal
|
17
|
+
(and (> len1 len2) (list-contains? coll1 coll2)) :superlist
|
18
|
+
(and (> len2 len1) (list-contains? coll2 coll1)) :sublist
|
19
|
+
:else :unequal)))
|
@@ -0,0 +1,40 @@
|
|
1
|
+
(ns sublist-test
|
2
|
+
(:require [clojure.test :refer [deftest is testing]]
|
3
|
+
sublist))
|
4
|
+
|
5
|
+
(deftest sublist-tests
|
6
|
+
(testing "empty lists"
|
7
|
+
(is (= :equal (sublist/classify [] []))))
|
8
|
+
(testing "empty list within non empty list"
|
9
|
+
(is (= :sublist (sublist/classify [] [1 2 3]))))
|
10
|
+
(testing "non empty list contains empty list"
|
11
|
+
(is (= :superlist (sublist/classify [1 2 3] []))))
|
12
|
+
(testing "list equals itself"
|
13
|
+
(is (= :equal (sublist/classify [1 2 3] [1 2 3]))))
|
14
|
+
(testing "different lists"
|
15
|
+
(is (= :unequal (sublist/classify [1 2 3] [2 3 4]))))
|
16
|
+
(testing "false start"
|
17
|
+
(is (= :sublist (sublist/classify [1 2 5] [0 1 2 3 1 2 5 6]))))
|
18
|
+
(testing "consecutive"
|
19
|
+
(is (= :sublist (sublist/classify [1 1 2] [0 1 1 1 2 1 2]))))
|
20
|
+
(testing "sublist at start"
|
21
|
+
(is (= :sublist (sublist/classify [0 1 2] [0 1 2 3 4 5]))))
|
22
|
+
(testing "sublist in middle"
|
23
|
+
(is (= :sublist (sublist/classify [2 3 4] [0 1 2 3 4 5]))))
|
24
|
+
(testing "sublist at end"
|
25
|
+
(is (= :sublist (sublist/classify [3 4 5] [0 1 2 3 4 5]))))
|
26
|
+
(testing "at start of superlist"
|
27
|
+
(is (= :superlist (sublist/classify [0 1 2 3 4 5] [0 1 2]))))
|
28
|
+
(testing "in middle of superlist"
|
29
|
+
(is (= :superlist (sublist/classify [0 1 2 3 4 5] [2 3]))))
|
30
|
+
(testing "at end of superlist"
|
31
|
+
(is (= :superlist (sublist/classify [0 1 2 3 4 5] [3 4 5]))))
|
32
|
+
(testing "first list missing element from second list"
|
33
|
+
(is (= :unequal (sublist/classify [1 3] [1 2 3]))))
|
34
|
+
(testing "second list missing element from first list"
|
35
|
+
(is (= :unequal (sublist/classify [1 2 3] [1 3]))))
|
36
|
+
(testing "order matters to a list"
|
37
|
+
(is (= :unequal (sublist/classify [1 2 3] [3 2 1]))))
|
38
|
+
(testing "same digits but different numbers"
|
39
|
+
(is (= :unequal (sublist/classify [1 0 1] [10 1]))))
|
40
|
+
)
|
data/tracks/cpp/LICENSE
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
MIT License
|
2
2
|
|
3
|
-
Copyright (c)
|
3
|
+
Copyright (c) 2017 Exercism, Inc
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
data/tracks/cpp/README.md
CHANGED
data/tracks/csharp/LICENSE
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
MIT License
|
2
2
|
|
3
|
-
Copyright (c)
|
3
|
+
Copyright (c) 2017 Exercism, Inc
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|