Merge branch 'webpython-hybrid' of ssh://github.com/openHPI/codeocean into webpython-hybrid
This commit is contained in:
16
Gemfile.lock
16
Gemfile.lock
@ -50,8 +50,6 @@ GEM
|
|||||||
bootstrap-will_paginate (0.0.10)
|
bootstrap-will_paginate (0.0.10)
|
||||||
will_paginate
|
will_paginate
|
||||||
builder (3.2.2)
|
builder (3.2.2)
|
||||||
byebug (4.0.5)
|
|
||||||
columnize (= 0.9.0)
|
|
||||||
capistrano (3.3.5)
|
capistrano (3.3.5)
|
||||||
capistrano-stats (~> 1.1.0)
|
capistrano-stats (~> 1.1.0)
|
||||||
i18n
|
i18n
|
||||||
@ -96,7 +94,6 @@ GEM
|
|||||||
execjs
|
execjs
|
||||||
coffee-script-source (1.9.1)
|
coffee-script-source (1.9.1)
|
||||||
colorize (0.7.7)
|
colorize (0.7.7)
|
||||||
columnize (0.9.0)
|
|
||||||
concurrent-ruby (0.8.0)
|
concurrent-ruby (0.8.0)
|
||||||
ref (~> 1.0, >= 1.0.5)
|
ref (~> 1.0, >= 1.0.5)
|
||||||
concurrent-ruby (0.8.0-java)
|
concurrent-ruby (0.8.0-java)
|
||||||
@ -110,6 +107,7 @@ GEM
|
|||||||
excon (>= 0.38.0)
|
excon (>= 0.38.0)
|
||||||
json
|
json
|
||||||
erubis (2.7.0)
|
erubis (2.7.0)
|
||||||
|
eventmachine (1.0.8)
|
||||||
excon (0.45.2)
|
excon (0.45.2)
|
||||||
execjs (2.5.2)
|
execjs (2.5.2)
|
||||||
factory_girl (4.5.0)
|
factory_girl (4.5.0)
|
||||||
@ -119,6 +117,9 @@ GEM
|
|||||||
railties (>= 3.0.0)
|
railties (>= 3.0.0)
|
||||||
faraday (0.9.1)
|
faraday (0.9.1)
|
||||||
multipart-post (>= 1.2, < 3)
|
multipart-post (>= 1.2, < 3)
|
||||||
|
faye-websocket (0.10.0)
|
||||||
|
eventmachine (>= 0.12.0)
|
||||||
|
websocket-driver (>= 0.5.1)
|
||||||
ffi (1.9.8)
|
ffi (1.9.8)
|
||||||
ffi (1.9.8-java)
|
ffi (1.9.8-java)
|
||||||
forgery (0.6.0)
|
forgery (0.6.0)
|
||||||
@ -302,6 +303,9 @@ GEM
|
|||||||
thread_safe (0.3.5)
|
thread_safe (0.3.5)
|
||||||
thread_safe (0.3.5-java)
|
thread_safe (0.3.5-java)
|
||||||
tilt (1.4.1)
|
tilt (1.4.1)
|
||||||
|
tubesock (0.2.5)
|
||||||
|
rack (>= 1.5.0)
|
||||||
|
websocket (>= 1.1.0)
|
||||||
turbolinks (2.5.3)
|
turbolinks (2.5.3)
|
||||||
coffee-rails
|
coffee-rails
|
||||||
tzinfo (1.2.2)
|
tzinfo (1.2.2)
|
||||||
@ -315,6 +319,9 @@ GEM
|
|||||||
railties (>= 4.0)
|
railties (>= 4.0)
|
||||||
sprockets-rails (>= 2.0, < 4.0)
|
sprockets-rails (>= 2.0, < 4.0)
|
||||||
websocket (1.2.1)
|
websocket (1.2.1)
|
||||||
|
websocket-driver (0.6.2)
|
||||||
|
websocket-extensions (>= 0.1.0)
|
||||||
|
websocket-extensions (0.1.2)
|
||||||
will_paginate (3.0.7)
|
will_paginate (3.0.7)
|
||||||
xpath (2.0.0)
|
xpath (2.0.0)
|
||||||
nokogiri (~> 1.3)
|
nokogiri (~> 1.3)
|
||||||
@ -330,7 +337,6 @@ DEPENDENCIES
|
|||||||
better_errors
|
better_errors
|
||||||
binding_of_caller
|
binding_of_caller
|
||||||
bootstrap-will_paginate
|
bootstrap-will_paginate
|
||||||
byebug
|
|
||||||
capistrano (~> 3.3.0)
|
capistrano (~> 3.3.0)
|
||||||
capistrano-rails
|
capistrano-rails
|
||||||
capistrano-rvm
|
capistrano-rvm
|
||||||
@ -345,6 +351,7 @@ DEPENDENCIES
|
|||||||
database_cleaner
|
database_cleaner
|
||||||
docker-api (~> 1.21.1)
|
docker-api (~> 1.21.1)
|
||||||
factory_girl_rails (~> 4.0)
|
factory_girl_rails (~> 4.0)
|
||||||
|
faye-websocket
|
||||||
forgery
|
forgery
|
||||||
highline
|
highline
|
||||||
ims-lti
|
ims-lti
|
||||||
@ -375,6 +382,7 @@ DEPENDENCIES
|
|||||||
sorcery
|
sorcery
|
||||||
spring
|
spring
|
||||||
thread_safe
|
thread_safe
|
||||||
|
tubesock
|
||||||
turbolinks
|
turbolinks
|
||||||
uglifier (>= 1.3.0)
|
uglifier (>= 1.3.0)
|
||||||
web-console (~> 2.0)
|
web-console (~> 2.0)
|
||||||
|
@ -11,6 +11,7 @@ $(function() {
|
|||||||
var FILENAME_URL_PLACEHOLDER = '{filename}';
|
var FILENAME_URL_PLACEHOLDER = '{filename}';
|
||||||
var SUCCESSFULL_PERCENTAGE = 90;
|
var SUCCESSFULL_PERCENTAGE = 90;
|
||||||
var THEME = 'ace/theme/textmate';
|
var THEME = 'ace/theme/textmate';
|
||||||
|
var REMEMBER_TAB = false;
|
||||||
var AUTOSAVE_INTERVAL = 15 * 1000;
|
var AUTOSAVE_INTERVAL = 15 * 1000;
|
||||||
|
|
||||||
var editors = [];
|
var editors = [];
|
||||||
@ -59,7 +60,7 @@ $(function() {
|
|||||||
|
|
||||||
if (event.type === 'error' || JSON.parse(event.data).code !== 200) {
|
if (event.type === 'error' || JSON.parse(event.data).code !== 200) {
|
||||||
ajaxError();
|
ajaxError();
|
||||||
showTab(1);
|
showTab(0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -262,13 +263,11 @@ $(function() {
|
|||||||
|
|
||||||
var handleKeyPress = function(event) {
|
var handleKeyPress = function(event) {
|
||||||
if (event.which === ALT_1_KEY_CODE) {
|
if (event.which === ALT_1_KEY_CODE) {
|
||||||
showTab(0);
|
|
||||||
} else if (event.which === ALT_2_KEY_CODE) {
|
|
||||||
showWorkspaceTab(event);
|
showWorkspaceTab(event);
|
||||||
|
} else if (event.which === ALT_2_KEY_CODE) {
|
||||||
|
showTab(1);
|
||||||
} else if (event.which === ALT_3_KEY_CODE) {
|
} else if (event.which === ALT_3_KEY_CODE) {
|
||||||
showTab(2);
|
showTab(2);
|
||||||
} else if (event.which === ALT_4_KEY_CODE) {
|
|
||||||
showTab(3);
|
|
||||||
} else if (event.which === ALT_R_KEY_CODE) {
|
} else if (event.which === ALT_R_KEY_CODE) {
|
||||||
$('#run').trigger('click');
|
$('#run').trigger('click');
|
||||||
} else if (event.which === ALT_S_KEY_CODE) {
|
} else if (event.which === ALT_S_KEY_CODE) {
|
||||||
@ -311,7 +310,7 @@ $(function() {
|
|||||||
}, 0).toFixed(2);
|
}, 0).toFixed(2);
|
||||||
$('#score').data('score', score);
|
$('#score').data('score', score);
|
||||||
renderScore();
|
renderScore();
|
||||||
showTab(3);
|
showTab(2);
|
||||||
};
|
};
|
||||||
|
|
||||||
var stderrOutput = '';
|
var stderrOutput = '';
|
||||||
@ -364,7 +363,7 @@ $(function() {
|
|||||||
qa_api.executeCommand('syncOutput', [response]);
|
qa_api.executeCommand('syncOutput', [response]);
|
||||||
}
|
}
|
||||||
showStatus(response[0]);
|
showStatus(response[0]);
|
||||||
showTab(2);
|
showTab(1);
|
||||||
};
|
};
|
||||||
|
|
||||||
var hideSpinner = function() {
|
var hideSpinner = function() {
|
||||||
@ -719,7 +718,7 @@ $(function() {
|
|||||||
clearOutput();
|
clearOutput();
|
||||||
$('#hint').fadeOut();
|
$('#hint').fadeOut();
|
||||||
$('#flowrHint').fadeOut();
|
$('#flowrHint').fadeOut();
|
||||||
showTab(2);
|
showTab(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
var printOutput = function(output, colorize, index) {
|
var printOutput = function(output, colorize, index) {
|
||||||
@ -820,7 +819,7 @@ $(function() {
|
|||||||
stderr: message
|
stderr: message
|
||||||
}, true, 0);
|
}, true, 0);
|
||||||
sendError(message, response.id);
|
sendError(message, response.id);
|
||||||
showTab(2);
|
showTab(1);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -943,17 +942,22 @@ $(function() {
|
|||||||
|
|
||||||
var showOutput = function(event) {
|
var showOutput = function(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
showTab(2);
|
showTab(1);
|
||||||
$('#output').scrollTo($(this).attr('href'));
|
$('#output').scrollTo($(this).attr('href'));
|
||||||
};
|
};
|
||||||
|
|
||||||
var showRequestedTab = function() {
|
var showRequestedTab = function() {
|
||||||
|
if(REMEMBER_TAB){
|
||||||
var regexp = /tab=(\d+)/;
|
var regexp = /tab=(\d+)/;
|
||||||
if (regexp.test(window.location.search)) {
|
if (regexp.test(window.location.search)) {
|
||||||
var index = regexp.exec(window.location.search)[1] - 1;
|
var index = regexp.exec(window.location.search)[1] - 1;
|
||||||
} else {
|
} else {
|
||||||
var index = localStorage.tab;
|
var index = localStorage.tab;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// else start with first tab.
|
||||||
|
var index = 0;
|
||||||
|
}
|
||||||
showTab(index);
|
showTab(index);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1008,7 +1012,7 @@ $(function() {
|
|||||||
|
|
||||||
var showWorkspaceTab = function(event) {
|
var showWorkspaceTab = function(event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
showTab(1);
|
showTab(0);
|
||||||
};
|
};
|
||||||
|
|
||||||
var stopCode = function(event) {
|
var stopCode = function(event) {
|
||||||
@ -1156,7 +1160,8 @@ $(function() {
|
|||||||
if (!msg.data) {
|
if (!msg.data) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
msg.data = msg.data.replace(/(\r\n|\n|\r)/gm, "</br>");
|
//msg.data = msg.data.replace(/(\r\n|\n|\r)/gm, "<br />");
|
||||||
|
msg.data = msg.data.replace(/(\r)/gm, "\n");
|
||||||
var stream = {};
|
var stream = {};
|
||||||
stream[msg.stream] = msg.data;
|
stream[msg.stream] = msg.data;
|
||||||
printOutput(stream, true, 0);
|
printOutput(stream, true, 0);
|
||||||
|
@ -62,7 +62,7 @@ class ExercisesController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def exercise_params
|
def exercise_params
|
||||||
params[:exercise].permit(:description, :execution_environment_id, :file_id, :instructions, :public, :team_id, :title, files_attributes: file_attributes).merge(user_id: current_user.id, user_type: current_user.class.name)
|
params[:exercise].permit(:description, :execution_environment_id, :file_id, :instructions, :public, :hide_file_tree, :team_id, :title, files_attributes: file_attributes).merge(user_id: current_user.id, user_type: current_user.class.name)
|
||||||
end
|
end
|
||||||
private :exercise_params
|
private :exercise_params
|
||||||
|
|
||||||
|
@ -138,8 +138,10 @@ class SubmissionsController < ApplicationController
|
|||||||
if (/^exit/.match(message))
|
if (/^exit/.match(message))
|
||||||
kill_socket(tubesock)
|
kill_socket(tubesock)
|
||||||
else
|
else
|
||||||
# Filter out information about user and working directory
|
# Filter out information about run_command, test_command, user or working directory
|
||||||
if !(/root|workspace/.match(message))
|
run_command = @submission.execution_environment.run_command
|
||||||
|
test_command = @submission.execution_environment.test_command
|
||||||
|
if !(/root|workspace|#{run_command}|#{test_command}/.match(message))
|
||||||
parse_message(message, 'stdout', tubesock)
|
parse_message(message, 'stdout', tubesock)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#editor.row data-exercise-id=exercise.id data-message-depleted=t('exercises.editor.depleted') data-message-timeout=t('exercises.editor.timeout', permitted_execution_time: @exercise.execution_environment.permitted_execution_time) data-errors-url=execution_environment_errors_path(exercise.execution_environment) data-submissions-url=submissions_path data-user-id=@current_user.id
|
#editor.row data-exercise-id=exercise.id data-message-depleted=t('exercises.editor.depleted') data-message-timeout=t('exercises.editor.timeout', permitted_execution_time: @exercise.execution_environment.permitted_execution_time) data-errors-url=execution_environment_errors_path(exercise.execution_environment) data-submissions-url=submissions_path data-user-id=@current_user.id
|
||||||
.col-sm-3 = render('editor_file_tree', files: @files)
|
div class=(@exercise.hide_file_tree ? 'hidden col-sm-3' : 'col-sm-3') = render('editor_file_tree', files: @files)
|
||||||
#frames.col-sm-9
|
div id='frames' class=(@exercise.hide_file_tree ? 'col-sm-12' : 'col-sm-9')
|
||||||
- @files.each do |file|
|
- @files.each do |file|
|
||||||
= render('editor_frame', exercise: exercise, file: file)
|
= render('editor_frame', exercise: exercise, file: file)
|
||||||
#autosave-label
|
#autosave-label
|
||||||
|
@ -23,6 +23,10 @@
|
|||||||
label
|
label
|
||||||
= f.check_box(:public)
|
= f.check_box(:public)
|
||||||
= t('activerecord.attributes.exercise.public')
|
= t('activerecord.attributes.exercise.public')
|
||||||
|
.checkbox
|
||||||
|
label
|
||||||
|
= f.check_box(:hide_file_tree)
|
||||||
|
= t('activerecord.attributes.exercise.hide_file_tree')
|
||||||
h2 = t('activerecord.attributes.exercise.files')
|
h2 = t('activerecord.attributes.exercise.files')
|
||||||
ul#files.list-unstyled
|
ul#files.list-unstyled
|
||||||
= f.fields_for :files do |files_form|
|
= f.fields_for :files do |files_form|
|
||||||
|
@ -13,39 +13,29 @@
|
|||||||
#development-environment
|
#development-environment
|
||||||
ul.nav.nav-justified.nav-tabs role='tablist'
|
ul.nav.nav-justified.nav-tabs role='tablist'
|
||||||
li.active
|
li.active
|
||||||
a data-placement='top' data-toggle='tab' data-tooltip=true href='#instructions' role='tab' title=t('shared.tooltips.shortcut', shortcut: 'ALT + 1')
|
a data-placement='top' data-toggle='tab' data-tooltip=true href='#workspace' role='tab' title=t('shared.tooltips.shortcut', shortcut: 'ALT + 1')
|
||||||
i.fa.fa-question
|
|
||||||
= t('activerecord.attributes.exercise.instructions')
|
|
||||||
li
|
|
||||||
a data-placement='top' data-toggle='tab' data-tooltip=true href='#workspace' role='tab' title=t('shared.tooltips.shortcut', shortcut: 'ALT + 2')
|
|
||||||
i.fa.fa-code
|
i.fa.fa-code
|
||||||
= t('.workspace')
|
= t('.workspace')
|
||||||
li
|
li
|
||||||
a data-placement='top' data-toggle='tab' data-tooltip=true href='#outputInformation' role='tab' title=t('shared.tooltips.shortcut', shortcut: 'ALT + 3')
|
a data-placement='top' data-toggle='tab' data-tooltip=true href='#outputInformation' role='tab' title=t('shared.tooltips.shortcut', shortcut: 'ALT + 2')
|
||||||
i.fa.fa-terminal
|
i.fa.fa-terminal
|
||||||
= t('.output')
|
= t('.output')
|
||||||
li
|
li
|
||||||
a data-placement='top' data-toggle='tab' data-tooltip=true href='#progress' role='tab' title=t('shared.tooltips.shortcut', shortcut: 'ALT + 4')
|
a data-placement='top' data-toggle='tab' data-tooltip=true href='#progress' role='tab' title=t('shared.tooltips.shortcut', shortcut: 'ALT + 3')
|
||||||
i.fa.fa-line-chart
|
i.fa.fa-line-chart
|
||||||
= t('.progress')
|
= t('.progress')
|
||||||
|
|
||||||
hr
|
hr
|
||||||
|
|
||||||
.tab-content
|
.tab-content
|
||||||
#instructions.tab-pane.active
|
#workspace.tab-pane.active = render('editor', exercise: @exercise, files: @files, submission: @submission)
|
||||||
p = render_markdown(@exercise.instructions)
|
|
||||||
br
|
|
||||||
p.text-center
|
|
||||||
a#start.btn.btn-lg.btn-success
|
|
||||||
i.fa.fa-code
|
|
||||||
= t('.start')
|
|
||||||
#workspace.tab-pane = render('editor', exercise: @exercise, files: @files, submission: @submission)
|
|
||||||
#outputInformation.tab-pane data-message-no-output=t('.no_output')
|
#outputInformation.tab-pane data-message-no-output=t('.no_output')
|
||||||
#hint
|
#hint
|
||||||
.panel.panel-warning
|
.panel.panel-warning
|
||||||
.panel-heading = t('.hint')
|
.panel-heading = t('.hint')
|
||||||
.panel-body
|
.panel-body
|
||||||
.row
|
.row
|
||||||
|
/ #output-col1.col-sm-12
|
||||||
#output-col1
|
#output-col1
|
||||||
// todo set to full width if turtle isnt used
|
// todo set to full width if turtle isnt used
|
||||||
#prompt.input-group.hidden
|
#prompt.input-group.hidden
|
||||||
@ -62,7 +52,7 @@
|
|||||||
#output-col2.col-lg-5.col-md-5
|
#output-col2.col-lg-5.col-md-5
|
||||||
#turtlediv
|
#turtlediv
|
||||||
// todo what should the canvas default size be?
|
// todo what should the canvas default size be?
|
||||||
canvas#turtlecanvas.hidden style='border-style:solid;border-width:thin'
|
canvas#turtlecanvas.hidden width=400 height=400 style='border-style:solid;border-width:thin'
|
||||||
#progress.tab-pane
|
#progress.tab-pane
|
||||||
#results
|
#results
|
||||||
h2 = t('.results')
|
h2 = t('.results')
|
||||||
|
@ -14,6 +14,7 @@ h1
|
|||||||
= row(label: 'exercise.team', value: @exercise.team ? link_to(@exercise.team, @exercise.team) : nil)
|
= row(label: 'exercise.team', value: @exercise.team ? link_to(@exercise.team, @exercise.team) : nil)
|
||||||
= row(label: 'exercise.maximum_score', value: @exercise.maximum_score)
|
= row(label: 'exercise.maximum_score', value: @exercise.maximum_score)
|
||||||
= row(label: 'exercise.public', value: @exercise.public?)
|
= row(label: 'exercise.public', value: @exercise.public?)
|
||||||
|
= row(label: 'exercise.hide_file_tree', value: @exercise.hide_file_tree?)
|
||||||
= row(label: 'exercise.embedding_parameters') do
|
= row(label: 'exercise.embedding_parameters') do
|
||||||
= content_tag(:input, nil, class: 'form-control', readonly: true, value: embedding_parameters(@exercise))
|
= content_tag(:input, nil, class: 'form-control', readonly: true, value: embedding_parameters(@exercise))
|
||||||
|
|
||||||
|
@ -7,7 +7,9 @@ default: &default
|
|||||||
development:
|
development:
|
||||||
<<: *default
|
<<: *default
|
||||||
host: tcp://192.168.59.104:2376
|
host: tcp://192.168.59.104:2376
|
||||||
workspace_root: <%= File.join('/', 'shared', Rails.env) %>
|
ws_host: ws://192.168.59.104:2376
|
||||||
|
#workspace_root: <%= File.join('/', 'shared', Rails.env) %>
|
||||||
|
workspace_root: <%= Rails.root.join('tmp', 'files', Rails.env) %>
|
||||||
|
|
||||||
production:
|
production:
|
||||||
<<: *default
|
<<: *default
|
||||||
|
@ -28,6 +28,7 @@ de:
|
|||||||
execution_environment: Ausführungsumgebung
|
execution_environment: Ausführungsumgebung
|
||||||
execution_environment_id: Ausführungsumgebung
|
execution_environment_id: Ausführungsumgebung
|
||||||
files: Dateien
|
files: Dateien
|
||||||
|
hide_file_tree: Dateibaum verstecken
|
||||||
instructions: Anweisungen
|
instructions: Anweisungen
|
||||||
maximum_score: Erreichbare Punktzahl
|
maximum_score: Erreichbare Punktzahl
|
||||||
public: Öffentlich
|
public: Öffentlich
|
||||||
|
@ -28,6 +28,7 @@ en:
|
|||||||
execution_environment: Execution Environment
|
execution_environment: Execution Environment
|
||||||
execution_environment_id: Execution Environment
|
execution_environment_id: Execution Environment
|
||||||
files: Files
|
files: Files
|
||||||
|
hide_file_tree: Hide File Tree
|
||||||
instructions: Instructions
|
instructions: Instructions
|
||||||
maximum_score: Maximum Score
|
maximum_score: Maximum Score
|
||||||
public: Public
|
public: Public
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
class AddHideFileTreeToExercises < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :exercises, :hide_file_tree, :boolean
|
||||||
|
end
|
||||||
|
end
|
@ -11,7 +11,7 @@
|
|||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20150903152727) do
|
ActiveRecord::Schema.define(version: 20150922125415) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
@ -79,6 +79,7 @@ ActiveRecord::Schema.define(version: 20150903152727) do
|
|||||||
t.string "user_type"
|
t.string "user_type"
|
||||||
t.string "token"
|
t.string "token"
|
||||||
t.integer "team_id"
|
t.integer "team_id"
|
||||||
|
t.boolean "hide_file_tree"
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "external_users", force: true do |t|
|
create_table "external_users", force: true do |t|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
class PyUnitAdapter < TestingFrameworkAdapter
|
class PyUnitAdapter < TestingFrameworkAdapter
|
||||||
COUNT_REGEXP = /Ran (\d+) tests/
|
COUNT_REGEXP = /Ran (\d+) test/
|
||||||
FAILURES_REGEXP = /FAILED \(failures=(\d+)\)/
|
FAILURES_REGEXP = /FAILED \(failures=(\d+)\)/
|
||||||
|
|
||||||
def self.framework_name
|
def self.framework_name
|
||||||
|
@ -2,10 +2,11 @@ FROM ubuntu:14.04
|
|||||||
MAINTAINER "Martin v. Löwis"
|
MAINTAINER "Martin v. Löwis"
|
||||||
RUN locale-gen en_US.UTF-8
|
RUN locale-gen en_US.UTF-8
|
||||||
ENV LANG en_US.UTF-8
|
ENV LANG en_US.UTF-8
|
||||||
|
ENV PYTHONPATH $PYTHONPATH:/usr/lib/python3.4:/workspace
|
||||||
|
ENV PATH $PATH:/usr/lib/python3.4
|
||||||
ADD assess.py /usr/lib/python3.4/assess.py
|
ADD assess.py /usr/lib/python3.4/assess.py
|
||||||
ADD webpython.py /usr/lib/python3.4/webpython.py
|
ADD webpython.py /usr/lib/python3.4/webpython.py
|
||||||
RUN rm /usr/lib/python3.4/turtle.py
|
RUN rm /usr/lib/python3.4/turtle.py
|
||||||
ADD turtle.py /usr/lib/python3.4/turtle.py
|
ADD turtle.py /usr/lib/python3.4/turtle.py
|
||||||
RUN adduser --disabled-password --gecos Python python
|
RUN adduser --disabled-password --gecos Python python
|
||||||
USER python
|
USER python
|
||||||
WORKDIR /usr/lib/python3.4
|
|
||||||
|
Reference in New Issue
Block a user