lib/babel-polyfill/
lib/polyfills/
lib/emoji-data/
+lib/plist/
media/player/videojs/amd/src/video-lazy.js
media/player/videojs/amd/src/Youtube-lazy.js
media/player/videojs/videojs/
--- /dev/null
+# Primary donations pages.
+custom: ["https://moodle.com/donations/", moodle.org]
lib/babel-polyfill/
lib/polyfills/
lib/emoji-data/
+lib/plist/
media/player/videojs/amd/src/video-lazy.js
media/player/videojs/amd/src/Youtube-lazy.js
media/player/videojs/videojs/
# process (which uses our internal CI system) this file is here for the benefit
# of community developers git clones - see MDL-51458.
-sudo: required
-
# We currently disable Travis notifications entirely until https://github.com/travis-ci/travis-ci/issues/4976
# is fixed.
notifications:
language: php
+os: linux
+
dist: xenial
services:
php:
# We only run the highest and lowest supported versions to reduce the load on travis-ci.org.
- - 7.3
+ - 7.4
- 7.2
addons:
# Perform an upgrade test too.
- DB=pgsql TASK=UPGRADE
-matrix:
+jobs:
# Enable fast finish.
# This will fail the build if a single job fails (except those in allow_failures).
# It will not stop the jobs from running.
fast_finish: true
include:
- # Run mysql only on 7.3 - it's just too slow
- - php: 7.3
+ # Run mysql only on highest - it's just too slow
+ - php: 7.4
env: DB=mysqli TASK=PHPUNIT
- # Run grunt/npm install on highest version ('node' is an alias for the latest node.js version.)
- - php: 7.2
+ # Run grunt/npm install on highest version too ('node' is an alias for the latest node.js version.)
+ - php: 7.4
env: DB=none TASK=GRUNT NVM_VERSION='lts/carbon'
cache:
}
} else {
$newsettings = array();
- if (array_key_exists($componentprovidersetting, $form)) {
+ if (property_exists($form, $componentprovidersetting)) {
// We must be processing loggedin or loggedoff checkboxes.
// Store defained comma-separated processors as setting value.
// Using array_filter eliminates elements set to 0 above.
}
}
- $updateinfo .= $this->container_start('checkforupdates');
+ $updateinfo .= $this->container_start('checkforupdates mt-1');
$fetchurl = new moodle_url('/admin/index.php', array('fetchupdates' => 1, 'sesskey' => sesskey(), 'cache' => 0));
$updateinfo .= $this->single_button($fetchurl, get_string('checkforupdates', 'core_plugin'));
if ($fetch) {
*/
protected function moodle_available_update_info(\core\update\info $updateinfo) {
- $boxclasses = 'moodleupdateinfo';
+ $boxclasses = 'moodleupdateinfo mb-2';
$info = array();
if (isset($updateinfo->release)) {
}
if (isset($updateinfo->download)) {
- $info[] = html_writer::link($updateinfo->download, get_string('download'), array('class' => 'info download'));
+ $info[] = html_writer::link($updateinfo->download, get_string('download'),
+ array('class' => 'info download btn btn-secondary'));
}
if (isset($updateinfo->url)) {
array('class' => 'info more'));
}
- $box = $this->output->box_start($boxclasses);
- $box .= $this->output->box(implode(html_writer::tag('span', ' ', array('class' => 'separator')), $info), '');
- $box .= $this->output->box_end();
+ $box = $this->output->container_start($boxclasses);
+ $box .= $this->output->container(implode(html_writer::tag('span', ' | ', array('class' => 'separator')), $info), '');
+ $box .= $this->output->container_end();
return $box;
}
$temp = new admin_settingpage('experimentalsettings', new lang_string('experimentalsettings', 'admin'));
//TODO: Re-enable cc-import once re-implemented in 2.0.x
//$temp->add(new admin_setting_configcheckbox('enableimsccimport', new lang_string('enable_cc_import', 'imscc'), new lang_string('enable_cc_import_description', 'imscc'), 0));
- $temp->add(new admin_setting_configcheckbox('enablesafebrowserintegration', new lang_string('enablesafebrowserintegration', 'admin'), new lang_string('configenablesafebrowserintegration', 'admin'), 0));
$temp->add(new admin_setting_configcheckbox('dndallowtextandlinks', new lang_string('dndallowtextandlinks', 'admin'), new lang_string('configdndallowtextandlinks', 'admin'), 0));
$string['classname'] = 'Class name';
$string['component'] = 'Component';
-$string['configmessageinboundhost'] = 'The address of the server that Moodle should check mail against. To specify a non-default port, use [server]:[port], for example mail.example.com:587. If a port isn\'t specified, the default port for the type of mail server will be used.';
+$string['configmessageinboundhost'] = 'The address of the server that Moodle should check mail against. To specify a non-default port, use [server]:[port], for example mail.example.com:993. If a port isn\'t specified, the default port for the type of mail server will be used.';
$string['defaultexpiration'] = 'Default address expiry period';
$string['defaultexpiration_help'] = 'When an email address is generated by the handler, it can be set to automatically expire after a period of time, so that it can no longer be used. It is advisable to set an expiry period.';
$string['description'] = 'Description';
And I press "Yes"
And I should see "Recycle bin has been emptied"
And I should see "There are no items in the recycle bin."
+
+ @javascript
+ Scenario: Show recycle bin on category action menu
+ Given I log in as "admin"
+ And I navigate to "Courses > Manage courses and categories" in site administration
+ And I click on "Actions menu" "link"
+ And I click on "Recycle bin" "link"
+ Then I should see "There are no items in the recycle bin."
+
+ @javascript
+ Scenario: Not show recycle bin empty on category action menu whit autohide enable
+ Given I log in as "admin"
+ And the following config values are set as admin:
+ | categorybinenable | 0 | tool_recyclebin |
+ And I navigate to "Courses > Manage courses and categories" in site administration
+ And I click on "Actions menu" "link"
+ Then I should not see "Recycle bin"
+
+ @javascript
+ Scenario: Show recycle bin not empty on category action menu whit autohide enable
+ Given I log in as "admin"
+ And the following config values are set as admin:
+ | autohide | 1 | tool_recyclebin |
+ And I navigate to "Courses > Manage courses and categories" in site administration
+ And I click on "Actions menu" "link"
+ Then I should not see "Recycle bin"
+ And I click on "delete" action for "Course 2" in management course listing
+ And I press "Delete"
+ And I should see "Deleting C2"
+ And I should see "C2 has been completely deleted"
+ And I press "Continue"
+ When I click on "Actions menu" "link"
+ Then I should see "Recycle bin"
*/
$string['asap'] = 'ASAP';
-$string['adhocempty'] = 'Adhoc task queue is empty';
-$string['adhocqueuesize'] = 'Adhoc task queue has {$a} tasks';
+$string['adhocempty'] = 'Ad hoc task queue is empty';
+$string['adhocqueuesize'] = 'Ad hoc task queue has {$a} tasks';
$string['adhocqueueold'] = 'Oldest task is {$a->age} which is more than {$a->max}';
$string['backtoscheduledtasks'] = 'Back to scheduled tasks';
$string['blocking'] = 'Blocking';
$string['cannotfindthepathtothecli'] = 'Cannot find the path to the PHP CLI executable so task execution aborted. Set the \'Path to PHP CLI\' setting in Site administration / Server / System paths.';
-$string['checkadhocqueue'] = 'Adhoc task queue';
+$string['checkadhocqueue'] = 'Ad hoc task queue';
$string['checkcronrunning'] = 'Cron running';
$string['checkmaxfaildelay'] = 'Tasks max fail delay';
$string['clearfaildelay_confirm'] = 'Are you sure you want to clear the fail delay for task \'{$a}\'? After clearing the delay, the task will run according to its normal schedule.';
$string['scheduledtasks'] = 'Scheduled tasks';
$string['scheduledtaskchangesdisabled'] = 'Modifications to the list of scheduled tasks have been prevented in Moodle configuration';
$string['taskdisabled'] = 'Task disabled';
-$string['taskfailures'] = 'There are {$a} task(s) failing';
+$string['taskfailures'] = '{$a} task(s) failing';
$string['tasklogs'] = 'Task logs';
$string['tasknofailures'] = 'There are no tasks failing';
$string['taskscheduleday'] = 'Day';
return $this->errors;
}
+ /**
+ * Return array of valid fields for default values
+ *
+ * @return array
+ */
+ protected function get_valid_fields() {
+ return array_merge(self::$validfields, \tool_uploadcourse_helper::get_custom_course_field_names());
+ }
+
/**
* Assemble the course data based on defaults.
*
* @return array
*/
protected function get_final_create_data($data) {
- foreach (self::$validfields as $field) {
+ foreach ($this->get_valid_fields() as $field) {
if (!isset($data[$field]) && isset($this->defaults[$field])) {
$data[$field] = $this->defaults[$field];
}
global $DB;
$newdata = array();
$existingdata = $DB->get_record('course', array('shortname' => $this->shortname));
- foreach (self::$validfields as $field) {
+ foreach ($this->get_valid_fields() as $field) {
if ($missingonly) {
- if (!is_null($existingdata->$field) and $existingdata->$field !== '') {
+ if (isset($existingdata->$field) and $existingdata->$field !== '') {
continue;
}
}
$coursedata[$rolekey] = $rolename;
}
+ // Custom fields. If the course already exists and mode isn't set to force creation, we can use its context.
+ if ($exists && $mode !== tool_uploadcourse_processor::MODE_CREATE_ALL) {
+ $context = context_course::instance($coursedata['id']);
+ } else {
+ // The category ID is taken from the defaults if it exists, otherwise from course data.
+ $context = context_coursecat::instance($this->defaults['category'] ?? $coursedata['category']);
+ }
+ $customfielddata = tool_uploadcourse_helper::get_custom_course_field_data($this->rawdata, $this->defaults, $context,
+ $errors);
+ if (!empty($errors)) {
+ foreach ($errors as $key => $message) {
+ $this->error($key, $message);
+ }
+
+ return false;
+ }
+
+ foreach ($customfielddata as $name => $value) {
+ $coursedata[$name] = $value;
+ }
+
// Some validation.
if (!empty($coursedata['format']) && !in_array($coursedata['format'], tool_uploadcourse_helper::get_course_formats())) {
$this->error('invalidcourseformat', new lang_string('invalidcourseformat', 'tool_uploadcourse'));
return $rolenames;
}
+ /**
+ * Return array of all custom course fields indexed by their shortname
+ *
+ * @return \core_customfield\field_controller[]
+ */
+ public static function get_custom_course_fields(): array {
+ $result = [];
+
+ $fields = \core_course\customfield\course_handler::create()->get_fields();
+ foreach ($fields as $field) {
+ $result[$field->get('shortname')] = $field;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Return array of custom field element names
+ *
+ * @return string[]
+ */
+ public static function get_custom_course_field_names(): array {
+ $result = [];
+
+ $fields = self::get_custom_course_fields();
+ foreach ($fields as $field) {
+ $controller = \core_customfield\data_controller::create(0, null, $field);
+ $result[] = $controller->get_form_element_name();
+ }
+
+ return $result;
+ }
+
+ /**
+ * Return any elements from passed $data whose key matches one of the custom course fields defined for the site
+ *
+ * @param array $data
+ * @param array $defaults
+ * @param context $context
+ * @param array $errors Will be populated with any errors
+ * @return array
+ */
+ public static function get_custom_course_field_data(array $data, array $defaults, context $context,
+ array &$errors = []): array {
+
+ $fields = self::get_custom_course_fields();
+ $result = [];
+
+ $canchangelockedfields = guess_if_creator_will_have_course_capability('moodle/course:changelockedcustomfields', $context);
+
+ foreach ($data as $name => $originalvalue) {
+ if (preg_match('/^customfield_(?<name>.*)?$/', $name, $matches)
+ && isset($fields[$matches['name']])) {
+
+ $fieldname = $matches['name'];
+ $field = $fields[$fieldname];
+
+ // Skip field if it's locked and user doesn't have capability to change locked fields.
+ if ($field->get_configdata_property('locked') && !$canchangelockedfields) {
+ continue;
+ }
+
+ // Create field data controller.
+ $controller = \core_customfield\data_controller::create(0, null, $field);
+ $controller->set('id', 1);
+
+ $defaultvalue = $defaults["customfield_{$fieldname}"] ?? $controller->get_default_value();
+ $value = (empty($originalvalue) ? $defaultvalue : $field->parse_value($originalvalue));
+
+ // If we initially had a value, but now don't, then reset it to the default.
+ if (!empty($originalvalue) && empty($value)) {
+ $value = $defaultvalue;
+ }
+
+ // Validate data with controller.
+ $fieldformdata = [$controller->get_form_element_name() => $value];
+ $validationerrors = $controller->instance_form_validation($fieldformdata, []);
+ if (count($validationerrors) > 0) {
+ $errors['customfieldinvalid'] = new lang_string('customfieldinvalid', 'tool_uploadcourse',
+ $field->get_formatted_name());
+
+ continue;
+ }
+
+ $controller->set($controller->datafield(), $value);
+
+ // Pass an empty object to the data controller, which will transform it to a correct name/value pair.
+ $instance = new stdClass();
+ $controller->instance_form_before_set_data($instance);
+
+ $result = array_merge($result, (array) $instance);
+ }
+ }
+
+ return $result;
+ }
+
/**
* Helper to increment an ID number.
*
}
return $id;
}
-
-}
+}
\ No newline at end of file
$mform->addHelpButton('defaults[enablecompletion]', 'enablecompletion', 'completion');
}
+ // Add custom fields to the form.
+ $handler = \core_course\customfield\course_handler::create();
+ $handler->instance_form_definition($mform, 0, 'defaultvaluescustomfieldcategory', 'tool_uploadcourse');
+
// Hidden fields.
$mform->addElement('hidden', 'importid');
$mform->setType('importid', PARAM_INT);
$this->add_action_buttons(true, get_string('uploadcourses', 'tool_uploadcourse'));
+ // Prepare custom fields data.
+ $data = (object) $data;
+ $handler->instance_form_before_set_data($data);
+
$this->set_data($data);
}
$enddate = $format->get_default_course_enddate($mform, array('startdate' => 'defaults[startdate]'));
$mform->setDefault('defaults[enddate]', $enddate);
}
+
+ // Tweak the form with values provided by custom fields in use.
+ \core_course\customfield\course_handler::create()->instance_form_definition_after_data($mform);
}
/**
$errors['defaults[enddate]'] = get_string($errorcode, 'error');
}
+ // Custom fields validation.
+ array_merge($errors, \core_course\customfield\course_handler::create()->instance_form_validation($data, $files));
+
return $errors;
}
}
$options = (array) $form2data->options;
$defaults = (array) $form2data->defaults;
+ // Custom field defaults.
+ $customfields = tool_uploadcourse_helper::get_custom_course_field_names();
+ foreach ($customfields as $customfield) {
+ $defaults[$customfield] = $form2data->{$customfield};
+ }
+
// Restorefile deserves its own logic because formslib does not really appreciate
// when the name of a filepicker is an array...
$options['restorefile'] = '';
$string['csvfileerror'] = 'There is something wrong with the format of the CSV file. Please check the number of headings and columns match, and that the delimiter and file encoding are correct: {$a}';
$string['csvline'] = 'Line';
$string['defaultvalues'] = 'Default course values';
+$string['defaultvaluescustomfieldcategory'] = 'Default values for \'{$a}\'';
$string['encoding'] = 'Encoding';
$string['encoding_help'] = 'Encoding of the CSV file.';
$string['errorwhilerestoringcourse'] = 'Error while restoring the course';
$string['nochanges'] = 'No changes';
$string['pluginname'] = 'Course upload';
$string['preview'] = 'Preview';
+$string['customfieldinvalid'] = 'Custom field \'{$a}\' is empty or contains invalid data';
$string['reset'] = 'Reset course after upload';
$string['reset_help'] = 'Whether to reset the course after creating/updating it.';
$string['result'] = 'Result';
And I should see "Course 1"
And I should see "Course 2"
And I should see "Course 3"
+
+ @javascript
+ Scenario: Creation of new courses with custom fields
+ Given the following "custom field categories" exist:
+ | name | component | area | itemid |
+ | Other | core_course | course | 0 |
+ And the following "custom fields" exist:
+ | name | category | type | shortname | configdata |
+ | Field 1 | Other | checkbox | checkbox | |
+ | Field 2 | Other | date | date | |
+ | Field 3 | Other | select | select | {"options":"a\nb\nc"} |
+ | Field 4 | Other | text | text | |
+ | Field 5 | Other | textarea | textarea | |
+ When I upload "admin/tool/uploadcourse/tests/fixtures/courses_custom_fields.csv" file to "File" filemanager
+ And I set the field "Upload mode" to "Create new courses only, skip existing ones"
+ And I click on "Preview" "button"
+ And I click on "Upload courses" "button"
+ Then I should see "Course created"
+ And I should see "Courses created: 1"
+ And I am on site homepage
+ And I should see "Course fields 1"
+ And I should see "Field 1: Yes"
+ And I should see "Field 2: Tuesday, 1 October 2019, 2:00"
+ And I should see "Field 3: b"
+ And I should see "Field 4: Hello"
+ And I should see "Field 5: Goodbye"
+
+ @javascript
+ Scenario: Creation of new courses with custom fields using defaults
+ Given the following "custom field categories" exist:
+ | name | component | area | itemid |
+ | Other | core_course | course | 0 |
+ And the following "custom fields" exist:
+ | name | category | type | shortname | configdata |
+ | Field 1 | Other | checkbox | checkbox | {"checkbydefault":1} |
+ | Field 2 | Other | date | date | {"includetime":0} |
+ | Field 3 | Other | select | select | {"options":"a\nb\nc","defaultvalue":"b"} |
+ | Field 4 | Other | text | text | {"defaultvalue":"Hello"} |
+ | Field 5 | Other | textarea | textarea | {"defaultvalue":"Some text","defaultvalueformat":1} |
+ When I upload "admin/tool/uploadcourse/tests/fixtures/courses.csv" file to "File" filemanager
+ And I set the field "Upload mode" to "Create all, increment shortname if needed"
+ And I click on "Preview" "button"
+ And I expand all fieldsets
+ And the field "Field 1" matches value "1"
+ And the field "Field 3" matches value "b"
+ And the field "Field 4" matches value "Hello"
+ And the field "Field 5" matches value "Some text"
+ # We have to enable the date field manually.
+ And I set the following fields to these values:
+ | customfield_date[enabled] | 1 |
+ | customfield_date[day] | 1 |
+ | customfield_date[month] | June |
+ | customfield_date[year] | 2020 |
+ And I click on "Upload courses" "button"
+ Then I should see "Course created"
+ And I should see "Courses created: 3"
+ And I am on site homepage
+ And I should see "Course 1"
+ And I should see "Field 1: Yes"
+ And I should see "Field 2: 1 June 2020"
+ And I should see "Field 3: b"
+ And I should see "Field 4: Hello"
+ And I should see "Field 5: Some text"
\ No newline at end of file
Background:
Given the following "courses" exist:
| fullname | shortname | category |
- | Some random name | C1 | 0 |
+ | Some random name | C1 | 0 |
+ | Another course | CF1 | 0 |
And I log in as "admin"
And I navigate to "Courses > Upload courses" in site administration
And I should see "Course 1"
And I should not see "Course 2"
And I should not see "Course 3"
+
+ @javascript
+ Scenario: Updating a course with custom fields
+ Given the following "custom field categories" exist:
+ | name | component | area | itemid |
+ | Other | core_course | course | 0 |
+ And the following "custom fields" exist:
+ | name | category | type | shortname | configdata |
+ | Field 1 | Other | checkbox | checkbox | |
+ | Field 2 | Other | date | date | |
+ | Field 3 | Other | select | select | {"options":"a\nb\nc"} |
+ | Field 4 | Other | text | text | |
+ | Field 5 | Other | textarea | textarea | |
+ When I upload "admin/tool/uploadcourse/tests/fixtures/courses_custom_fields.csv" file to "File" filemanager
+ And I set the following fields to these values:
+ | Upload mode | Only update existing courses |
+ | Update mode | Update with CSV data only |
+ And I click on "Preview" "button"
+ And I click on "Upload courses" "button"
+ Then I should see "Course updated"
+ And I should see "Courses updated: 1"
+ And I am on site homepage
+ And I should see "Course fields 1"
+ And I should see "Field 1: Yes"
+ And I should see "Field 2: Tuesday, 1 October 2019, 2:00"
+ And I should see "Field 3: b"
+ And I should see "Field 4: Hello"
+ And I should see "Field 5: Goodbye"
\ No newline at end of file
$this->assertEquals(strtotime('12th July 2013'), $enroldata['manual']->enrolenddate);
}
+ /**
+ * Test upload processing of course custom fields
+ */
+ public function test_custom_fields_data() {
+ $this->resetAfterTest();
+ $this->setAdminUser();
+
+ $course = $this->getDataGenerator()->create_course(['shortname' => 'C1']);
+
+ // Create our custom fields.
+ $category = $this->get_customfield_generator()->create_category();
+ $this->create_custom_field($category, 'date', 'mydatefield');
+ $this->create_custom_field($category, 'text', 'mytextfield');
+ $this->create_custom_field($category, 'textarea', 'mytextareafield');
+
+ // Perform upload.
+ $mode = tool_uploadcourse_processor::MODE_UPDATE_ONLY;
+ $updatemode = tool_uploadcourse_processor::UPDATE_ALL_WITH_DATA_ONLY;
+ $dataupload = [
+ 'shortname' => $course->shortname,
+ 'customfield_mydatefield' => '2020-04-01 16:00',
+ 'customfield_mytextfield' => 'Hello',
+ 'customfield_mytextareafield' => 'Is it me you\'re looking for?',
+ ];
+
+ $uploader = new tool_uploadcourse_course($mode, $updatemode, $dataupload);
+ $this->assertTrue($uploader->prepare());
+ $uploader->proceed();
+
+ // Confirm presence of course custom fields.
+ $data = \core_course\customfield\course_handler::create()->export_instance_data_object($course->id);
+ $this->assertEquals('Wednesday, 1 April 2020, 4:00 PM', $data->mydatefield, '', 0.0, 10, false, true);
+ $this->assertEquals($dataupload['customfield_mytextfield'], $data->mytextfield);
+ $this->assertContains($dataupload['customfield_mytextareafield'], $data->mytextareafield);
+ }
+
+ /**
+ * Test upload processing of course custom field that is required but empty
+ */
+ public function test_custom_fields_data_required() {
+ $this->resetAfterTest();
+ $this->setAdminUser();
+
+ $course = $this->getDataGenerator()->create_course(['shortname' => 'C1']);
+
+ // Create our custom field.
+ $category = $this->get_customfield_generator()->create_category();
+ $this->create_custom_field($category, 'select', 'myselect', ['required' => true, 'options' => "Cat\nDog"]);
+
+ $mode = tool_uploadcourse_processor::MODE_UPDATE_ONLY;
+ $updatemode = tool_uploadcourse_processor::UPDATE_ALL_WITH_DATA_ONLY;
+ $dataupload = [
+ 'shortname' => $course->shortname,
+ 'customfield_myselect' => null,
+ ];
+
+ $uploader = new tool_uploadcourse_course($mode, $updatemode, $dataupload);
+ $this->assertFalse($uploader->prepare());
+ $this->assertArrayHasKey('customfieldinvalid', $uploader->get_errors());
+
+ // Try again with a default value.
+ $defaults = [
+ 'customfield_myselect' => 2, // Our second option: Dog.
+ ];
+
+ $uploader = new tool_uploadcourse_course($mode, $updatemode, $dataupload, $defaults);
+ $this->assertTrue($uploader->prepare());
+ $uploader->proceed();
+
+ // Confirm presence of course custom fields.
+ $data = \core_course\customfield\course_handler::create()->export_instance_data_object($course->id);
+ $this->assertEquals('Dog', $data->myselect);
+ }
+
+ /**
+ * Test upload processing of course custom field with an invalid select option
+ */
+ public function test_custom_fields_data_invalid_select_option() {
+ $this->resetAfterTest();
+ $this->setAdminUser();
+
+ $course = $this->getDataGenerator()->create_course(['shortname' => 'C1']);
+
+ // Create our custom field.
+ $category = $this->get_customfield_generator()->create_category();
+ $this->create_custom_field($category, 'select', 'myselect',
+ ['required' => true, 'options' => "Cat\nDog", 'defaultvalue' => 'Cat']);
+
+ $mode = tool_uploadcourse_processor::MODE_UPDATE_ONLY;
+ $updatemode = tool_uploadcourse_processor::UPDATE_ALL_WITH_DATA_ONLY;
+ $dataupload = [
+ 'shortname' => $course->shortname,
+ 'customfield_myselect' => 'Fish', // No, invalid.
+ ];
+
+ $uploader = new tool_uploadcourse_course($mode, $updatemode, $dataupload);
+ $this->assertTrue($uploader->prepare());
+ $uploader->proceed();
+
+ // Confirm presence of course custom fields.
+ $data = \core_course\customfield\course_handler::create()->export_instance_data_object($course->id);
+ $this->assertEquals('Cat', $data->myselect);
+ }
+
+ /**
+ * Test upload processing of course custom field with an out of range date
+ */
+ public function test_custom_fields_data_invalid_date() {
+ $this->resetAfterTest();
+ $this->setAdminUser();
+
+ $course = $this->getDataGenerator()->create_course(['shortname' => 'C1']);
+
+ // Create our custom field.
+ $category = $this->get_customfield_generator()->create_category();
+ $this->create_custom_field($category, 'date', 'mydate',
+ ['mindate' => strtotime('2020-04-01'), 'maxdate' => '2020-04-30']);
+
+ $mode = tool_uploadcourse_processor::MODE_UPDATE_ONLY;
+ $updatemode = tool_uploadcourse_processor::UPDATE_ALL_WITH_DATA_ONLY;
+ $dataupload = [
+ 'shortname' => $course->shortname,
+ 'customfield_mydate' => '2020-05-06', // Out of range.
+ ];
+
+ $uploader = new tool_uploadcourse_course($mode, $updatemode, $dataupload);
+ $this->assertFalse($uploader->prepare());
+ $this->assertArrayHasKey('customfieldinvalid', $uploader->get_errors());
+ }
+
public function test_idnumber_problems() {
$this->resetAfterTest(true);
$co = new tool_uploadcourse_course($mode, $updatemode, $data, array(), $importoptions);
$this->assertFalse($co->prepare());
$this->assertArrayHasKey('cannotrenameshortnamealreadyinuse', $co->get_errors());
+ }
+ /**
+ * Get custom field plugin generator
+ *
+ * @return core_customfield_generator
+ */
+ protected function get_customfield_generator() : core_customfield_generator {
+ return $this->getDataGenerator()->get_plugin_generator('core_customfield');
}
-}
+ /**
+ * Helper method to create custom course field
+ *
+ * @param \core_customfield\category_controller $category
+ * @param string $type
+ * @param string $shortname
+ * @param array $configdata
+ * @return \core_customfield\field_controller
+ */
+ protected function create_custom_field(\core_customfield\category_controller $category, string $type, string $shortname,
+ array $configdata = []) : \core_customfield\field_controller {
+
+ return $this->get_customfield_generator()->create_field([
+ 'categoryid' => $category->get('id'),
+ 'type' => $type,
+ 'shortname' => $shortname,
+ 'configdata' => $configdata,
+ ]);
+ }
+}
\ No newline at end of file
--- /dev/null
+shortname,fullname,summary,category,customfield_checkbox,customfield_date,customfield_select,customfield_text,customfield_textarea
+CF1,Course fields 1,Testing course fields,1,1,2019-10-01 14:00,b,Hello,Goodbye
\ No newline at end of file
$this->assertArrayHasKey('invalidroles', $errors);
}
+ /**
+ * Test custom field data processing
+ */
+ public function test_get_custom_course_field_data() {
+ global $DB;
+
+ $this->resetAfterTest();
+
+ // Create all the fields!
+ $category = $this->get_customfield_generator()->create_category();
+
+ $checkboxfield = $this->create_custom_field($category, 'checkbox', 'mycheckbox');
+ $datefield = $this->create_custom_field($category, 'date', 'mydate');
+ $selectfield = $this->create_custom_field($category, 'select', 'myselect', ['options' => "Red\nGreen\nBlue"]);
+ $textfield = $this->create_custom_field($category, 'text', 'mytext', ['locked' => 1]);
+ $textareafield = $this->create_custom_field($category, 'textarea', 'mytextarea');
+
+ $fields = tool_uploadcourse_helper::get_custom_course_fields();
+ $this->assertCount(5, $fields);
+
+ $this->assertArrayHasKey($checkboxfield->get('shortname'), $fields);
+ $this->assertInstanceOf(customfield_checkbox\field_controller::class, $fields[$checkboxfield->get('shortname')]);
+
+ $this->assertArrayHasKey($datefield->get('shortname'), $fields);
+ $this->assertInstanceOf(customfield_date\field_controller::class, $fields[$datefield->get('shortname')]);
+
+ $this->assertArrayHasKey($selectfield->get('shortname'), $fields);
+ $this->assertInstanceOf(customfield_select\field_controller::class, $fields[$selectfield->get('shortname')]);
+
+ $this->assertArrayHasKey($textfield->get('shortname'), $fields);
+ $this->assertInstanceOf(customfield_text\field_controller::class, $fields[$textfield->get('shortname')]);
+
+ $this->assertArrayHasKey($textareafield->get('shortname'), $fields);
+ $this->assertInstanceOf(customfield_textarea\field_controller::class, $fields[$textareafield->get('shortname')]);
+
+ $data = [
+ 'customfield_mycheckbox' => '1',
+ 'customfield_mydate' => '2019-10-01',
+ 'customfield_myselect' => 'Green',
+ 'customfield_mytext' => 'Hello',
+ 'customfield_myunknownfield' => 'Goodbye',
+ ];
+
+ $expected = [
+ 'customfield_mycheckbox' => '1',
+ 'customfield_mydate' => strtotime('2019-10-01'),
+ 'customfield_myselect' => 2,
+ 'customfield_mytext' => 'Hello',
+ ];
+
+ $course = $this->getDataGenerator()->create_course();
+ $user = $this->getDataGenerator()->create_and_enrol($course, 'manager');
+ $this->setUser($user);
+
+ $context = context_course::instance($course->id);
+
+ $this->assertEquals($expected, tool_uploadcourse_helper::get_custom_course_field_data($data, [], $context));
+
+ // Now add our custom textarea field (separately because the value of it's 'itemid' element is unknown).
+ $data['customfield_mytextarea'] = 'Something';
+ $fields = tool_uploadcourse_helper::get_custom_course_field_data($data, [], $context);
+ $this->assertArrayHasKey('customfield_mytextarea_editor', $fields);
+ $this->assertArrayHasKey('text', $fields['customfield_mytextarea_editor']);
+ $this->assertEquals('Something', $fields['customfield_mytextarea_editor']['text']);
+
+ // Now prohibit the capability to change locked fields for the manager role.
+ $managerrole = $DB->get_record('role', ['shortname' => 'manager']);
+ role_change_permission($managerrole->id, $context, 'moodle/course:changelockedcustomfields', CAP_PROHIBIT);
+
+ // The locked 'mytext' custom field should not be returned.
+ $fields = tool_uploadcourse_helper::get_custom_course_field_data($data, [], $context);
+ $this->assertCount(4, $fields);
+ $this->assertArrayNotHasKey('customfield_mytext', $fields);
+ }
+
public function test_increment_idnumber() {
$this->resetAfterTest(true);
$this->assertEquals($cat3_fakedouble->id, tool_uploadcourse_helper::resolve_category_by_path($path));
$this->assertEquals($cat3_fakedouble->id, tool_uploadcourse_helper::resolve_category_by_path($path));
}
-}
+
+ /**
+ * Get custom field plugin generator
+ *
+ * @return core_customfield_generator
+ */
+ protected function get_customfield_generator() : core_customfield_generator {
+ return $this->getDataGenerator()->get_plugin_generator('core_customfield');
+ }
+
+ /**
+ * Helper method to create custom course field
+ *
+ * @param \core_customfield\category_controller $category
+ * @param string $type
+ * @param string $shortname
+ * @param array $configdata
+ * @return \core_customfield\field_controller
+ */
+ protected function create_custom_field(\core_customfield\category_controller $category, string $type, string $shortname,
+ array $configdata = []) : \core_customfield\field_controller {
+
+ return $this->get_customfield_generator()->create_field([
+ 'categoryid' => $category->get('id'),
+ 'type' => $type,
+ 'shortname' => $shortname,
+ 'configdata' => $configdata,
+ ]);
+ }
+}
\ No newline at end of file
// Get needed strings
$this->loadStrings(array(
+ 'extraindexesfound' => 'tool_xmldb',
'missing' => 'tool_xmldb',
'key' => 'tool_xmldb',
'index' => 'tool_xmldb',
'missingindexes' => 'tool_xmldb',
- 'nomissingindexesfound' => 'tool_xmldb',
+ 'nomissingorextraindexesfound' => 'tool_xmldb',
+ 'yesextraindexesfound' => 'tool_xmldb',
'yesmissingindexesfound' => 'tool_xmldb',
));
}
$dbman = $DB->get_manager();
$o = '';
+ $dbindexes = $DB->get_indexes($xmldb_table->getName());
$missing_indexes = array();
// Keys
// Check if the index exists in DB
if ($dbman->index_exists($xmldb_table, $xmldb_index)) {
$o.='<font color="green">' . $this->str['ok'] . '</font>';
+ $this->remove_index_from_dbindex($dbindexes, $xmldb_index);
} else {
$o.='<font color="red">' . $this->str['missing'] . '</font>';
// Add the missing index to the list
// Check if the index exists in DB
if ($dbman->index_exists($xmldb_table, $xmldb_index)) {
$o.='<font color="green">' . $this->str['ok'] . '</font>';
+ $this->remove_index_from_dbindex($dbindexes, $xmldb_index);
} else {
$o.='<font color="red">' . $this->str['missing'] . '</font>';
// Add the missing index to the list
$o.=' </ul>';
}
+ // Hack - skip for table 'search_simpledb_index' as this plugin adds indexes dynamically on install
+ // which are not included in install.xml. See search/engine/simpledb/db/install.php.
+ if ($xmldb_table->getName() != 'search_simpledb_index') {
+ foreach ($dbindexes as $indexname => $index) {
+ $missing_indexes[] = $indexname;
+ }
+ }
+
return array($o, $missing_indexes);
}
global $DB;
$dbman = $DB->get_manager();
+ $missingindexes = [];
+ $extraindexes = [];
+
+ foreach ($missing_indexes as $missingindex) {
+ if (is_object($missingindex)) {
+ $missingindexes[] = $missingindex;
+ } else {
+ $extraindexes[] = $missingindex;
+ }
+ }
+
$s = '';
$r = '<table class="generaltable boxaligncenter boxwidthwide" border="0" cellpadding="5" cellspacing="0" id="results">';
$r.= ' <tr><td class="generalboxcontent">';
$r.= ' <h2 class="main">' . $this->str['searchresults'] . '</h2>';
- $r.= ' <p class="centerpara">' . $this->str['missingindexes'] . ': ' . count($missing_indexes) . '</p>';
+ $r .= ' <p class="centerpara">' . $this->str['missingindexes'] . ': ' . count($missingindexes) . '</p>';
+ $r .= ' <p class="centerpara">' . $this->str['extraindexesfound'] . ': ' . count($extraindexes) . '</p>';
$r.= ' </td></tr>';
$r.= ' <tr><td class="generalboxcontent">';
- // If we have found missing indexes inform about them
- if (count($missing_indexes)) {
- $r.= ' <p class="centerpara">' . $this->str['yesmissingindexesfound'] . '</p>';
- $r.= ' <ul>';
- foreach ($missing_indexes as $obj) {
- $xmldb_table = $obj->table;
- $xmldb_index = $obj->index;
- $sqlarr = $dbman->generator->getAddIndexSQL($xmldb_table, $xmldb_index);
- $r.= ' <li>' . $this->str['table'] . ': ' . $xmldb_table->getName() . '. ' .
- $this->str['index'] . ': ' . $xmldb_index->readableInfo() . '</li>';
- $sqlarr = $dbman->generator->getEndedStatements($sqlarr);
- $s.= '<code>' . str_replace("\n", '<br />', implode('<br />', $sqlarr)) . '</code><br />';
+ // If we have found missing indexes or extra indexes inform the user about them.
+ if (!empty($missingindexes) || !empty($extraindexes)) {
+ if ($missingindexes) {
+ $r.= ' <p class="centerpara">' . $this->str['yesmissingindexesfound'] . '</p>';
+ $r.= ' <ul>';
+ foreach ($missingindexes as $obj) {
+ $xmldb_table = $obj->table;
+ $xmldb_index = $obj->index;
+ $sqlarr = $dbman->generator->getAddIndexSQL($xmldb_table, $xmldb_index);
+ $r.= ' <li>' . $this->str['table'] . ': ' . $xmldb_table->getName() . '. ' .
+ $this->str['index'] . ': ' . $xmldb_index->readableInfo() . '</li>';
+ $sqlarr = $dbman->generator->getEndedStatements($sqlarr);
+ $s.= '<code>' . str_replace("\n", '<br />', implode('<br />', $sqlarr)) . '</code><br />';
+ }
+ $r.= ' </ul>';
+ // Add the SQL statements (all together)
+ $r.= '<hr />' . $s;
+ }
+ if ($extraindexes) {
+ $r .= '<p class="centerpara">' . $this->str['yesextraindexesfound'] . '</p>';
+ $r .= '<ul>';
+ foreach ($extraindexes as $ei) {
+ $r .= '<li>' . $ei . '</li>';
+ }
+ $r .= '</ul>';
+ $r .= '<hr />';
}
- $r.= ' </ul>';
- // Add the SQL statements (all together)
- $r.= '<hr />' . $s;
} else {
- $r.= ' <p class="centerpara">' . $this->str['nomissingindexesfound'] . '</p>';
+ $r .= '<p class="centerpara">' . $this->str['nomissingorextraindexesfound'] . '</p>';
}
$r.= ' </td></tr>';
$r.= ' <tr><td class="generalboxcontent">';
return $r;
}
+
+ /**
+ * Removes an index from the array $dbindexes if it is found.
+ *
+ * @param array $dbindexes
+ * @param xmldb_index $index
+ */
+ private function remove_index_from_dbindex(array &$dbindexes, xmldb_index $index) {
+ foreach ($dbindexes as $key => $dbindex) {
+ if ($dbindex['columns'] == $index->getFields()) {
+ unset($dbindexes[$key]);
+ }
+ }
+ }
}
$string['enumvaluesincorrect'] = 'Incorrect values for enum field';
$string['expected'] = 'Expected';
$string['extensionrequired'] = 'Sorry - the PHP extension \'{$a}\' is required for this action. Please install the extension if you want to use this feature.';
+$string['extraindexesfound'] = 'Extra indexes found';
$string['field'] = 'Field';
$string['fieldnameempty'] = 'Name field empty';
$string['fields'] = 'Fields';
$string['new_table_from_mysql'] = 'New table from MySQL';
$string['nofieldsspecified'] = 'No fields specified';
$string['nomasterprimaryuniquefound'] = 'The column(s) that your foreign key references must be included in a primary or unique KEY in the referenced table. Note that the column being in a UNIQUE INDEX is not good enough.';
-$string['nomissingindexesfound'] = 'No missing indexes have been found, your DB doesn\'t need further actions.';
+$string['nomissingorextraindexesfound'] = 'No missing or extra indexes have been found, so no further action is required.';
$string['noreffieldsspecified'] = 'No reference fields specified';
$string['noreftablespecified'] = 'Specified reference table not found';
$string['noviolatedforeignkeysfound'] = 'No violated foreign keys found';
$string['wrongnumberofreffields'] = 'Wrong number of reference fields';
$string['wrongreservedwords'] = 'Currently used reserved words<br />(note that table names aren\'t important if using $CFG->prefix)';
$string['wrongoraclesemantics'] = 'Wrong Oracle BYTE semantics found';
+$string['yesextraindexesfound'] = 'The following additional indexes were found.';
$string['yesmissingindexesfound'] = '<p>Some missing indexes have been found in your DB. Here are their details and the needed SQL statements to be executed with your favourite SQL interface to create all of them. Remember to backup your data first!</p>
<p>After doing that, it\'s highly recommended to execute this utility again to check that no more missing indexes are found.</p>';
$string['yeswrongdefaultsfound'] = '<p>Some inconsistent defaults have been found in your DB. Here are their details and the needed SQL statements to be executed with your favourite SQL interface to fix them all. Remember to backup your data first!</p>
define('NO_OUTPUT_BUFFERING', true);
require_once('../../config.php');
require_once($CFG->libdir.'/adminlib.php');
-require_once($CFG->libdir.'/dataformatlib.php');
require_once($CFG->dirroot.'/user/profile/lib.php');
$dataformat = optional_param('dataformat', '', PARAM_ALPHA);
$downloadusers = new ArrayObject($SESSION->bulk_users);
$iterator = $downloadusers->getIterator();
- download_as_dataformat($filename, $dataformat, $fields, $iterator, function($userid) use ($extrafields, $fields) {
+ \core\dataformat::download_data($filename, $dataformat, $fields, $iterator, function($userid) use ($extrafields, $fields) {
global $DB;
- $row = array();
+
if (!$user = $DB->get_record('user', array('id' => $userid))) {
return null;
}
| External URL | http://www.google.com |
| id_display | In pop-up |
Then "google" "link" should exist in the "Main menu" "block"
- And "Add an activity or resource" "button" should exist in the "Main menu" "block"
+ And "Add an activity" "button" should exist in the "Main menu" "block"
/**
* Ensure that the stats array is ready to collect information for the given store and definition.
* @param string $store
+ * @param string $storeclass
* @param string $definition A string that identifies the definition.
* @param int $mode One of cache_store::MODE_*. Since 2.9.
*/
- protected static function ensure_ready_for_stats($store, $definition, $mode = cache_store::MODE_APPLICATION) {
+ protected static function ensure_ready_for_stats($store, $storeclass, $definition, $mode = cache_store::MODE_APPLICATION) {
// This function is performance-sensitive, so exit as quickly as possible
// if we do not need to do anything.
if (isset(self::$stats[$definition]['stores'][$store])) {
return;
}
+
if (!array_key_exists($definition, self::$stats)) {
self::$stats[$definition] = array(
'mode' => $mode,
'stores' => array(
$store => array(
+ 'class' => $storeclass,
'hits' => 0,
'misses' => 0,
'sets' => 0,
);
} else if (!array_key_exists($store, self::$stats[$definition]['stores'])) {
self::$stats[$definition]['stores'][$store] = array(
+ 'class' => $storeclass,
'hits' => 0,
'misses' => 0,
'sets' => 0,
* In Moodle 2.9 the $definition argument changed from accepting only a string to accepting a string or a
* cache_definition instance. It is preferable to pass a cache definition instance.
*
+ * In Moodle 3.9 the first argument changed to also accept a cache_store.
+ *
* @internal
- * @param cache_definition $store
+ * @param string|cache_store $store
* @param cache_definition $definition You used to be able to pass a string here, however that is deprecated please pass the
* actual cache_definition object now.
* @param int $hits The number of hits to record (by default 1)
*/
public static function record_cache_hit($store, $definition, $hits = 1) {
+ $storeclass = '';
+ if ($store instanceof cache_store) {
+ $storeclass = get_class($store);
+ $store = $store->my_name();
+ }
list($definitionstr, $mode) = self::get_definition_stat_id_and_mode($definition);
- self::ensure_ready_for_stats($store, $definitionstr, $mode);
+ self::ensure_ready_for_stats($store, $storeclass, $definitionstr, $mode);
self::$stats[$definitionstr]['stores'][$store]['hits'] += $hits;
}
* In Moodle 2.9 the $definition argument changed from accepting only a string to accepting a string or a
* cache_definition instance. It is preferable to pass a cache definition instance.
*
+ * In Moodle 3.9 the first argument changed to also accept a cache_store.
+ *
* @internal
- * @param string $store
+ * @param string|cache_store $store
* @param cache_definition $definition You used to be able to pass a string here, however that is deprecated please pass the
* actual cache_definition object now.
* @param int $misses The number of misses to record (by default 1)
*/
public static function record_cache_miss($store, $definition, $misses = 1) {
+ $storeclass = '';
+ if ($store instanceof cache_store) {
+ $storeclass = get_class($store);
+ $store = $store->my_name();
+ }
list($definitionstr, $mode) = self::get_definition_stat_id_and_mode($definition);
- self::ensure_ready_for_stats($store, $definitionstr, $mode);
+ self::ensure_ready_for_stats($store, $storeclass, $definitionstr, $mode);
self::$stats[$definitionstr]['stores'][$store]['misses'] += $misses;
}
* In Moodle 2.9 the $definition argument changed from accepting only a string to accepting a string or a
* cache_definition instance. It is preferable to pass a cache definition instance.
*
+ * In Moodle 3.9 the first argument changed to also accept a cache_store.
+ *
* @internal
- * @param string $store
+ * @param string|cache_store $store
* @param cache_definition $definition You used to be able to pass a string here, however that is deprecated please pass the
* actual cache_definition object now.
* @param int $sets The number of sets to record (by default 1)
*/
public static function record_cache_set($store, $definition, $sets = 1) {
+ $storeclass = '';
+ if ($store instanceof cache_store) {
+ $storeclass = get_class($store);
+ $store = $store->my_name();
+ }
list($definitionstr, $mode) = self::get_definition_stat_id_and_mode($definition);
- self::ensure_ready_for_stats($store, $definitionstr, $mode);
+ self::ensure_ready_for_stats($store, $storeclass, $definitionstr, $mode);
self::$stats[$definitionstr]['stores'][$store]['sets'] += $sets;
}
$setaftervalidation = false;
if ($result === false) {
if ($this->perfdebug) {
- cache_helper::record_cache_miss($this->storetype, $this->definition);
+ cache_helper::record_cache_miss($this->store, $this->definition);
}
if ($this->loader !== false) {
// We must pass the original (unparsed) key to the next loader in the chain.
}
$setaftervalidation = ($result !== false);
} else if ($this->perfdebug) {
- cache_helper::record_cache_hit($this->storetype, $this->definition);
+ cache_helper::record_cache_hit($this->store, $this->definition);
}
// 5. Validate strictness.
if ($strictness === MUST_EXIST && $result === false) {
$hits++;
}
}
- cache_helper::record_cache_hit($this->storetype, $this->definition, $hits);
- cache_helper::record_cache_miss($this->storetype, $this->definition, $misses);
+ cache_helper::record_cache_hit($this->store, $this->definition, $hits);
+ cache_helper::record_cache_miss($this->store, $this->definition, $misses);
}
// Return the result. Phew!
*/
public function set($key, $data) {
if ($this->perfdebug) {
- cache_helper::record_cache_set($this->storetype, $this->definition);
+ cache_helper::record_cache_set($this->store, $this->definition);
}
if ($this->loader !== false) {
// We have a loader available set it there as well.
}
$successfullyset = $this->store->set_many($data);
if ($this->perfdebug && $successfullyset) {
- cache_helper::record_cache_set($this->storetype, $this->definition, $successfullyset);
+ cache_helper::record_cache_set($this->store, $this->definition, $successfullyset);
}
return $successfullyset;
}
}
if ($result !== false) {
if ($this->perfdebug) {
- cache_helper::record_cache_hit('** static acceleration **', $this->definition);
+ cache_helper::record_cache_hit(cache_store::STATIC_ACCEL, $this->definition);
}
if ($this->staticaccelerationsize > 1 && $this->staticaccelerationcount > 1) {
// Check to see if this is the last item on the static acceleration keys array.
return $result;
} else {
if ($this->perfdebug) {
- cache_helper::record_cache_miss('** static acceleration **', $this->definition);
+ cache_helper::record_cache_miss(cache_store::STATIC_ACCEL, $this->definition);
}
return false;
}
// 4. Load if from the loader/datasource if we don't already have it.
if ($result === false) {
if ($this->perfdebug) {
- cache_helper::record_cache_miss($this->storetype, $this->get_definition());
+ cache_helper::record_cache_miss($this->get_store(), $this->get_definition());
}
if ($this->get_loader() !== false) {
// We must pass the original (unparsed) key to the next loader in the chain.
$this->set($key, $result);
}
} else if ($this->perfdebug) {
- cache_helper::record_cache_hit($this->storetype, $this->get_definition());
+ cache_helper::record_cache_hit($this->get_store(), $this->get_definition());
}
// 5. Validate strictness.
if ($strictness === MUST_EXIST && $result === false) {
$loader->set($key, $data);
}
if ($this->perfdebug) {
- cache_helper::record_cache_set($this->storetype, $this->get_definition());
+ cache_helper::record_cache_set($this->get_store(), $this->get_definition());
}
if (is_object($data) && $data instanceof cacheable_object) {
$data = new cache_cached_object($data);
$hits++;
}
}
- cache_helper::record_cache_hit($this->storetype, $this->get_definition(), $hits);
- cache_helper::record_cache_miss($this->storetype, $this->get_definition(), $misses);
+ cache_helper::record_cache_hit($this->get_store(), $this->get_definition(), $hits);
+ cache_helper::record_cache_miss($this->get_store(), $this->get_definition(), $misses);
}
return $return;
}
$successfullyset = $this->get_store()->set_many($data);
if ($this->perfdebug && $successfullyset) {
- cache_helper::record_cache_set($this->storetype, $this->get_definition(), $successfullyset);
+ cache_helper::record_cache_set($this->store, $this->get_definition(), $successfullyset);
}
return $successfullyset;
}
* Request caches. Static caches really.
*/
const MODE_REQUEST = 4;
+ /**
+ * Static caches.
+ */
+ const STATIC_ACCEL = '** static accel. **';
/**
* Constructs an instance of the cache store.
$this->assertFalse($request->get('missMe'));
$endstats = cache_helper::get_stats();
- $this->assertEquals(2, $endstats[$applicationid]['stores']['cachestore_file']['misses']);
- $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['hits']);
- $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['sets']);
- $this->assertEquals(3, $endstats[$sessionid]['stores']['cachestore_session']['misses']);
- $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['hits']);
- $this->assertEquals(1, $endstats[$sessionid]['stores']['cachestore_session']['sets']);
- $this->assertEquals(4, $endstats[$requestid]['stores']['cachestore_static']['misses']);
- $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['hits']);
- $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['sets']);
+ $this->assertEquals(2, $endstats[$applicationid]['stores']['default_application']['misses']);
+ $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['hits']);
+ $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['sets']);
+ $this->assertEquals(3, $endstats[$sessionid]['stores']['default_session']['misses']);
+ $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['hits']);
+ $this->assertEquals(1, $endstats[$sessionid]['stores']['default_session']['sets']);
+ $this->assertEquals(4, $endstats[$requestid]['stores']['default_request']['misses']);
+ $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['hits']);
+ $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['sets']);
$startstats = cache_helper::get_stats();
$this->assertTrue($request->set('setMe4', 4));
$endstats = cache_helper::get_stats();
- $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['misses'] -
- $startstats[$applicationid]['stores']['cachestore_file']['misses']);
- $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['hits'] -
- $startstats[$applicationid]['stores']['cachestore_file']['hits']);
- $this->assertEquals(2, $endstats[$applicationid]['stores']['cachestore_file']['sets'] -
- $startstats[$applicationid]['stores']['cachestore_file']['sets']);
- $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['misses'] -
- $startstats[$sessionid]['stores']['cachestore_session']['misses']);
- $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['hits'] -
- $startstats[$sessionid]['stores']['cachestore_session']['hits']);
- $this->assertEquals(3, $endstats[$sessionid]['stores']['cachestore_session']['sets'] -
- $startstats[$sessionid]['stores']['cachestore_session']['sets']);
- $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['misses'] -
- $startstats[$requestid]['stores']['cachestore_static']['misses']);
- $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['hits'] -
- $startstats[$requestid]['stores']['cachestore_static']['hits']);
- $this->assertEquals(4, $endstats[$requestid]['stores']['cachestore_static']['sets'] -
- $startstats[$requestid]['stores']['cachestore_static']['sets']);
+ $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['misses'] -
+ $startstats[$applicationid]['stores']['default_application']['misses']);
+ $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['hits'] -
+ $startstats[$applicationid]['stores']['default_application']['hits']);
+ $this->assertEquals(2, $endstats[$applicationid]['stores']['default_application']['sets'] -
+ $startstats[$applicationid]['stores']['default_application']['sets']);
+ $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['misses'] -
+ $startstats[$sessionid]['stores']['default_session']['misses']);
+ $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['hits'] -
+ $startstats[$sessionid]['stores']['default_session']['hits']);
+ $this->assertEquals(3, $endstats[$sessionid]['stores']['default_session']['sets'] -
+ $startstats[$sessionid]['stores']['default_session']['sets']);
+ $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['misses'] -
+ $startstats[$requestid]['stores']['default_request']['misses']);
+ $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['hits'] -
+ $startstats[$requestid]['stores']['default_request']['hits']);
+ $this->assertEquals(4, $endstats[$requestid]['stores']['default_request']['sets'] -
+ $startstats[$requestid]['stores']['default_request']['sets']);
$startstats = cache_helper::get_stats();
$this->assertEquals($request->get('setMe4'), 4);
$endstats = cache_helper::get_stats();
- $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['misses'] -
- $startstats[$applicationid]['stores']['cachestore_file']['misses']);
- $this->assertEquals(2, $endstats[$applicationid]['stores']['cachestore_file']['hits'] -
- $startstats[$applicationid]['stores']['cachestore_file']['hits']);
- $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['sets'] -
- $startstats[$applicationid]['stores']['cachestore_file']['sets']);
- $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['misses'] -
- $startstats[$sessionid]['stores']['cachestore_session']['misses']);
- $this->assertEquals(3, $endstats[$sessionid]['stores']['cachestore_session']['hits'] -
- $startstats[$sessionid]['stores']['cachestore_session']['hits']);
- $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['sets'] -
- $startstats[$sessionid]['stores']['cachestore_session']['sets']);
- $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['misses'] -
- $startstats[$requestid]['stores']['cachestore_static']['misses']);
- $this->assertEquals(4, $endstats[$requestid]['stores']['cachestore_static']['hits'] -
- $startstats[$requestid]['stores']['cachestore_static']['hits']);
- $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['sets'] -
- $startstats[$requestid]['stores']['cachestore_static']['sets']);
+ $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['misses'] -
+ $startstats[$applicationid]['stores']['default_application']['misses']);
+ $this->assertEquals(2, $endstats[$applicationid]['stores']['default_application']['hits'] -
+ $startstats[$applicationid]['stores']['default_application']['hits']);
+ $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['sets'] -
+ $startstats[$applicationid]['stores']['default_application']['sets']);
+ $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['misses'] -
+ $startstats[$sessionid]['stores']['default_session']['misses']);
+ $this->assertEquals(3, $endstats[$sessionid]['stores']['default_session']['hits'] -
+ $startstats[$sessionid]['stores']['default_session']['hits']);
+ $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['sets'] -
+ $startstats[$sessionid]['stores']['default_session']['sets']);
+ $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['misses'] -
+ $startstats[$requestid]['stores']['default_request']['misses']);
+ $this->assertEquals(4, $endstats[$requestid]['stores']['default_request']['hits'] -
+ $startstats[$requestid]['stores']['default_request']['hits']);
+ $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['sets'] -
+ $startstats[$requestid]['stores']['default_request']['sets']);
$startstats = cache_helper::get_stats();
$request->get_many(array('setMe1', 'setMe2', 'setMe3', 'setMe4'));
$endstats = cache_helper::get_stats();
- $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['misses'] -
- $startstats[$applicationid]['stores']['cachestore_file']['misses']);
- $this->assertEquals(2, $endstats[$applicationid]['stores']['cachestore_file']['hits'] -
- $startstats[$applicationid]['stores']['cachestore_file']['hits']);
- $this->assertEquals(0, $endstats[$applicationid]['stores']['cachestore_file']['sets'] -
- $startstats[$applicationid]['stores']['cachestore_file']['sets']);
- $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['misses'] -
- $startstats[$sessionid]['stores']['cachestore_session']['misses']);
- $this->assertEquals(3, $endstats[$sessionid]['stores']['cachestore_session']['hits'] -
- $startstats[$sessionid]['stores']['cachestore_session']['hits']);
- $this->assertEquals(0, $endstats[$sessionid]['stores']['cachestore_session']['sets'] -
- $startstats[$sessionid]['stores']['cachestore_session']['sets']);
- $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['misses'] -
- $startstats[$requestid]['stores']['cachestore_static']['misses']);
- $this->assertEquals(4, $endstats[$requestid]['stores']['cachestore_static']['hits'] -
- $startstats[$requestid]['stores']['cachestore_static']['hits']);
- $this->assertEquals(0, $endstats[$requestid]['stores']['cachestore_static']['sets'] -
- $startstats[$requestid]['stores']['cachestore_static']['sets']);
+ $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['misses'] -
+ $startstats[$applicationid]['stores']['default_application']['misses']);
+ $this->assertEquals(2, $endstats[$applicationid]['stores']['default_application']['hits'] -
+ $startstats[$applicationid]['stores']['default_application']['hits']);
+ $this->assertEquals(0, $endstats[$applicationid]['stores']['default_application']['sets'] -
+ $startstats[$applicationid]['stores']['default_application']['sets']);
+ $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['misses'] -
+ $startstats[$sessionid]['stores']['default_session']['misses']);
+ $this->assertEquals(3, $endstats[$sessionid]['stores']['default_session']['hits'] -
+ $startstats[$sessionid]['stores']['default_session']['hits']);
+ $this->assertEquals(0, $endstats[$sessionid]['stores']['default_session']['sets'] -
+ $startstats[$sessionid]['stores']['default_session']['sets']);
+ $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['misses'] -
+ $startstats[$requestid]['stores']['default_request']['misses']);
+ $this->assertEquals(4, $endstats[$requestid]['stores']['default_request']['hits'] -
+ $startstats[$requestid]['stores']['default_request']['hits']);
+ $this->assertEquals(0, $endstats[$requestid]['stores']['default_request']['sets'] -
+ $startstats[$requestid]['stores']['default_request']['sets']);
}
public function test_static_cache() {
// Check that the static acceleration worked, even on empty arrays and the number 0.
$endstats = cache_helper::get_stats();
- $this->assertEquals(0, $endstats[$applicationid]['stores']['** static acceleration **']['misses']);
- $this->assertEquals(3, $endstats[$applicationid]['stores']['** static acceleration **']['hits']);
+ $this->assertEquals(0, $endstats[$applicationid]['stores']['** static accel. **']['misses']);
+ $this->assertEquals(3, $endstats[$applicationid]['stores']['** static accel. **']['hits']);
}
public function test_performance_debug_off() {
This files describes API changes in /cache/stores/* - cache store plugins.
Information provided here is intended especially for developers.
+=== 3.9 ===
+* The record_cache_hit/miss/set methods now take a cache_store instead of a cache_definition object
+
=== 3.8 ===
* The Redis cache store can now make use of the Zstandard compression algorithm (see MDL-66428).
* @return {Promise}
*/
function confirmDeletion(eventId, eventTitle, eventCount) {
+ var pendingPromise = new Pending('core_calendar/crud:confirmDeletion');
var deleteStrings = [
{
key: 'deleteevent',
return deleteModal;
})
+ .then(function(modal) {
+ pendingPromise.resolve();
+
+ return modal;
+ })
.catch(Notification.exception);
return finalPromise;
*/
var ModalDelete = function(root) {
Modal.call(this, root);
+
+ this.setRemoveOnClose(true);
};
ModalDelete.TYPE = 'core_calendar-modal_delete';
"require-dev": {
"phpunit/phpunit": "7.5.*",
"phpunit/dbunit": "4.0.*",
- "moodlehq/behat-extension": "3.39.1",
+ "moodlehq/behat-extension": "3.39.3",
"mikey179/vfsstream": "^1.6",
"instaclick/php-webdriver": "dev-local as 1.x-dev"
}
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "7d4095e9af1e9ef59e2a74273a5c55b2",
+ "content-hash": "b1953ceec577434625a7aee12f650daa",
"packages": [],
"packages-dev": [
{
"name": "behat/behat",
- "version": "v3.5.0",
+ "version": "v3.6.1",
"source": {
"type": "git",
"url": "https://github.com/Behat/Behat.git",
- "reference": "e4bce688be0c2029dc1700e46058d86428c63cab"
+ "reference": "9bfe195b4745c32e068af03fa4df9558b4916d30"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Behat/Behat/zipball/e4bce688be0c2029dc1700e46058d86428c63cab",
- "reference": "e4bce688be0c2029dc1700e46058d86428c63cab",
+ "url": "https://api.github.com/repos/Behat/Behat/zipball/9bfe195b4745c32e068af03fa4df9558b4916d30",
+ "reference": "9bfe195b4745c32e068af03fa4df9558b4916d30",
"shasum": ""
},
"require": {
- "behat/gherkin": "^4.5.1",
+ "behat/gherkin": "^4.6.0",
"behat/transliterator": "^1.2",
"container-interop/container-interop": "^1.2",
"ext-mbstring": "*",
"php": ">=5.3.3",
"psr/container": "^1.0",
- "symfony/class-loader": "~2.1||~3.0",
- "symfony/config": "~2.3||~3.0||~4.0",
- "symfony/console": "~2.7.40||^2.8.33||~3.3.15||^3.4.3||^4.0.3",
- "symfony/dependency-injection": "~2.1||~3.0||~4.0",
- "symfony/event-dispatcher": "~2.1||~3.0||~4.0",
- "symfony/translation": "~2.3||~3.0||~4.0",
- "symfony/yaml": "~2.1||~3.0||~4.0"
+ "symfony/config": "^2.7.51 || ^3.0 || ^4.0 || ^5.0",
+ "symfony/console": "^2.7.51 || ^2.8.33 || ^3.3.15 || ^3.4.3 || ^4.0.3 || ^5.0",
+ "symfony/dependency-injection": "^2.7.51 || ^3.0 || ^4.0 || ^5.0",
+ "symfony/event-dispatcher": "^2.7.51 || ^3.0 || ^4.0 || ^5.0",
+ "symfony/translation": "^2.7.51 || ^3.0 || ^4.0 || ^5.0",
+ "symfony/yaml": "^2.7.51 || ^3.0 || ^4.0 || ^5.0"
},
"require-dev": {
"herrera-io/box": "~1.6.1",
- "phpunit/phpunit": "^4.8.36|^6.3",
- "symfony/process": "~2.5|~3.0|~4.0"
+ "phpunit/phpunit": "^4.8.36 || ^6.3",
+ "symfony/process": "~2.5 || ^3.0 || ^4.0 || ^5.0"
+ },
+ "suggest": {
+ "ext-dom": "Needed to output test results in JUnit format."
},
"bin": [
"bin/behat"
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.5.x-dev"
+ "dev-master": "3.6.x-dev"
}
},
"autoload": {
- "psr-0": {
- "Behat\\Behat": "src/",
- "Behat\\Testwork": "src/"
+ "psr-4": {
+ "Behat\\Behat\\": "src/Behat/Behat/",
+ "Behat\\Testwork\\": "src/Behat/Testwork/"
}
},
"notification-url": "https://packagist.org/downloads/",
"symfony",
"testing"
],
- "time": "2018-08-10T18:56:51+00:00"
+ "time": "2020-02-06T09:54:48+00:00"
},
{
"name": "behat/gherkin",
- "version": "v4.6.0",
+ "version": "v4.6.2",
"source": {
"type": "git",
"url": "https://github.com/Behat/Gherkin.git",
- "reference": "ab0a02ea14893860bca00f225f5621d351a3ad07"
+ "reference": "51ac4500c4dc30cbaaabcd2f25694299df666a31"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Behat/Gherkin/zipball/ab0a02ea14893860bca00f225f5621d351a3ad07",
- "reference": "ab0a02ea14893860bca00f225f5621d351a3ad07",
+ "url": "https://api.github.com/repos/Behat/Gherkin/zipball/51ac4500c4dc30cbaaabcd2f25694299df666a31",
+ "reference": "51ac4500c4dc30cbaaabcd2f25694299df666a31",
"shasum": ""
},
"require": {
"gherkin",
"parser"
],
- "time": "2019-01-16T14:22:17+00:00"
+ "time": "2020-03-17T14:03:26+00:00"
},
{
"name": "behat/mink",
- "version": "v1.7.1",
+ "version": "v1.8.1",
"source": {
"type": "git",
"url": "https://github.com/minkphp/Mink.git",
- "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9"
+ "reference": "07c6a9fe3fa98c2de074b25d9ed26c22904e3887"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/minkphp/Mink/zipball/e6930b9c74693dff7f4e58577e1b1743399f3ff9",
- "reference": "e6930b9c74693dff7f4e58577e1b1743399f3ff9",
+ "url": "https://api.github.com/repos/minkphp/Mink/zipball/07c6a9fe3fa98c2de074b25d9ed26c22904e3887",
+ "reference": "07c6a9fe3fa98c2de074b25d9ed26c22904e3887",
"shasum": ""
},
"require": {
"php": ">=5.3.1",
- "symfony/css-selector": "~2.1|~3.0"
+ "symfony/css-selector": "^2.7|^3.0|^4.0|^5.0"
},
"require-dev": {
- "symfony/phpunit-bridge": "~2.7|~3.0"
+ "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20",
+ "symfony/debug": "^2.7|^3.0|^4.0",
+ "symfony/phpunit-bridge": "^3.4.38 || ^5.0.5"
},
"suggest": {
"behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)",
"behat/mink-goutte-driver": "fast headless driver for any app without JS emulation",
"behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)",
- "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)"
+ "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)",
+ "dmore/chrome-mink-driver": "fast and JS-enabled driver for any app (requires chromium or google chrome)"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.7.x-dev"
+ "dev-master": "1.8.x-dev"
}
},
"autoload": {
"testing",
"web"
],
- "time": "2016-03-05T08:26:18+00:00"
+ "time": "2020-03-11T15:45:53+00:00"
},
{
"name": "behat/mink-browserkit-driver",
- "version": "1.3.3",
+ "version": "v1.3.4",
"source": {
"type": "git",
"url": "https://github.com/minkphp/MinkBrowserKitDriver.git",
- "reference": "1b9a7ce903cfdaaec5fb32bfdbb26118343662eb"
+ "reference": "e3b90840022ebcd544c7b394a3c9597ae242cbee"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/1b9a7ce903cfdaaec5fb32bfdbb26118343662eb",
- "reference": "1b9a7ce903cfdaaec5fb32bfdbb26118343662eb",
+ "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/e3b90840022ebcd544c7b394a3c9597ae242cbee",
+ "reference": "e3b90840022ebcd544c7b394a3c9597ae242cbee",
"shasum": ""
},
"require": {
},
"require-dev": {
"mink/driver-testsuite": "dev-master",
+ "symfony/debug": "^2.7|^3.0|^4.0",
"symfony/http-kernel": "~2.3|~3.0|~4.0"
},
"type": "mink-driver",
"browser",
"testing"
],
- "time": "2018-05-02T09:25:31+00:00"
+ "time": "2020-03-11T09:49:45+00:00"
},
{
"name": "behat/mink-extension",
},
{
"name": "behat/mink-selenium2-driver",
- "version": "v1.3.1",
+ "version": "v1.4.0",
"source": {
"type": "git",
"url": "https://github.com/minkphp/MinkSelenium2Driver.git",
- "reference": "473a9f3ebe0c134ee1e623ce8a9c852832020288"
+ "reference": "312a967dd527f28980cce40850339cd5316da092"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/473a9f3ebe0c134ee1e623ce8a9c852832020288",
- "reference": "473a9f3ebe0c134ee1e623ce8a9c852832020288",
+ "url": "https://api.github.com/repos/minkphp/MinkSelenium2Driver/zipball/312a967dd527f28980cce40850339cd5316da092",
+ "reference": "312a967dd527f28980cce40850339cd5316da092",
"shasum": ""
},
"require": {
"behat/mink": "~1.7@dev",
"instaclick/php-webdriver": "~1.1",
- "php": ">=5.3.1"
+ "php": ">=5.4"
},
"require-dev": {
- "symfony/phpunit-bridge": "~2.7"
+ "mink/driver-testsuite": "dev-master"
},
"type": "mink-driver",
"extra": {
"branch-alias": {
- "dev-master": "1.3.x-dev"
+ "dev-master": "1.4.x-dev"
}
},
"autoload": {
"MIT"
],
"authors": [
- {
- "name": "Konstantin Kudryashov",
- "email": "ever.zet@gmail.com",
- "homepage": "http://everzet.com"
- },
{
"name": "Pete Otaqui",
"email": "pete@otaqui.com",
"homepage": "https://github.com/pete-otaqui"
+ },
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
}
],
"description": "Selenium2 (WebDriver) driver for Mink framework",
"testing",
"webdriver"
],
- "time": "2016-03-05T09:10:18+00:00"
+ "time": "2020-03-11T14:43:21+00:00"
},
{
"name": "behat/transliterator",
- "version": "v1.2.0",
+ "version": "v1.3.0",
"source": {
"type": "git",
"url": "https://github.com/Behat/Transliterator.git",
- "reference": "826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c"
+ "reference": "3c4ec1d77c3d05caa1f0bf8fb3aae4845005c7fc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c",
- "reference": "826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c",
+ "url": "https://api.github.com/repos/Behat/Transliterator/zipball/3c4ec1d77c3d05caa1f0bf8fb3aae4845005c7fc",
+ "reference": "3c4ec1d77c3d05caa1f0bf8fb3aae4845005c7fc",
"shasum": ""
},
"require": {
},
"require-dev": {
"chuyskywalker/rolling-curl": "^3.1",
- "php-yaoi/php-yaoi": "^1.0"
+ "php-yaoi/php-yaoi": "^1.0",
+ "phpunit/phpunit": "^4.8.36|^6.3"
},
"type": "library",
"extra": {
}
},
"autoload": {
- "psr-0": {
- "Behat\\Transliterator": "src/"
+ "psr-4": {
+ "Behat\\Transliterator\\": "src/Behat/Transliterator"
}
},
"notification-url": "https://packagist.org/downloads/",
"slug",
"transliterator"
],
- "time": "2017-04-04T11:38:05+00:00"
+ "time": "2020-01-14T16:39:13+00:00"
},
{
"name": "container-interop/container-interop",
},
{
"name": "fabpot/goutte",
- "version": "v3.2.3",
+ "version": "v3.3.0",
"source": {
"type": "git",
"url": "https://github.com/FriendsOfPHP/Goutte.git",
- "reference": "3f0eaf0a40181359470651f1565b3e07e3dd31b8"
+ "reference": "4ab5199e3ec0ffde0ee0b5ecf568a4fb8398dbae"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/3f0eaf0a40181359470651f1565b3e07e3dd31b8",
- "reference": "3f0eaf0a40181359470651f1565b3e07e3dd31b8",
+ "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/4ab5199e3ec0ffde0ee0b5ecf568a4fb8398dbae",
+ "reference": "4ab5199e3ec0ffde0ee0b5ecf568a4fb8398dbae",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "^6.0",
- "php": ">=5.5.0",
- "symfony/browser-kit": "~2.1|~3.0|~4.0",
- "symfony/css-selector": "~2.1|~3.0|~4.0",
- "symfony/dom-crawler": "~2.1|~3.0|~4.0"
+ "php": "^7.1.3",
+ "symfony/browser-kit": "^4.4|^5.0",
+ "symfony/css-selector": "^4.4|^5.0",
+ "symfony/dom-crawler": "^4.4|^5.0"
},
"require-dev": {
- "symfony/phpunit-bridge": "^3.3 || ^4"
+ "symfony/phpunit-bridge": "^5.0"
},
"type": "application",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
"keywords": [
"scraper"
],
- "time": "2018-06-29T15:13:57+00:00"
+ "time": "2019-12-06T13:11:18+00:00"
},
{
"name": "guzzlehttp/guzzle",
- "version": "6.5.0",
+ "version": "6.5.3",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "dbc2bc3a293ed6b1ae08a3651e2bfd213d19b6a5"
+ "reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/dbc2bc3a293ed6b1ae08a3651e2bfd213d19b6a5",
- "reference": "dbc2bc3a293ed6b1ae08a3651e2bfd213d19b6a5",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/aab4ebd862aa7d04f01a4b51849d657db56d882e",
+ "reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^1.0",
"guzzlehttp/psr7": "^1.6.1",
- "php": ">=5.5"
+ "php": ">=5.5",
+ "symfony/polyfill-intl-idn": "^1.11"
},
"require-dev": {
"ext-curl": "*",
"psr/log": "^1.1"
},
"suggest": {
- "ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware"
},
"type": "library",
"rest",
"web service"
],
- "time": "2019-12-07T18:20:45+00:00"
+ "time": "2020-04-18T10:38:46+00:00"
},
{
"name": "guzzlehttp/promises",
},
{
"name": "moodlehq/behat-extension",
- "version": "v3.39.1",
+ "version": "v3.39.3",
"source": {
"type": "git",
"url": "https://github.com/moodlehq/moodle-behat-extension.git",
- "reference": "e61855d292200e7d324241f49ae4c03bad607e70"
+ "reference": "d05ea443ff24f90edb9b31c92e4dfe67c58a0b4b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/moodlehq/moodle-behat-extension/zipball/e61855d292200e7d324241f49ae4c03bad607e70",
- "reference": "e61855d292200e7d324241f49ae4c03bad607e70",
+ "url": "https://api.github.com/repos/moodlehq/moodle-behat-extension/zipball/d05ea443ff24f90edb9b31c92e4dfe67c58a0b4b",
+ "reference": "d05ea443ff24f90edb9b31c92e4dfe67c58a0b4b",
"shasum": ""
},
"require": {
- "behat/behat": "3.5.*",
- "behat/mink": "~1.7",
- "behat/mink-extension": "~2.2",
+ "behat/behat": "3.6.*",
+ "behat/mink": "~1.8",
+ "behat/mink-extension": "~2.3",
"behat/mink-goutte-driver": "~1.2",
- "behat/mink-selenium2-driver": "~1.3",
+ "behat/mink-selenium2-driver": "~1.4",
"php": ">=7.2.0",
- "symfony/process": "2.8.*"
+ "symfony/process": "^4.0 || ^5.0"
},
"type": "library",
"autoload": {
"Behat",
"moodle"
],
- "time": "2019-12-05T23:18:23+00:00"
+ "time": "2020-04-20T09:32:44+00:00"
},
{
"name": "myclabs/deep-copy",
- "version": "1.9.4",
+ "version": "1.9.5",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "579bb7356d91f9456ccd505f24ca8b667966a0a7"
+ "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/579bb7356d91f9456ccd505f24ca8b667966a0a7",
- "reference": "579bb7356d91f9456ccd505f24ca8b667966a0a7",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef",
+ "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef",
"shasum": ""
},
"require": {
"object",
"object graph"
],
- "time": "2019-12-15T19:12:40+00:00"
+ "time": "2020-01-17T21:11:47+00:00"
},
{
"name": "phar-io/manifest",
},
{
"name": "phpdocumentor/reflection-docblock",
- "version": "4.3.2",
+ "version": "5.1.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e"
+ "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/b83ff7cfcfee7827e1e78b637a5904fe6a96698e",
- "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
+ "reference": "cd72d394ca794d3466a3b2fc09d5a6c1dc86b47e",
"shasum": ""
},
"require": {
- "php": "^7.0",
- "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0",
- "phpdocumentor/type-resolver": "~0.4 || ^1.0.0",
- "webmozart/assert": "^1.0"
+ "ext-filter": "^7.1",
+ "php": "^7.2",
+ "phpdocumentor/reflection-common": "^2.0",
+ "phpdocumentor/type-resolver": "^1.0",
+ "webmozart/assert": "^1"
},
"require-dev": {
- "doctrine/instantiator": "^1.0.5",
- "mockery/mockery": "^1.0",
- "phpunit/phpunit": "^6.4"
+ "doctrine/instantiator": "^1",
+ "mockery/mockery": "^1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.x-dev"
+ "dev-master": "5.x-dev"
}
},
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": [
- "src/"
- ]
+ "phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
{
"name": "Mike van Riel",
"email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "account@ijaap.nl"
}
],
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
- "time": "2019-09-12T14:27:41+00:00"
+ "time": "2020-02-22T12:28:44+00:00"
},
{
"name": "phpdocumentor/type-resolver",
- "version": "1.0.1",
+ "version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9"
+ "reference": "7462d5f123dfc080dfdf26897032a6513644fc95"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
- "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/7462d5f123dfc080dfdf26897032a6513644fc95",
+ "reference": "7462d5f123dfc080dfdf26897032a6513644fc95",
"shasum": ""
},
"require": {
- "php": "^7.1",
+ "php": "^7.2",
"phpdocumentor/reflection-common": "^2.0"
},
"require-dev": {
- "ext-tokenizer": "^7.1",
- "mockery/mockery": "~1",
- "phpunit/phpunit": "^7.0"
+ "ext-tokenizer": "^7.2",
+ "mockery/mockery": "~1"
},
"type": "library",
"extra": {
}
],
"description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
- "time": "2019-08-22T18:11:29+00:00"
+ "time": "2020-02-18T18:59:58+00:00"
},
{
"name": "phpspec/prophecy",
- "version": "1.10.0",
+ "version": "v1.10.3",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
- "reference": "d638ebbb58daba25a6a0dc7969e1358a0e3c6682"
+ "reference": "451c3cd1418cf640de218914901e51b064abb093"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d638ebbb58daba25a6a0dc7969e1358a0e3c6682",
- "reference": "d638ebbb58daba25a6a0dc7969e1358a0e3c6682",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
+ "reference": "451c3cd1418cf640de218914901e51b064abb093",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.0.2",
"php": "^5.3|^7.0",
"phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
- "sebastian/comparator": "^1.2.3|^2.0|^3.0",
- "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+ "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
},
"require-dev": {
"phpspec/phpspec": "^2.5 || ^3.2",
"spy",
"stub"
],
- "time": "2019-12-17T16:54:23+00:00"
+ "time": "2020-03-05T15:02:03+00:00"
},
{
"name": "phpunit/dbunit",
},
{
"name": "phpunit/phpunit",
- "version": "7.5.18",
+ "version": "7.5.20",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "fcf6c4bfafaadc07785528b06385cce88935474d"
+ "reference": "9467db479d1b0487c99733bb1e7944d32deded2c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fcf6c4bfafaadc07785528b06385cce88935474d",
- "reference": "fcf6c4bfafaadc07785528b06385cce88935474d",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9467db479d1b0487c99733bb1e7944d32deded2c",
+ "reference": "9467db479d1b0487c99733bb1e7944d32deded2c",
"shasum": ""
},
"require": {
"testing",
"xunit"
],
- "time": "2019-12-06T05:14:37+00:00"
+ "time": "2020-01-08T08:45:45+00:00"
},
{
"name": "psr/container",
"time": "2017-02-14T16:28:37+00:00"
},
{
- "name": "psr/http-message",
- "version": "1.0.1",
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/http-message.git",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
- "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "php": ">=7.2.0"
},
"type": "library",
"extra": {
},
"autoload": {
"psr-4": {
- "Psr\\Http\\Message\\": "src/"
+ "Psr\\EventDispatcher\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"homepage": "http://www.php-fig.org/"
}
],
- "description": "Common interface for HTTP messages",
- "homepage": "https://github.com/php-fig/http-message",
+ "description": "Standard interfaces for event handling.",
"keywords": [
- "http",
- "http-message",
+ "events",
"psr",
- "psr-7",
- "request",
- "response"
+ "psr-14"
],
- "time": "2016-08-06T14:39:51+00:00"
+ "time": "2019-01-08T18:20:26+00:00"
},
{
- "name": "psr/log",
- "version": "1.1.2",
+ "name": "psr/http-message",
+ "version": "1.0.1",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
- "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
"shasum": ""
},
"require": {
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1.x-dev"
+ "dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
- "Psr\\Log\\": "Psr/Log/"
+ "Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"homepage": "http://www.php-fig.org/"
}
],
- "description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
"keywords": [
- "log",
+ "http",
+ "http-message",
"psr",
- "psr-3"
+ "psr-7",
+ "request",
+ "response"
],
- "time": "2019-11-01T11:05:21+00:00"
+ "time": "2016-08-06T14:39:51+00:00"
},
{
"name": "ralouphie/getallheaders",
},
{
"name": "symfony/browser-kit",
- "version": "v4.4.1",
+ "version": "v4.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/browser-kit.git",
- "reference": "e19e465c055137938afd40cfddd687e7511bbbf0"
+ "reference": "e4b0dc1b100bf75b5717c5b451397f230a618a42"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/browser-kit/zipball/e19e465c055137938afd40cfddd687e7511bbbf0",
- "reference": "e19e465c055137938afd40cfddd687e7511bbbf0",
+ "url": "https://api.github.com/repos/symfony/browser-kit/zipball/e4b0dc1b100bf75b5717c5b451397f230a618a42",
+ "reference": "e4b0dc1b100bf75b5717c5b451397f230a618a42",
"shasum": ""
},
"require": {
],
"description": "Symfony BrowserKit Component",
"homepage": "https://symfony.com",
- "time": "2019-10-28T20:30:34+00:00"
- },
- {
- "name": "symfony/class-loader",
- "version": "v3.4.36",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/class-loader.git",
- "reference": "e212b06996819a2bce026a63da03b7182d05a690"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/class-loader/zipball/e212b06996819a2bce026a63da03b7182d05a690",
- "reference": "e212b06996819a2bce026a63da03b7182d05a690",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9|>=7.0.8"
- },
- "require-dev": {
- "symfony/finder": "~2.8|~3.0|~4.0",
- "symfony/polyfill-apcu": "~1.1"
- },
- "suggest": {
- "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.4-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\ClassLoader\\": ""
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
},
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "url": "https://github.com/fabpot",
+ "type": "github"
},
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "description": "Symfony ClassLoader Component",
- "homepage": "https://symfony.com",
- "time": "2019-08-20T13:31:17+00:00"
+ "time": "2020-03-28T10:15:50+00:00"
},
{
"name": "symfony/config",
- "version": "v4.4.1",
+ "version": "v4.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
- "reference": "7aa5817f1b7a8ed377752b90fcc47dfb3c67b40c"
+ "reference": "3f4a3de1af498ed0ea653d4dc2317794144e6ca4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/config/zipball/7aa5817f1b7a8ed377752b90fcc47dfb3c67b40c",
- "reference": "7aa5817f1b7a8ed377752b90fcc47dfb3c67b40c",
+ "url": "https://api.github.com/repos/symfony/config/zipball/3f4a3de1af498ed0ea653d4dc2317794144e6ca4",
+ "reference": "3f4a3de1af498ed0ea653d4dc2317794144e6ca4",
"shasum": ""
},
"require": {
],
"description": "Symfony Config Component",
"homepage": "https://symfony.com",
- "time": "2019-12-01T10:50:45+00:00"
+ "time": "2020-03-27T16:54:36+00:00"
},
{
"name": "symfony/console",
- "version": "v3.3.18",
+ "version": "v5.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "af7ec995de93671c03cc1b4e3176c8588bc79dcc"
+ "reference": "5fa1caadc8cdaa17bcfb25219f3b53fe294a9935"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/af7ec995de93671c03cc1b4e3176c8588bc79dcc",
- "reference": "af7ec995de93671c03cc1b4e3176c8588bc79dcc",
+ "url": "https://api.github.com/repos/symfony/console/zipball/5fa1caadc8cdaa17bcfb25219f3b53fe294a9935",
+ "reference": "5fa1caadc8cdaa17bcfb25219f3b53fe294a9935",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/debug": "~2.8|~3.0",
- "symfony/polyfill-mbstring": "~1.0"
+ "php": "^7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.8",
+ "symfony/service-contracts": "^1.1|^2"
},
"conflict": {
- "symfony/dependency-injection": "<3.3"
+ "symfony/dependency-injection": "<4.4",
+ "symfony/event-dispatcher": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<4.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0"
},
"require-dev": {
"psr/log": "~1.0",
- "symfony/config": "~3.3",
- "symfony/dependency-injection": "~3.3",
- "symfony/event-dispatcher": "~2.8|~3.0",
- "symfony/filesystem": "~2.8|~3.0",
- "symfony/process": "~2.8|~3.0"
+ "symfony/config": "^4.4|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/event-dispatcher": "^4.4|^5.0",
+ "symfony/lock": "^4.4|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "symfony/var-dumper": "^4.4|^5.0"
},
"suggest": {
"psr/log": "For using the console logger",
"symfony/event-dispatcher": "",
- "symfony/filesystem": "",
+ "symfony/lock": "",
"symfony/process": ""
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.3-dev"
+ "dev-master": "5.0-dev"
}
},
"autoload": {
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2018-01-29T09:02:23+00:00"
+ "time": "2020-03-30T11:42:42+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v3.4.36",
+ "version": "v5.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "f819f71ae3ba6f396b4c015bd5895de7d2f1f85f"
+ "reference": "5f8d5271303dad260692ba73dfa21777d38e124e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/f819f71ae3ba6f396b4c015bd5895de7d2f1f85f",
- "reference": "f819f71ae3ba6f396b4c015bd5895de7d2f1f85f",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/5f8d5271303dad260692ba73dfa21777d38e124e",
+ "reference": "5f8d5271303dad260692ba73dfa21777d38e124e",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": "^7.2.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.4-dev"
+ "dev-master": "5.0-dev"
}
},
"autoload": {
],
"description": "Symfony CssSelector Component",
"homepage": "https://symfony.com",
- "time": "2019-10-01T11:57:37+00:00"
- },
- {
- "name": "symfony/debug",
- "version": "v3.4.36",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/debug.git",
- "reference": "f72e33fdb1170b326e72c3157f0cd456351dd086"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/f72e33fdb1170b326e72c3157f0cd456351dd086",
- "reference": "f72e33fdb1170b326e72c3157f0cd456351dd086",
- "shasum": ""
- },
- "require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/log": "~1.0"
- },
- "conflict": {
- "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
- },
- "require-dev": {
- "symfony/http-kernel": "~2.8|~3.0|~4.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.4-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Debug\\": ""
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
},
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "url": "https://github.com/fabpot",
+ "type": "github"
},
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "description": "Symfony Debug Component",
- "homepage": "https://symfony.com",
- "time": "2019-10-24T15:33:53+00:00"
+ "time": "2020-03-27T16:56:45+00:00"
},
{
"name": "symfony/dependency-injection",
- "version": "v3.3.18",
+ "version": "v4.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "54243abc4e1a1a15e274e391bd6f7090b44711f1"
+ "reference": "755b18859be26b90f4bf63753432d3387458bf31"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/54243abc4e1a1a15e274e391bd6f7090b44711f1",
- "reference": "54243abc4e1a1a15e274e391bd6f7090b44711f1",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/755b18859be26b90f4bf63753432d3387458bf31",
+ "reference": "755b18859be26b90f4bf63753432d3387458bf31",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "psr/container": "^1.0"
+ "php": "^7.1.3",
+ "psr/container": "^1.0",
+ "symfony/service-contracts": "^1.1.6|^2"
},
"conflict": {
- "symfony/config": "<3.3.7",
- "symfony/finder": "<3.3",
- "symfony/yaml": "<3.3"
+ "symfony/config": "<4.3|>=5.0",
+ "symfony/finder": "<3.4",
+ "symfony/proxy-manager-bridge": "<3.4",
+ "symfony/yaml": "<3.4"
},
"provide": {
- "psr/container-implementation": "1.0"
+ "psr/container-implementation": "1.0",
+ "symfony/service-implementation": "1.0"
},
"require-dev": {
- "symfony/config": "~3.3",
- "symfony/expression-language": "~2.8|~3.0",
- "symfony/yaml": "~3.3"
+ "symfony/config": "^4.3",
+ "symfony/expression-language": "^3.4|^4.0|^5.0",
+ "symfony/yaml": "^3.4|^4.0|^5.0"
},
"suggest": {
"symfony/config": "",
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.3-dev"
+ "dev-master": "4.4-dev"
}
},
"autoload": {
],
"description": "Symfony DependencyInjection Component",
"homepage": "https://symfony.com",
- "time": "2018-01-29T09:02:23+00:00"
+ "time": "2020-03-30T10:09:30+00:00"
},
{
"name": "symfony/dom-crawler",
- "version": "v4.4.1",
+ "version": "v4.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/dom-crawler.git",
- "reference": "36bbcab9369fc2f583220890efd43bf262d563fd"
+ "reference": "4d0fb3374324071ecdd94898367a3fa4b5563162"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/36bbcab9369fc2f583220890efd43bf262d563fd",
- "reference": "36bbcab9369fc2f583220890efd43bf262d563fd",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/4d0fb3374324071ecdd94898367a3fa4b5563162",
+ "reference": "4d0fb3374324071ecdd94898367a3fa4b5563162",
"shasum": ""
},
"require": {
],
"description": "Symfony DomCrawler Component",
"homepage": "https://symfony.com",
- "time": "2019-10-29T11:38:30+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-03-29T19:12:22+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v3.4.36",
+ "version": "v5.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "f9031c22ec127d4a2450760f81a8677fe8a10177"
+ "reference": "24f40d95385774ed5c71dbf014edd047e2f2f3dc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f9031c22ec127d4a2450760f81a8677fe8a10177",
- "reference": "f9031c22ec127d4a2450760f81a8677fe8a10177",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/24f40d95385774ed5c71dbf014edd047e2f2f3dc",
+ "reference": "24f40d95385774ed5c71dbf014edd047e2f2f3dc",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": "^7.2.5",
+ "symfony/event-dispatcher-contracts": "^2"
},
"conflict": {
- "symfony/dependency-injection": "<3.3"
+ "symfony/dependency-injection": "<4.4"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0"
},
"require-dev": {
"psr/log": "~1.0",
- "symfony/config": "~2.8|~3.0|~4.0",
- "symfony/dependency-injection": "~3.3|~4.0",
- "symfony/expression-language": "~2.8|~3.0|~4.0",
- "symfony/stopwatch": "~2.8|~3.0|~4.0"
+ "symfony/config": "^4.4|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/expression-language": "^4.4|^5.0",
+ "symfony/http-foundation": "^4.4|^5.0",
+ "symfony/service-contracts": "^1.1|^2",
+ "symfony/stopwatch": "^4.4|^5.0"
},
"suggest": {
"symfony/dependency-injection": "",
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.4-dev"
+ "dev-master": "5.0-dev"
}
},
"autoload": {
],
"description": "Symfony EventDispatcher Component",
"homepage": "https://symfony.com",
- "time": "2019-10-24T15:33:53+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-03-27T16:56:45+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "af23c2584d4577d54661c434446fb8fbed6025dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/af23c2584d4577d54661c434446fb8fbed6025dd",
+ "reference": "af23c2584d4577d54661c434446fb8fbed6025dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5",
+ "psr/event-dispatcher": "^1"
+ },
+ "suggest": {
+ "symfony/event-dispatcher-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "time": "2019-11-18T17:27:11+00:00"
},
{
"name": "symfony/filesystem",
- "version": "v5.0.1",
+ "version": "v5.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "1d71f670bc5a07b9ccc97dc44f932177a322d4e6"
+ "reference": "ca3b87dd09fff9b771731637f5379965fbfab420"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/1d71f670bc5a07b9ccc97dc44f932177a322d4e6",
- "reference": "1d71f670bc5a07b9ccc97dc44f932177a322d4e6",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/ca3b87dd09fff9b771731637f5379965fbfab420",
+ "reference": "ca3b87dd09fff9b771731637f5379965fbfab420",
"shasum": ""
},
"require": {
],
"description": "Symfony Filesystem Component",
"homepage": "https://symfony.com",
- "time": "2019-11-26T23:25:11+00:00"
+ "time": "2020-03-27T16:56:45+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.13.1",
+ "version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3"
+ "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
- "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14",
+ "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14",
"shasum": ""
},
"require": {
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.13-dev"
+ "dev-master": "1.15-dev"
}
},
"autoload": {
"polyfill",
"portable"
],
- "time": "2019-11-27T13:56:44+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-02-27T09:26:54+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.15.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf",
+ "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "symfony/polyfill-mbstring": "^1.3",
+ "symfony/polyfill-php72": "^1.10"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.15-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Idn\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Laurent Bassin",
+ "email": "laurent@bassin.info"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "idn",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-03-09T19:04:49+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.13.1",
+ "version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f"
+ "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f",
- "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
+ "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
"shasum": ""
},
"require": {
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.13-dev"
+ "dev-master": "1.15-dev"
}
},
"autoload": {
"portable",
"shim"
],
- "time": "2019-11-27T14:18:11+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-03-09T19:04:49+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php72",
+ "version": "v1.15.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "37b0976c78b94856543260ce09b460a7bc852747"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/37b0976c78b94856543260ce09b460a7bc852747",
+ "reference": "37b0976c78b94856543260ce09b460a7bc852747",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.15-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php72\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-02-27T09:26:54+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php73",
+ "version": "v1.15.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7",
+ "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.15-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php73\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-02-27T09:26:54+00:00"
},
{
"name": "symfony/process",
- "version": "v2.8.52",
+ "version": "v5.0.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8"
+ "reference": "c5ca4a0fc16a0c888067d43fbcfe1f8a53d8e70e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/c3591a09c78639822b0b290d44edb69bf9f05dc8",
- "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8",
+ "url": "https://api.github.com/repos/symfony/process/zipball/c5ca4a0fc16a0c888067d43fbcfe1f8a53d8e70e",
+ "reference": "c5ca4a0fc16a0c888067d43fbcfe1f8a53d8e70e",
"shasum": ""
},
"require": {
- "php": ">=5.3.9"
+ "php": "^7.2.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.8-dev"
+ "dev-master": "5.0-dev"
}
},
"autoload": {
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
- "time": "2018-11-11T11:18:13+00:00"
+ "time": "2020-03-27T16:56:45+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "144c5e51266b281231e947b51223ba14acf1a749"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/144c5e51266b281231e947b51223ba14acf1a749",
+ "reference": "144c5e51266b281231e947b51223ba14acf1a749",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5",
+ "psr/container": "^1.0"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "time": "2019-11-18T17:27:11+00:00"
},
{
"name": "symfony/translation",
- "version": "v3.3.18",
+ "version": "v4.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "90cb5ca3eb84b3053fef876e11e405fd819487fc"
+ "reference": "4e54d336f2eca5facad449d0b0118bb449375b76"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/90cb5ca3eb84b3053fef876e11e405fd819487fc",
- "reference": "90cb5ca3eb84b3053fef876e11e405fd819487fc",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/4e54d336f2eca5facad449d0b0118bb449375b76",
+ "reference": "4e54d336f2eca5facad449d0b0118bb449375b76",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/polyfill-mbstring": "~1.0"
+ "php": "^7.1.3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/translation-contracts": "^1.1.6|^2"
},
"conflict": {
- "symfony/config": "<2.8",
- "symfony/yaml": "<3.3"
+ "symfony/config": "<3.4",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/http-kernel": "<4.4",
+ "symfony/yaml": "<3.4"
+ },
+ "provide": {
+ "symfony/translation-implementation": "1.0"
},
"require-dev": {
"psr/log": "~1.0",
- "symfony/config": "~2.8|~3.0",
- "symfony/intl": "^2.8.18|^3.2.5",
- "symfony/yaml": "~3.3"
+ "symfony/config": "^3.4|^4.0|^5.0",
+ "symfony/console": "^3.4|^4.0|^5.0",
+ "symfony/dependency-injection": "^3.4|^4.0|^5.0",
+ "symfony/finder": "~2.8|~3.0|~4.0|^5.0",
+ "symfony/http-kernel": "^4.4",
+ "symfony/intl": "^3.4|^4.0|^5.0",
+ "symfony/service-contracts": "^1.1.2|^2",
+ "symfony/yaml": "^3.4|^4.0|^5.0"
},
"suggest": {
- "psr/log": "To use logging capability in translator",
+ "psr/log-implementation": "To use logging capability in translator",
"symfony/config": "",
"symfony/yaml": ""
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.3-dev"
+ "dev-master": "4.4-dev"
}
},
"autoload": {
],
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
- "time": "2018-01-18T14:19:00+00:00"
+ "time": "2020-03-27T16:54:36+00:00"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/8cc682ac458d75557203b2f2f14b0b92e1c744ed",
+ "reference": "8cc682ac458d75557203b2f2f14b0b92e1c744ed",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5"
+ },
+ "suggest": {
+ "symfony/translation-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Translation\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to translation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "time": "2019-11-18T17:27:11+00:00"
},
{
"name": "symfony/yaml",
- "version": "v3.3.18",
+ "version": "v4.4.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "af615970e265543a26ee712c958404eb9b7ac93d"
+ "reference": "ef166890d821518106da3560086bfcbeb4fadfec"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/af615970e265543a26ee712c958404eb9b7ac93d",
- "reference": "af615970e265543a26ee712c958404eb9b7ac93d",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/ef166890d821518106da3560086bfcbeb4fadfec",
+ "reference": "ef166890d821518106da3560086bfcbeb4fadfec",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": "^7.1.3",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/console": "<3.4"
},
"require-dev": {
- "symfony/console": "~2.8|~3.0"
+ "symfony/console": "^3.4|^4.0|^5.0"
},
"suggest": {
"symfony/console": "For validating YAML files using the lint command"
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.3-dev"
+ "dev-master": "4.4-dev"
}
},
"autoload": {
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
- "time": "2018-01-20T15:04:53+00:00"
+ "time": "2020-03-30T11:41:10+00:00"
},
{
"name": "theseer/tokenizer",
},
{
"name": "webmozart/assert",
- "version": "1.6.0",
+ "version": "1.8.0",
"source": {
"type": "git",
"url": "https://github.com/webmozart/assert.git",
- "reference": "573381c0a64f155a0d9a23f4b0c797194805b925"
+ "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozart/assert/zipball/573381c0a64f155a0d9a23f4b0c797194805b925",
- "reference": "573381c0a64f155a0d9a23f4b0c797194805b925",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/ab2cb0b3b559010b75981b1bdce728da3ee90ad6",
+ "reference": "ab2cb0b3b559010b75981b1bdce728da3ee90ad6",
"shasum": ""
},
"require": {
"symfony/polyfill-ctype": "^1.8"
},
"conflict": {
- "vimeo/psalm": "<3.6.0"
+ "vimeo/psalm": "<3.9.1"
},
"require-dev": {
"phpunit/phpunit": "^4.8.36 || ^7.5.13"
"check",
"validate"
],
- "time": "2019-11-24T13:36:37+00:00"
+ "time": "2020-04-18T12:12:48+00:00"
}
],
"aliases": [
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
- "platform-dev": []
+ "platform-dev": [],
+ "plugin-api-version": "1.1.0"
}
//
// $CFG->debugsessionlock = 5;
//
+// There are times when a session lock is not required during a request. For a page/service to opt-in whether or not a
+// session lock is required this setting must first be set to 'true'.
+// This is an experimental issue. The session store can not be in the session, please
+// see https://docs.moodle.org/en/Session_handling#Read_only_sessions.
+//
+// $CFG->enable_read_only_sessions = true;
+//
// Uninstall plugins from CLI only. This stops admins from uninstalling plugins from the graphical admin
// user interface, and forces plugins to be uninstalled from the Command Line tool only, found at
// admin/cli/plugin_uninstall.php.
// Force developer level debug and add debug info to the output of cron
// $CFG->showcrondebugging = true;
//
+// Force result of checks used to determine whether a site is considered "public" or not (such as for site registration).
+// $CFG->site_is_public = false;
+//
//=========================================================================
// 8. FORCED SETTINGS
//=========================================================================