Skip to content

Commit 97a2848

Browse files
author
WANG QIANG
committed
Merge pull request #3 from lowjoel/generate-docker-image-names
Implement algorithmic generation of Docker image names given a programming language name.
2 parents 265232b + a6ca208 commit 97a2848

4 files changed

Lines changed: 89 additions & 4 deletions

File tree

lib/coursemology/polyglot/concrete_language/class_methods.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,26 @@
44
# This is deliberately defined so that consumers of this library can inject methods into all
55
# concrete languages' classes.
66
module 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
729
end

lib/coursemology/polyglot/language.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff 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
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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

spec/coursemology/polyglot/language_spec.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff 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

0 commit comments

Comments
 (0)