This is a sub-issue of #1800046: [META] Add missing type hinting to core docblocks, fix Drupal.Commenting.FunctionComment.Missing* focused on correctly adding @param and @return type hinting to the Update module.

Documentation patches that include type hinting are time consuming to both review and commit because one must dig into the actual code to confirm that the type hints are both correct and complete. Hence, please be patient and try to limit type hint patches to covering only a limited number of docblocks (20-25 as a guess).

How To Review This Issue

  1. Attempt to apply the patch to see if it needs a reroll.
  2. Use the phpcs one-liner to evaluate whether all the relevant standards errors have been resolved: https://gist.github.com/paul-m/227822ac7723b0e90647
  3. Look at each change and determine whether the type hint is correct.

Related sprint issues:

Sprint Topic Sub Issue
#1518116: [meta] Make Core pass Coder Review #1533446: Make update module pass Coder Review
#1310084: [meta] API documentation cleanup sprint #1431634: Clean up API docs for update module
#500866: [META] remove t() from assert message #1798384: Remove t() from test asserts in Update module
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

bleen’s picture

FileSize
8.05 KB

This is a patch for update.module ... none of the .inc files are included as to not overwhelm anyone

bleen’s picture

Status: Active » Needs review

...of note:

+++ b/core/modules/update/update.moduleundefined
@@ -444,7 +444,7 @@ function update_get_available($refresh = FALSE) {
-  return _update_create_fetch_task($project);
+  _update_create_fetch_task($project);

@@ -454,7 +454,7 @@ function update_create_fetch_task($project) {
-  return _update_refresh();
+  _update_refresh();

@@ -464,13 +464,13 @@ function update_refresh() {
-  return _update_fetch_data();
+  _update_fetch_data();

None of these functions actually return anything

Lars Toomre’s picture

Status: Needs review » Needs work

Thanks for this patch @bleen18. From previous experience with wotking with @jhodgdon on these types of documentation issues, she only wants to commit changes that are between /** and */ in issues such as these. Hence, my recommendation would be to split your patch into two parts.

The changes to _update_create_fetch_task(), _update_refresh() and _update_fetch_data() (along with the proposed changes to their docblocks) should go into a new issue to be posted in the Update.module queue. The rest of the patch then should be re-rolled for here.

bleen’s picture

Status: Needs work » Needs review
FileSize
3.46 KB

this removes the changes to "return" lines

bleen’s picture

Lars Toomre’s picture

@bleen 18 The patch in #4 is for Tracker module, not the Update module. Looks like you uploaded the wrong patch to this issue.

bleen’s picture

FileSize
7.42 KB

oops

Lars Toomre’s picture

@bleen18 I am having a problem getting the new patch like in the other issue. When I try to retrieve 1811202.patch using curl, I am getting the first one (i.e. #1), not the version uploaded in #7.

This common patch name problem is why it is the Drupal 'best practice' to try to create files with unique names like '[issue #]-[comment #]-th-update.patch'. Could you upload #7 again using a unique name so that I can get it download? Thanks in advance.

bleen’s picture

@lars Toomre ... you need to look at the actaul link .. in this case the link the second patch is http://drupal.org/files/1811202_0.patch

Lars Toomre’s picture

Ah thanks @bleen18... I did not realize that. I was using simply what shown on the green bar.

How did you get the actual link so I do not bother you again with this type of issue?

bleen’s picture

simply, right click the link and copy it ... or hover over it, in chrome at least it shows you the destination at the bottom left of your window

Lars Toomre’s picture

Thanks for rolling this patch @bleen18! I am sorry about my confusion in getting this patch down to my local machine.

Here is the start of another nit-picky review. Again, I am focused on making sure we get a resulting RTBC patch that is ready to be committed so that we minimize any push back there, since these type of patches take much time and attention to detail to review correctly and completely.

First, I noted that there are several places in this module where #1487760: [policy, no patch] Decide on documentation standards for namespaced items applies:
- MockFileTransfer.php,
- update.authorize.inc, and
- update.manager.inc.

With this patch locally applied, I see that we are missing many @param type hints:
- two in update.api.php,
- numerous in update.authorize.inc,
- thirteen more in update.compare.inc,
- nine more in update.fetch.inc,
- two in update.install,
- six in update.manager.inc,
- none in update.module, and
- none in update.report.inc.

Additionally, with this patch applied locally, there are missing type hints in the following files:
- one in update.api.php,
- five in update.compare.inc,
- four in update.fetch.inc,
- two in update.install,
- two in update.manager.inc, and
- none in update.module.

Also, checked and with this applied there are no '(Optional)' capitalization issues in this patch.

I am going to save this here and continue with the detailed dreditor comments/review of the patch in the next comment.

Lars Toomre’s picture

Status: Needs review » Needs work

Below are my detail notes from reviewing the patch in #7:

+++ b/core/modules/update/update.moduleundefined
@@ -244,7 +244,7 @@ function update_menu() {
- * @return
+ * @return bool
  *   TRUE if the current user can access the updater menu items; FALSE

This type hint is correct in update_manager_access().

Looks like we are missing a @return directive for _update_no_data().

+++ b/core/modules/update/update.moduleundefined
@@ -372,11 +372,11 @@ function _update_no_data() {
  *
- * @param $refresh
+ * @param bool $refresh
  *   (optional) Boolean to indicate if this method should refresh the cache
  *   automatically if there's no data. Defaults to FALSE.

This type hint addition is correct as is the @return type hint for update_get_available().

+++ b/core/modules/update/update.moduleundefined
@@ -436,7 +436,7 @@ function update_get_available($refresh = FALSE) {
  *
- * @param $project
+ * @param array $project
  *   Associative array of information about a project. See update_get_projects()
  *   for the keys used.

This type hint is correct in update_create_fetch_task().

We should add array to the function declaration in whatever coding fix issue we use to add array to function declarations.

+++ b/core/modules/update/update.moduleundefined
@@ -470,7 +470,7 @@ function update_fetch_data() {
  *
- * @return
+ * @return array
  *   Array of data about available releases, keyed by project shortname.

This type hint addition for _update_get_cached_available_releases() is correct.

+++ b/core/modules/update/update.moduleundefined
@@ -495,11 +495,11 @@ function _update_get_cached_available_releases() {
  *
- * @param $key
+ * @param string $key
  *   Unique key to indicate what message to build, always 'status_notify'.
- * @param $message
+ * @param array $message
  *   Reference to the message array being built.
- * @param $params
+ * @param array $params
  *   Array of parameters to indicate what kind of text to include in the message
  *   body. This is a keyed array of message type ('core' or 'contrib') as the

All of these type hints for update_mail() are correct.

+++ b/core/modules/update/update.moduleundefined
@@ -536,18 +536,18 @@ function update_mail($key, &$message, $params) {
  *
- * @param $msg_type
+ * @param string $msg_type
  *   String to indicate what kind of message to generate. Can be either 'core'
  *   or 'contrib'.
- * @param $msg_reason
+ * @param int $msg_reason
  *   Integer constant specifying why message is generated.
- * @param $report_link
+ * @param bool $report_link
  *   (optional) Boolean that controls if a link to the updates report should be
  *   added. Defaults to FALSE.

These type hints in _update_message_text() are correct.

+++ b/core/modules/update/update.moduleundefined
@@ -536,18 +536,18 @@ function update_mail($key, &$message, $params) {
- * @param $langcode
+ * @param string $langcode
  *   (optional) A language code to use. Defaults to NULL.

This type hint should be 'string|null' at minimum. Have we double checked that the $langcode is a string and not an integer. I get confused by the language constant definitions.

+++ b/core/modules/update/update.moduleundefined
@@ -536,18 +536,18 @@ function update_mail($key, &$message, $params) {
- * @return
+ * @return string
  *   The properly translated error message for the given key.

This type hint is correct.

+++ b/core/modules/update/update.moduleundefined
@@ -623,6 +623,17 @@ function _update_message_text($msg_type, $msg_reason, $report_link = FALSE, $lan
+ *
+ * @param array $a
+ *   Associative array of information about a project. See update_get_projects()
+ *   for the keys used.
+ * @param array $b
+ *   Associative array of information about a project. See update_get_projects()
+ *   for the keys used.
+ *

My understanding is that helper functions for uasort() functions do not require @param or @return directives.

+++ b/core/modules/update/update.moduleundefined
@@ -641,10 +652,13 @@ function _update_project_status_sort($a, $b) {
  *
+ * @return string
+ *   Rendered HTML for the last time we checked for update data.

I think I mentioned it elsewhere, but let me repeat. theme() functions should not include a @return directive according to [#1354].

+++ b/core/modules/update/update.moduleundefined
@@ -748,11 +762,11 @@ function update_verify_update_archive($project, $archive_file, $directory) {
- * @param $cid
+ * @param string $cid
  *   The cache ID to save the data with.
- * @param $data
+ * @param mixed $data
  *   The data to store.
- * @param $expire
+ * @param int $expire
  *   One of the following values:
  *   - CacheBackendInterface::CACHE_PERMANENT: Indicates that the item should

All three of these type hints for _update_cache_set() are correct.

+++ b/core/modules/update/update.moduleundefined
@@ -807,7 +821,7 @@ function _update_cache_get($cid) {
  *
- * @return
+ * @return array
  *   Associative array of cache items, keyed by cache ID.

I think this should be 'array|false' since db_query() can return FALSE if the $cid value was not found.

+++ b/core/modules/update/update.moduleundefined
@@ -830,11 +844,11 @@ function _update_get_cache_multiple($cid_prefix) {
  *
- * @param $cid
+ * @param string $cid
  *   (optional) Cache ID of the record to clear from the private update module
  *   cache. If empty, all records will be cleared from the table except fetch
  *   tasks. Defaults to NULL.
- * @param $wildcard
+ * @param bool $wildcard
  *   (optional) If TRUE, cache IDs starting with $cid are deleted in addition to
  *   the exact cache ID specified by $cid. Defaults to FALSE.

This first one is incorrect. It should be 'string|null'. The second type hint is correct. What do you think?

+++ b/core/modules/update/update.moduleundefined
@@ -886,7 +900,7 @@ function update_cache_flush() {
- * @return
+ * @return string
  *   An eight character string uniquely identifying this Drupal installation.

This type hint is correct.

+++ b/core/modules/update/update.moduleundefined
@@ -900,11 +914,11 @@ function _update_manager_unique_identifier() {
- * @param $create
+ * @param bool $create
  *   (optional) Whether to attempt to create the directory if it does not
  *   already exist. Defaults to TRUE.
  *
- * @return
+ * @return string
  *   The full path to the temporary directory where update file archives should
  *   be extracted.

These type hint additions for _update_manager_extract_directory() are correct.

+++ b/core/modules/update/update.moduleundefined
@@ -922,11 +936,11 @@ function _update_manager_extract_directory($create = TRUE) {
- * @param $create
+ * @param bool $create
  *   (optional) Whether to attempt to create the directory if it does not
  *   already exist. Defaults to TRUE.
  *
- * @return
+ * @return string
  *   The full path to the temporary directory where update file archives should
  *   be cached.

Both of these type hint additions in _update_manager_cache_directory() are correct.

+++ b/core/modules/update/update.moduleundefined
@@ -973,7 +987,7 @@ function update_clear_update_disk_cache() {
  *
- * @param $path
+ * @param string $path
  *   A string containing a file path or (streamwrapper) URI.

This type hint in update_delete_file_if_stale() is correct.

Lars Toomre’s picture

There is quite a bit already in this patch @bleen18. How would you like to approach the additional items noted in #12? Would you like to add some more to this patch or just leave all of the rest until the follow up patch after this is committed?

I also would appreciate some guidance from @jhodgdon if she looks into this issue. Thanks in advance.

Mile23’s picture

Mile23’s picture

Status: Needs work » Needs review
FileSize
5.81 KB

Reroll of #7, without any of the issues raised in subsequent comments.

Will work on those.

Mile23’s picture

FileSize
25.23 KB
20.61 KB

This covers all the top-level PHP files in the module, so .install, inc, .module, etc.

Mile23’s picture

I'd like to draw the reviewer's attention to this, which happened because you're not supposed to document @params and @return values for hooks. However, this information is important.

+++ b/core/modules/update/update.install
@@ -10,19 +10,18 @@
 /**
  * Implements hook_requirements().
  *
- * @return
- *   An array describing the status of the site regarding available updates. If
- *   there is no update data, only one record will be returned, indicating that
- *   the status of core can't be determined. If data is available, there will be
- *   two records: one for core, and another for all of contrib (assuming there
- *   are any contributed modules or themes enabled on the site). In addition to
- *   the fields expected by hook_requirements ('value', 'severity', and
- *   optionally 'description'), this array will contain a 'reason' attribute,
- *   which is an integer constant to indicate why the given status is being
- *   returned (UPDATE_NOT_SECURE, UPDATE_NOT_CURRENT, or UPDATE_UNKNOWN). This
- *   is used for generating the appropriate email notification messages during
- *   update_cron(), and might be useful for other modules that invoke
- *   update_requirements() to find out if the site is up to date or not.
+ * Returns an array describing the status of the site regarding available
+ * updates. If there is no update data, only one record will be returned,
+ * indicating that the status of core can't be determined. If data is available,
+ * there will be two records: one for core, and another for all of contrib
+ * (assuming there are any contributed modules or themes enabled on the site).
+ * In addition to the fields expected by hook_requirements ('value', 'severity',
+ * and optionally 'description'), this array will contain a 'reason' attribute,
+ * which is an integer constant to indicate why the given status is being
+ * returned (UPDATE_NOT_SECURE, UPDATE_NOT_CURRENT, or UPDATE_UNKNOWN). This is
+ * used for generating the appropriate email notification messages during
+ * update_cron(), and might be useful for other modules that invoke
+ * update_requirements() to find out if the site is up to date or not.
  *

Status: Needs review » Needs work

The last submitted patch, 17: 1811202_17.patch, failed testing.

Mile23’s picture

The failure seems unrelated (in LockFunctionalTest), so I'll re-run the testbot.

Mile23 queued 17: 1811202_17.patch for re-testing.

Mile23’s picture

Mile23’s picture

Status: Needs work » Needs review
FileSize
30.93 KB
5.7 KB

This gets everything, I think.

Status: Needs review » Needs work

The last submitted patch, 23: 1811202_23.patch, failed testing.

Mile23’s picture

Status: Needs work » Needs review

Kicking testbot...

Mile23 queued 23: 1811202_23.patch for re-testing.

Status: Needs review » Needs work

The last submitted patch, 23: 1811202_23.patch, failed testing.

Mile23’s picture

Status: Needs work » Needs review
FileSize
773 bytes
31.68 KB

Failure related to the fact that type hinting works. :-)

Status: Needs review » Needs work

The last submitted patch, 28: 1811202_28.patch, failed testing.

Mile23’s picture

Status: Needs work » Needs review
FileSize
33.33 KB
1.65 KB

Gets the remaining implementations.

jhodgdon’s picture

Component: documentation » update.module

This is adding type hints to code. Moving out of documentation component.

Is this really right anyway??!?

-  public function deleteQueueItem($item) {
+  public function deleteQueueItem(\stdClass $item) {
Mile23’s picture

-  public function deleteQueueItem($item) {
+  public function deleteQueueItem(\stdClass $item) {

I wondered about that. QueueItemInterface says this:

   * @param \stdClass $item
   *   The item returned by \Drupal\Core\Queue\QueueInterface::claimItem().

QueueInterface::claimItem() says this:

   * @return
   *   On success we return an item object. If the queue is unable to claim an
   *   item it returns false. This implies a best effort to retrieve an item
   *   and either the queue is empty or there is some other non-recoverable
   *   problem.
   *
   *   If returned, the object will have at least the following properties:
   *   - data: the same as what what passed into createItem().
   *   - item_id: the unique ID returned from createItem().
   *   - created: timestamp when the item was put into the queue.
   */

claimItem() docs don't look wrong, from looking at Memory::claimItem(). I think the queue system never got fully OOP-ified.

Mile23’s picture

Status: Needs review » Needs work
Issue tags: +Needs reroll
Mile23’s picture

Issue summary: View changes
Nitesh Sethia’s picture

Status: Needs work » Needs review
Issue tags: -Needs reroll +#drupalgoa2015
FileSize
35.22 KB

Rerolling

Mile23’s picture

Version: 8.0.x-dev » 8.1.x-dev
Issue tags: +Needs reroll

Bumping to 8.1.x. Patch no longer applies.

Mile23’s picture

Status: Needs review » Needs work
tatisilva’s picture

Status: Needs work » Needs review
Issue tags: -Needs reroll
FileSize
33.79 KB

I rerolled. There were merge conflicts. I kept all the changes from HEAD but made sure that type hinting was kept.

Status: Needs review » Needs work

The last submitted patch, 38: add_missing_type-1811202-38.patch, failed testing.

Mile23’s picture

Version: 8.1.x-dev » 8.0.x-dev
Status: Needs work » Needs review
FileSize
16.29 KB
21.05 KB

Thanks, @tatisilva.

We're not supposed to be adding code changes here, even though I did it originally. For instance, this shouldn't change, within the scope of this issue:

+++ b/core/modules/update/src/Tests/UpdateTestBase.php
@@ -56,16 +56,16 @@ protected function setUp() {
-  protected function refreshUpdateStatus($xml_map, $url = 'update-test') {
+  protected function refreshUpdateStatus(array $xml_map, $url = 'update-test') {

So only type hinting within @param and @return.

Since this is a re-roll of my work, I'll work on it and remove all the changes that need removal.

As @jhodgdon pointed out elsewhere, these issues can be for 8.0.x because they are docs-only.

Reviewer please see #18 because that still applies. Also, I'm not sure where update_test_mock_page() came from (see interdiff). Pretty sure it was either a bad re-roll or a bad patch.

Version: 8.0.x-dev » 8.1.x-dev

Drupal 8.0.6 was released on April 6 and is the final bugfix release for the Drupal 8.0.x series. Drupal 8.0.x will not receive any further development aside from security fixes. Drupal 8.1.0-rc1 is now available and sites should prepare to update to 8.1.0.

Bug reports should be targeted against the 8.1.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.2.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.1.x-dev » 8.2.x-dev

Drupal 8.1.9 was released on September 7 and is the final bugfix release for the Drupal 8.1.x series. Drupal 8.1.x will not receive any further development aside from security fixes. Drupal 8.2.0-rc1 is now available and sites should prepare to upgrade to 8.2.0.

Bug reports should be targeted against the 8.2.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.3.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.2.x-dev » 8.3.x-dev

Drupal 8.2.6 was released on February 1, 2017 and is the final full bugfix release for the Drupal 8.2.x series. Drupal 8.2.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.3.0 on April 5, 2017. (Drupal 8.3.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.3.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.4.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.3.x-dev » 8.4.x-dev

Drupal 8.3.6 was released on August 2, 2017 and is the final full bugfix release for the Drupal 8.3.x series. Drupal 8.3.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.4.0 on October 4, 2017. (Drupal 8.4.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.4.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.5.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.4.x-dev » 8.5.x-dev

Drupal 8.4.4 was released on January 3, 2018 and is the final full bugfix release for the Drupal 8.4.x series. Drupal 8.4.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.5.0 on March 7, 2018. (Drupal 8.5.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.5.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.6.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

borisson_’s picture

Status: Needs review » Needs work
Issue tags: +Needs reroll

This patch no longer applies, @alexpott recently committed something similar for the locale module. Setting to needs work for a reroll.

savkaviktor16@gmail.com’s picture

Version: 8.5.x-dev » 8.6.x-dev
Status: Needs work » Needs review
Issue tags: -Needs reroll
FileSize
16.09 KB

Re-rolled

idebr’s picture

Status: Needs review » Needs work
  1. +++ b/core/modules/update/update.module
    @@ -490,11 +490,11 @function update_mail($key, &$message, $params) {
      * Constructs the email notification message when the site is out of date.
      *
    - * @param $key
    + * @param string $key
      *   Unique key to indicate what message to build, always 'status_notify'.
    - * @param $message
    + * @param array $message
      *   Reference to the message array being built.
    - * @param $params
    + * @param array $params
    

    These @params violate Drupal.Commenting.HookComment.HookParamDoc (Hook implementations should not duplicate @param documentation) and should be removed.

  2. +++ b/core/modules/update/update.authorize.inc
    @@ -19,10 +19,10 @@
    - * @param $filetransfer
    + * @param \Drupal\Core\FileTransfer $filetransfer
    

    Undefined class FileTransfer

  3. +++ b/core/modules/update/update.authorize.inc
    @@ -72,7 +72,7 @@ function update_authorize_run_update($filetransfer, $projects) {
    - * @param FileTransfer $filetransfer
    + * @param \Drupal\Core\FileTransfer $filetransfer
      *   The FileTransfer object created by authorize.php for use during this
    
    @@ -133,7 +133,7 @@ function update_authorize_run_install($filetransfer, $project, $updater_name, $l
    + * @param \Drupal\Core\FileTransfer $filetransfer
    

    Undefined class FileTransfer

Version: 8.6.x-dev » 8.7.x-dev

Drupal 8.6.0-alpha1 will be released the week of July 16, 2018, which means new developments and disruptive changes should now be targeted against the 8.7.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.7.x-dev » 8.8.x-dev

Drupal 8.7.0-alpha1 will be released the week of March 11, 2019, which means new developments and disruptive changes should now be targeted against the 8.8.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.8.x-dev » 8.9.x-dev

Drupal 8.8.0-alpha1 will be released the week of October 14th, 2019, which means new developments and disruptive changes should now be targeted against the 8.9.x-dev branch. (Any changes to 8.9.x will also be committed to 9.0.x in preparation for Drupal 9’s release, but some changes like significant feature additions will be deferred to 9.1.x.). For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.9.x-dev » 9.1.x-dev

Drupal 8.9.0-beta1 was released on March 20, 2020. 8.9.x is the final, long-term support (LTS) minor release of Drupal 8, which means new developments and disruptive changes should now be targeted against the 9.1.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

shetpooja04’s picture

I have uploaded patch with changes comparing from #47 in 9.1.x version
and also implemented #48.1 point
Please check and mention what changes are required further

used the below to check
phpcs --standard="Drupal" --extensions="module/php,inc/php,php" --report-csv core/modules/update | grep -F $'Missing param\nReturn type missing'

Please review!

shetpooja04’s picture

Status: Needs work » Needs review

Version: 9.1.x-dev » 9.2.x-dev

Drupal 9.1.0-alpha1 will be released the week of October 19, 2020, which means new developments and disruptive changes should now be targeted for the 9.2.x-dev branch. For more information see the Drupal 9 minor version schedule and the Allowed changes during the Drupal 9 release cycle.

quietone’s picture

Status: Needs review » Closed (duplicate)
Related issues: +#3207949: Fix Drupal.Commenting.FunctionComment.MissingParamType

This work is now being done by sniff. The work here is now in #3207949: Fix Drupal.Commenting.FunctionComment.MissingParamType so closing this as a duplicate. I've identified credit to add over there, let me know if I got it wrong.