File tree Expand file tree Collapse file tree
lib/coursemology/polyglot
spec/coursemology/polyglot Expand file tree Collapse file tree Original file line number Diff line number Diff line change 44# This is deliberately defined so that consumers of this library can inject methods into all
55# concrete languages' classes.
66module Coursemology ::Polyglot ::ConcreteLanguage ::ClassMethods
7+ # The default algorithm for translating a language to a corresponding Docker image name.
8+ #
9+ # This will:
10+ # 1. Strip the +Coursemology::Polyglot::Language+ prefix.
11+ # 2. Underscore the name.
12+ # 3. Replace *n*Point*n* strings with dots (e.g. Python2Point7 to Python2.7).
13+ # 4. Replace slashes with dashes.
14+ def docker_image
15+ # Remove the Coursemology::Polyglot::Language prefix
16+ class_name = name
17+ class_name = class_name . sub ( /^Coursemology::Polyglot::Language::/ , '' )
18+
19+ # Use the underscored name
20+ class_name = class_name . underscore
21+
22+ # Replace the "_point" string with a decimal
23+ class_name . gsub! ( /(?<=[\d ])_point(?=[\d ])/ , '.' )
24+
25+ # Replace slashes with dashes
26+ class_name . tr! ( '/' , '-' )
27+ class_name
28+ end
729end
Original file line number Diff line number Diff line change @@ -32,14 +32,15 @@ class Coursemology::Polyglot::Language
3232 # Concrete languages can be instantiated and used.
3333 #
3434 # @param [String] display_name The display name for the language
35- def self . concrete_language ( display_name )
35+ # @param [String] docker_image The Docker image to use for the given language. This defaults to
36+ # the string generated by +Coursemology::Polyglot::ConcreteLanguage.docker_image+.
37+ def self . concrete_language ( display_name , docker_image : nil )
3638 include Coursemology ::Polyglot ::ConcreteLanguage
3739 extend Coursemology ::Polyglot ::ConcreteLanguage ::ClassMethods
3840
3941 concrete_class_methods = Module . new do
40- define_method ( :display_name ) do
41- display_name
42- end
42+ define_method ( :display_name ) { display_name }
43+ define_method ( :docker_image ) { docker_image } if docker_image
4344 end
4445
4546 extend concrete_class_methods
Original file line number Diff line number Diff line change 1+ require 'spec_helper'
2+
3+ RSpec . describe Coursemology ::Polyglot ::ConcreteLanguage do
4+ class self ::DummyLanguage < Coursemology ::Polyglot ::Language
5+ concrete_language 'Dummy Concrete Language'
6+ end
7+
8+ class self ::DummyOverriddenNameLanguage < self ::DummyLanguage
9+ concrete_language 'Dummy Overridden Concrete Language'
10+
11+ def self . name
12+ 'Coursemology::Polyglot::Language::Dummy::OverriddenNameLanguage' . freeze
13+ end
14+ end
15+
16+ describe '.docker_image' do
17+ it 'removes the Coursemology::Polyglot::Language prefix' do
18+ expect ( self . class ::DummyOverriddenNameLanguage . docker_image ) . to \
19+ start_with ( 'dummy' )
20+ end
21+
22+ it 'preserves the nesting of namespaces' do
23+ expect ( self . class ::DummyOverriddenNameLanguage . docker_image ) . to \
24+ eq ( 'dummy-overridden_name_language' )
25+ end
26+
27+ context 'when the name contains Point surrounded by numerals' do
28+ class self ::DummyLanguage1Point0 < self ::DummyLanguage ; end
29+
30+ it 'converts "Point" to dots' do
31+ expect ( self . class ::DummyLanguage1Point0 . docker_image ) . to end_with ( 'dummy_language1.0' )
32+ end
33+ end
34+
35+ context 'when the name contains Point but not surrounded by numerals' do
36+ class self ::DummyLanguagePoint < self ::DummyLanguage ; end
37+
38+ it 'preserves "Point"' do
39+ expect ( self . class ::DummyLanguagePoint . docker_image ) . to end_with ( 'dummy_language_point' )
40+ end
41+ end
42+ end
43+ end
Original file line number Diff line number Diff line change @@ -9,6 +9,11 @@ class self::DummyLanguage < self::AbstractLanguage
99 concrete_language DISPLAY_NAME
1010 end
1111
12+ class self ::DummyLanguageWithDockerImage < self ::DummyLanguage
13+ DOCKER_IMAGE = 'dummy-docker'
14+ concrete_language 'Dummy Docker Image Language' , docker_image : DOCKER_IMAGE
15+ end
16+
1217 describe '.concrete_language' do
1318 it 'sets the correct display name' do
1419 expect ( self . class ::DummyLanguage . display_name ) . to eq ( self . class ::DummyLanguage ::DISPLAY_NAME )
@@ -23,6 +28,20 @@ class self::DummyLanguage < self::AbstractLanguage
2328 expect ( self . class ::DummyLanguage ) . to \
2429 be_a_kind_of ( Coursemology ::Polyglot ::ConcreteLanguage ::ClassMethods )
2530 end
31+
32+ context 'when an explicit Docker image name is specified' do
33+ it 'returns the explicit image name' do
34+ expect ( self . class ::DummyLanguageWithDockerImage . docker_image ) . to \
35+ eq ( self . class ::DummyLanguageWithDockerImage ::DOCKER_IMAGE )
36+ end
37+ end
38+
39+ context 'when no explicit Docker image is specified' do
40+ it 'generates an image name' do
41+ expect ( self . class ::DummyLanguage . docker_image ) . to \
42+ eq ( 'r_spec-example_groups-coursemology_polyglot_language-dummy_language' )
43+ end
44+ end
2645 end
2746
2847 describe '.concrete_languages' do
You can’t perform that action at this time.
0 commit comments