nit.git
4 years agoCI: nitunit_some skips contrib since some code might be generated
Jean Privat [Fri, 19 Jul 2019 00:59:11 +0000 (20:59 -0400)]
CI: nitunit_some skips contrib since some code might be generated

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agonitcc: tests script return non-zero on failure (print is not enough)
Jean Privat [Thu, 18 Jul 2019 18:08:18 +0000 (14:08 -0400)]
nitcc: tests script return non-zero on failure (print is not enough)

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agonitcc: trim also remove tags on bad states
Jean Privat [Thu, 18 Jul 2019 18:06:52 +0000 (14:06 -0400)]
nitcc: trim also remove tags on bad states

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agoMerge: ci: generate metrics output in an artifact file
Jean Privat [Mon, 15 Jul 2019 15:08:16 +0000 (11:08 -0400)]
Merge: ci: generate metrics output in an artifact file

Results for nitmetrics should be easily available.

Pull-Request: #2771

4 years agoMerge: fix ci nitunit some
Jean Privat [Mon, 15 Jul 2019 15:08:12 +0000 (11:08 -0400)]
Merge: fix ci nitunit some

When there is no change in watched nit files, the job `nitunit_some` failed.

Pull-Request: #2770

4 years agoMerge: Introduce `test_frontend`
Jean Privat [Mon, 15 Jul 2019 15:08:09 +0000 (11:08 -0400)]
Merge: Introduce `test_frontend`

Sometimes we need to test things related to a model and it's not easy to do this with NitUnit since creating
a model by hand is tedious.

With the `TestModel` abstract suite it's easier:

```nit
module my_test is test

import test_frontend

class MyTest
   super TestModel
   test

   redef var test_src = "path/to/files"

   fun my_test is test do
       assert test_model.mmodules.length == 1
   end
end
```

Pull-Request: #2769
Reviewed-by: Jean Privat <jean@pryen.org>

4 years agoMerge: doc: Rename `synopsys` into `synopsis`
Jean Privat [Mon, 15 Jul 2019 15:08:04 +0000 (11:08 -0400)]
Merge: doc: Rename `synopsys` into `synopsis`

Typo found in a lot of places ported since the very first `nitdoc` version I think.

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

Pull-Request: #2768

4 years agoMerge: metrics: ReadmeMetrics uses markdown2
Jean Privat [Mon, 15 Jul 2019 15:08:00 +0000 (11:08 -0400)]
Merge: metrics: ReadmeMetrics uses markdown2

Some leftovers introducing the new markdown parser.

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

Pull-Request: #2767

4 years agoMerge: Update basic requirements and document them
Jean Privat [Mon, 15 Jul 2019 15:07:57 +0000 (11:07 -0400)]
Merge: Update basic requirements and document them

Since #2615 we broke the initial build according to the documentation since nitpm (picnit) requires libcurl.

To minimize the number of doc to update I just moved `nitpm` to the "more" set of tools and documented their requirements.
I also added a CI job to avoid future failures (note: I'm not sure how to adapt it on other docker-less platforms).

Pull-Request: #2766
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agoMerge: Move back manual to the main repo
Jean Privat [Mon, 15 Jul 2019 15:07:28 +0000 (11:07 -0400)]
Merge: Move back manual to the main repo

The manual is slowly bit rotting in the wiki (the disclaimer in http://nitlanguage.org/manual/ and the link to the very old issue  #761 is not a nice thing to have).

The idea is to move back the documentation in the main repository so that PR that enhance the language should also update the manual.
We could add checks to ensure that new AST element or annotations implies some update in the manual.

It is what is currently done with the manpages of the tools, and they are quite complete and up to date.

Pull-Request: #2762

4 years agoMerge: Clean old projects from `contrib`
Jean Privat [Mon, 15 Jul 2019 15:07:24 +0000 (11:07 -0400)]
Merge: Clean old projects from `contrib`

This PR removes 3 old projects from `contrib` that are no more used nor interesting:

* `neo_doxygen`
* `refund`
* `wiringPi`

222 files and 25k LOC less :D

Pull-Request: #2764

4 years agoMerge: github: Summer cleaning
Jean Privat [Mon, 15 Jul 2019 15:07:20 +0000 (11:07 -0400)]
Merge: github: Summer cleaning

Some cleaning to the `github` lib.

Most interesting changes:

* kill `github_curl` and migrate clients (`github_merge`, `github_search_for_jni`)
* clean deserialization process heuristics for something more robust and readable (but a bit slower)
* array pagination
* kill `GithubEntity`
* remove ISO date methods
* mock testing for `github::wallet`
* `wallet` uses a `Logger`

This PR can be read commit by commit.

Pull-Request: #2765
Reviewed-by: Jean Privat <jean@pryen.org>

4 years agoci: generate metrics output in an artifact file
Jean Privat [Mon, 15 Jul 2019 15:05:18 +0000 (11:05 -0400)]
ci: generate metrics output in an artifact file

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agoindexing: Use `test_frontend`
Alexandre Terrasa [Sun, 14 Jul 2019 18:42:00 +0000 (14:42 -0400)]
indexing: Use `test_frontend`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agodoc: Commands tests use `test_frontend`
Alexandre Terrasa [Sun, 14 Jul 2019 18:41:38 +0000 (14:41 -0400)]
doc: Commands tests use `test_frontend`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agofrontend: Introduce `test_frontend` to easily test model related code
Alexandre Terrasa [Sun, 14 Jul 2019 18:01:30 +0000 (14:01 -0400)]
frontend: Introduce `test_frontend` to easily test model related code

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agodoc: Rename `synopsys` into `synopsis`
Alexandre Terrasa [Sun, 14 Jul 2019 16:55:45 +0000 (12:55 -0400)]
doc: Rename `synopsys` into `synopsis`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agometrics: ReadmeMetrics uses markdown2
Alexandre Terrasa [Sun, 14 Jul 2019 15:37:52 +0000 (11:37 -0400)]
metrics: ReadmeMetrics uses markdown2

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agoMerge: ci: basic bench with old branch
Jean Privat [Fri, 12 Jul 2019 19:53:19 +0000 (15:53 -0400)]
Merge: ci: basic bench with old branch

This adds a job where a basic execution is compared against origin/master is order to catch important time or space regressions. Because the test machine is shared with many jobs, the results are not that reliable and some additional checks by the integrator might be required.

However, the script can help developers to do a basic check to document their PR.

Pull-Request: #2739
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>

4 years agoMerge: typing: get_method refactoring
Jean Privat [Fri, 12 Jul 2019 19:53:15 +0000 (15:53 -0400)]
Merge: typing: get_method refactoring

Split the get_method to three different entry points. These new entry points make it possible to adapt the treatment to the actual context. This avoids creating callsites manually and in the same time do the verification if the researched method exist (display an error if not exist)

Signed-off-by: Florian Deljarry <deljarry.florian@gmail.com>

Pull-Request: #2760
Reviewed-by: Alexandre Terrasa <alexandre@moz-code.org>
Reviewed-by: Jean Privat <jean@pryen.org>

4 years agoMerge: nitc: fix --keep-going in the compiler broken by 539ca148d
Jean Privat [Fri, 12 Jul 2019 19:53:10 +0000 (15:53 -0400)]
Merge: nitc: fix --keep-going in the compiler broken by 539ca148d

Also add tests to avoid that again

Pull-Request: #2763

4 years agoci: compile the manual
Jean Privat [Wed, 10 Jul 2019 14:59:09 +0000 (10:59 -0400)]
ci: compile the manual

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agoci: do not error when nothing with nitunit_some
Jean Privat [Fri, 12 Jul 2019 18:00:41 +0000 (14:00 -0400)]
ci: do not error when nothing with nitunit_some

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agoci: tests that requirements for tools are still OK
Jean Privat [Fri, 12 Jul 2019 19:11:57 +0000 (15:11 -0400)]
ci: tests that requirements for tools are still OK

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agoREADME: update the state of requirements
Jean Privat [Fri, 12 Jul 2019 19:09:34 +0000 (15:09 -0400)]
README: update the state of requirements

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agotools: move nitpm to more_tools since it requires libcurl
Jean Privat [Fri, 12 Jul 2019 18:23:12 +0000 (14:23 -0400)]
tools: move nitpm to more_tools since it requires libcurl

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agodoc/manual: put back the manual in the main repository
Jean Privat [Wed, 10 Jul 2019 14:58:57 +0000 (10:58 -0400)]
doc/manual: put back the manual in the main repository

Currently it bit rot in the wiki :(

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agonitc: fix --keep-going in the compiler broken by 539ca148d
Jean Privat [Wed, 10 Jul 2019 20:13:11 +0000 (16:13 -0400)]
nitc: fix --keep-going in the compiler broken by 539ca148d

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agotyping: get_method refactoring
Florian Deljarry [Tue, 9 Jul 2019 20:21:41 +0000 (16:21 -0400)]
typing: get_method refactoring

Split the get_method to three different entry points. These new entry points make it possible to adapt the treatment to the actual context.

Signed-off-by: Florian Deljarry <deljarry.florian@gmail.com>

4 years agogithub: Remove old logging
Alexandre Terrasa [Thu, 11 Jul 2019 02:35:40 +0000 (22:35 -0400)]
github: Remove old logging

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Clean `get_contributor_stats`
Alexandre Terrasa [Thu, 11 Jul 2019 02:35:19 +0000 (22:35 -0400)]
github: Clean `get_contributor_stats`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Kill `github_curl`
Alexandre Terrasa [Tue, 9 Jul 2019 03:15:31 +0000 (23:15 -0400)]
github: Kill `github_curl`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub_search_for_jni: Migrate to new Github API
Alexandre Terrasa [Tue, 9 Jul 2019 03:14:48 +0000 (23:14 -0400)]
github_search_for_jni: Migrate to new Github API

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub_merge: Migrate to new Github API
Alexandre Terrasa [Tue, 9 Jul 2019 03:14:27 +0000 (23:14 -0400)]
github_merge: Migrate to new Github API

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agoci: clean ccache stats to see the real effect of ccaching
Jean Privat [Thu, 11 Jul 2019 12:31:53 +0000 (08:31 -0400)]
ci: clean ccache stats to see the real effect of ccaching

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agogithub: Introduce `get_pull_comments`
Alexandre Terrasa [Thu, 11 Jul 2019 01:05:13 +0000 (21:05 -0400)]
github: Introduce `get_pull_comments`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Rename `ReviewComment` in `PullComment`
Alexandre Terrasa [Thu, 11 Jul 2019 00:59:12 +0000 (20:59 -0400)]
github: Rename `ReviewComment` in `PullComment`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Rename `get_review_comment` in `get_pull_comment`
Alexandre Terrasa [Thu, 11 Jul 2019 00:57:08 +0000 (20:57 -0400)]
github: Rename `get_review_comment` in `get_pull_comment`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Introduce `get_commit_status`
Alexandre Terrasa [Thu, 11 Jul 2019 00:42:13 +0000 (20:42 -0400)]
github: Introduce `get_commit_status`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Repo::default_branch can actually be null...
Alexandre Terrasa [Thu, 11 Jul 2019 01:08:55 +0000 (21:08 -0400)]
github: Repo::default_branch can actually be null...

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: GithubWallet uses logger
Alexandre Terrasa [Tue, 9 Jul 2019 00:57:24 +0000 (20:57 -0400)]
github: GithubWallet uses logger

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: GithubWallet uses optional attributes
Alexandre Terrasa [Tue, 9 Jul 2019 00:44:53 +0000 (20:44 -0400)]
github: GithubWallet uses optional attributes

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Add mock testing for GithubWallet
Alexandre Terrasa [Tue, 9 Jul 2019 00:44:28 +0000 (20:44 -0400)]
github: Add mock testing for GithubWallet

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Clean GithubAPI deserialization
Alexandre Terrasa [Thu, 11 Jul 2019 01:24:37 +0000 (21:24 -0400)]
github: Clean GithubAPI deserialization

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogihtub: Remove ISODate
Alexandre Terrasa [Fri, 21 Jun 2019 03:12:30 +0000 (23:12 -0400)]
gihtub: Remove ISODate

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Remove GithubEntity
Alexandre Terrasa [Fri, 21 Jun 2019 03:08:12 +0000 (23:08 -0400)]
github: Remove GithubEntity

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Decouple API from responses instances
Alexandre Terrasa [Fri, 21 Jun 2019 02:56:22 +0000 (22:56 -0400)]
github: Decouple API from responses instances

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Remove method `GithubAPI::get_branch_commits`
Alexandre Terrasa [Fri, 21 Jun 2019 02:27:06 +0000 (22:27 -0400)]
github: Remove method `GithubAPI::get_branch_commits`

Let clients handle that.

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: `search_issues` returns a SearchResults
Alexandre Terrasa [Thu, 11 Jul 2019 01:21:34 +0000 (21:21 -0400)]
github: `search_issues` returns a SearchResults

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Remove `get_repo_last_issue`
Alexandre Terrasa [Thu, 11 Jul 2019 01:20:16 +0000 (21:20 -0400)]
github: Remove `get_repo_last_issue`

This was a terrible hack...

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Refactorize array requests
Alexandre Terrasa [Fri, 21 Jun 2019 02:25:16 +0000 (22:25 -0400)]
github: Refactorize array requests

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Rename `GithubAPI::load_` methods in `get_`
Alexandre Terrasa [Fri, 21 Jun 2019 00:33:20 +0000 (20:33 -0400)]
github: Rename `GithubAPI::load_` methods in `get_`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Move deserialization process to `get`
Alexandre Terrasa [Fri, 21 Jun 2019 00:44:38 +0000 (20:44 -0400)]
github: Move deserialization process to `get`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Decouple GithubAPI from `GithubCurl`
Alexandre Terrasa [Fri, 21 Jun 2019 01:22:17 +0000 (21:22 -0400)]
github: Decouple GithubAPI from `GithubCurl`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agocontrib: Kill `wiringPi`
Alexandre Terrasa [Thu, 11 Jul 2019 00:06:26 +0000 (20:06 -0400)]
contrib: Kill `wiringPi`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agocontrib: Kill `refund`
Alexandre Terrasa [Thu, 11 Jul 2019 00:05:50 +0000 (20:05 -0400)]
contrib: Kill `refund`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agocontrib: Kill `neo_doxygen`
Alexandre Terrasa [Thu, 11 Jul 2019 00:05:08 +0000 (20:05 -0400)]
contrib: Kill `neo_doxygen`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agoci: basic bench with old branch
Jean Privat [Sat, 23 Feb 2019 03:13:05 +0000 (22:13 -0500)]
ci: basic bench with old branch

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agogithub: API use new constructors
Alexandre Terrasa [Wed, 19 Jun 2019 03:22:32 +0000 (23:22 -0400)]
github: API use new constructors

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agoMerge: nitrpg: Move `nitrpg` to its own repository
Jean Privat [Wed, 3 Jul 2019 18:50:57 +0000 (14:50 -0400)]
Merge: nitrpg: Move `nitrpg` to its own repository

`nitrpg` is broken since a long time. I think https:/api.github.com actually changed twice since it broke. I don't plan on killing it yet but I moved it to its own repository until I worked again on it (or never).

See https://github.com/Morriar/nitrpg.

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

Pull-Request: #2755

4 years agoMerge: Mock Github API tests
Jean Privat [Wed, 3 Jul 2019 18:50:53 +0000 (14:50 -0400)]
Merge: Mock Github API tests

This PR adds a mock to GithubAPI so we can avoid sending requests to the API on CI.

For each API call we save the actual Github response body from the API and reuse it during the tests.
The attribute `update_responses_cache` can be set to `true` so the cache files are updated from the API when `nitunit` is called.

Pull-Request: #2753
Reviewed-by: Jean Privat <jean@pryen.org>

4 years agoMerge: Follow the INI specification
Jean Privat [Wed, 3 Jul 2019 18:50:48 +0000 (14:50 -0400)]
Merge: Follow the INI specification

This version follows more closely the INI specification (https://en.wikipedia.org/wiki/INI_file) and adds some improvements to the API.

Spec changes:
* Allow `#` and `;` for comments
* No more sections nesting as by the spec (which actually change nothing see below)

API changes:
* Renaming `ConfigTree` -> `IniFile` (as it's no more a "tree")
* No more coupling with a file path, use utility methods `load_string`, `load_file`, `write_to`  instead
* Ability to iterate keys, values, sections and section content
* Ability to create `IniSection` by hand
* `IniFile` and `IniSection` implements `Map[String, nullable String]`

The biggest change is that sub-sections are now flattened.

Before, with the following ini:

~~~ini
[section1]
key1=value1
[section1.section2]
key2=value2
~~~

You would get this hierarchy:

~~~
section1
  |   key1=value1
  `- section2
      `-  key2=value2
~~~

Now you get:

~~~
section1
  `- key1=value1
section1.section2
  `-  key2=value2
~~~

Two independent (unnested) sections, one called `section1` and the other called `section1.section2`.
This actually change nothing if the client was using the `[]` operator with the `.` notation as:

~~~
ini["section1.section2.key2"] # still returns `value2`
~~~

Documentation and specification from the README:

# `ini` - Read and write INI configuration files

[INI files](https://en.wikipedia.org/wiki/INI_file) are simple text files with
a basic structure composed of sections, properties and values used to store
configuration parameters.

Here's an example from the `package.ini` of this package:

~~~nit
import ini

var package_ini = """
[package]
name=ini
desc=Read and write INI configuration files.
[upstream]
git=https://github.com/nitlang/nit.git
git.directory=lib/ini/
"""
~~~

## Basic usage

`IniFile` is used to parse INI strings and access their content:

~~~nit
var ini = new IniFile.from_string(package_ini)
assert ini["package.name"] == "ini"
assert ini["upstream.git.directory"] == "lib/ini/"
assert ini["unknown.unknown"] == null
~~~

`IniFile` can also load INI configuration from a file:

~~~nit
package_ini.write_to_file("my_package.ini")

ini = new IniFile.from_file("my_package.ini")
assert ini["package.name"] == "ini"
assert ini["upstream.git.directory"] == "lib/ini/"

"my_package.ini".to_path.delete
~~~

INI content can be added or edited through the `IniFile` API then written to
a stream or a file.

~~~nit
ini["package.name"] = "new name"
ini["upstream.git.directory"] = "/dev/null"
ini["section.key"] = "value"

var stream = new StringWriter
ini.write_to(stream)

assert stream.to_s == """
[package]
name=new name
desc=Read and write INI configuration files.
[upstream]
git=https://github.com/nitlang/nit.git
git.directory=/dev/null
[section]
key=value
"""
~~~

## INI content

### Properties

Properties are the basic element of the INI format.
Every property correspond to a *key* associated to a *value* thanks to the equal (`=`) sign.

~~~nit
ini = new IniFile.from_string("""
key1=value1
key2=value2
""")
assert ini["key1"] == "value1"
assert ini["key2"] == "value2"
assert ini.length == 2
~~~

Accessing an unknown property returns `null`:

~~~nit
assert ini["unknown"] == null
~~~

Properties can be iterated over:

~~~nit
var i = 1
for key, value in ini do
assert key == "key{i}"
assert value == "value{i}"
i += 1
end
~~~

Property keys cannot contain the character `=`.
Values can contain any character.
Spaces are trimmed.

~~~nit
ini = new IniFile.from_string("""
prop=erty1=value1
 property2 =  value2
property3=value3 ; with semicolon
""")
assert ini[";property1"] == null
assert ini["prop=erty1"] == null
assert ini["prop"] == "erty1=value1"
assert ini["property2"] == "value2"
assert ini[" property2 "] == "value2"
assert ini["property3"] == "value3 ; with semicolon"
~~~

Both keys and values are case sensitive.

~~~nit
ini = new IniFile.from_string("""
Property1=value1
property2=Value2
""")
assert ini["property1"] == null
assert ini["Property1"] == "value1"
assert ini["property2"] != "value2"
assert ini["property2"] == "Value2"
~~~

### Sections

Properties may be grouped into arbitrary sections.
The section name appears on a line by itself between square brackets (`[` and `]`).

All keys after the section declaration are associated with that section.
The is no explicit "end of section" delimiter; sections end at the next section
declaration or the end of the file.
Sections cannot be nested.

~~~nit
var content = """
key1=value1
key2=value2
[section1]
key1=value3
key2=value4
[section2]
key1=value5
"""

ini = new IniFile.from_string(content)
assert ini["key1"] == "value1"
assert ini["unknown"] == null
assert ini["section1.key1"] == "value3"
assert ini["section1.unknown"] == null
assert ini["section2.key1"] == "value5"
~~~

Sections can be iterated over:

~~~nit
i = 1
for section in ini.sections do
assert section.name == "section{i}"
assert section["key1"].has_prefix("value")
i += 1
end
~~~

When iterating over a file properties, only properties at root are returned.
`flatten` can be used to iterate over all properties including the one from
sections.

~~~nit
assert ini.join(", ", ": ") == "key1: value1, key2: value2"
assert ini.flatten.join(", ", ": ") ==
"key1: value1, key2: value2, section1.key1: value3, section1.key2: value4, section2.key1: value5"

i = 0
for key, value in ini do
i += 1
assert key == "key{i}" and value == "value{i}"
end
assert i == 2

~~~

Sections name may contain any character including brackets (`[` and `]`).
Spaces are trimmed.

~~~nit
ini = new IniFile.from_string("""
[[section1]]
key=value1
[ section 2 ]
key=value2
[section1.section3]
key=value3
""")
assert ini.sections.length == 3
assert ini["[section1].key"] == "value1"
assert ini["section 2.key"] == "value2"
assert ini["section1.section3.key"] == "value3"
assert ini.sections.last.name == "section1.section3"
~~~

The dot `.` notation is used to create new sections with `[]=`.
Unknown sections will be created on the fly.

~~~nit
ini = new IniFile
ini["key"] = "value1"
ini["section1.key"] = "value2"
ini["section2.key"] = "value3"

stream = new StringWriter
ini.write_to(stream)
assert stream.to_s == """
key=value1
[section1]
key=value2
[section2]
key=value3
"""
~~~

Sections can also be created manually:

~~~nit
ini = new IniFile
ini["key"] = "value1"

var section = new IniSection("section1")
section["key"] = "value2"
ini.sections.add section

stream = new StringWriter
ini.write_to(stream)
assert stream.to_s == """
key=value1
[section1]
key=value2
"""
~~~

### Comments

Comments are indicated by semicolon (`;`) or a number sign (`#`) at the begining
of the line. Commented lines are ignored as well as empty lines.

~~~nit
ini = new IniFile.from_string("""
; This is a comment.
; property1=value1

# This is another comment.
# property2=value2
""")
assert ini.is_empty
~~~

### Unicode support

INI files support Unicode:

~~~nit
ini = new IniFile.from_string("""
property❤=héhé
""")
assert ini["property❤"] == "héhé"
~~~

Pull-Request: #2752
Reviewed-by: Jean Privat <jean@pryen.org>

4 years agoMerge: Introduce `Logger`, a simple yet powerful logging system
Jean Privat [Wed, 3 Jul 2019 18:50:43 +0000 (14:50 -0400)]
Merge: Introduce `Logger`, a simple yet powerful logging system

# A simple logger for Nit

## Basic Usage

Create a new `Logger` with a severity level threshold set to `warn_level`:

~~~nit
var logger = new Logger(warn_level)
~~~

Messages with a severity equal or higher than `warn_level` will be displayed:

~~~nit
logger.error "Displays an error."
logger.warn "Displays a warning."
~~~

Messages with a lower severity are silenced:

~~~nit
logger.info "Displays nothing."
~~~

`FileLogger` can be used to output the messages into a file:

~~~nit
var log_file = "my.log"

logger = new FileLogger(warn_level, log_file, append = false)
logger.error("An error")
logger.info("Some info")
logger.close

assert log_file.to_path.read_all == "An error\n"
log_file.to_path.delete
~~~

## Severity levels

Each message is associated with a level that indicate its severity.
Only messages with a severity equal to or higher than the logger `level`
threshold will be displayed.

Severity levels from the most severe to the least severe:

* `unknown_level`: An unknown message that should always be outputted.
* `fatal_level`: An unhandleable error that results in a program crash.
* `error_level`: A handleable error condition.
* `warn_level`: A warning.
* `info_level`: Generic (useful) information about system operation.
* `debug_level`: Low-level information for developpers.

## Formatting messages

You can create custom formatters by implementing the `Formatter` interface.

~~~nit
class MyFormatter
super Formatter

redef fun format(level, message) do
if level < warn_level then return message
return "!!!{message}!!!"
end
end
~~~

See `DefaultFormatter` for a more advanced implementation example.

Each Logger can be given a default formatter used to format the every messages
before outputting them:

~~~nit
var formatter = new MyFormatter
var stderr = new StringWriter
var logger = new Logger(warn_level, stderr, formatter)

logger.warn("This is a warning.")
assert stderr.to_s.trim.split("\n").last == "!!!This is a warning.!!!"
~~~

Optionally, a `Formatter` can be given to replace the `default_formatter`
used by default:

~~~nit
# Create a formatter with no default decorator
logger = new Logger(warn_level, stderr, null)

# Display a message without any formatter
logger.warn("This is a warning.")
assert stderr.to_s.trim.split("\n").last == "This is a warning."

# Display a message with a custom formatter
logger.warn("This is a warning.", formatter)
assert stderr.to_s.trim.split("\n").last == "!!!This is a warning.!!!"
~~~

Pull-Request: #2751
Reviewed-by: Jean Privat <jean@pryen.org>

4 years agogithub: Switch GithubAPI examples to `nitish`
Alexandre Terrasa [Wed, 19 Jun 2019 02:46:24 +0000 (22:46 -0400)]
github: Switch GithubAPI examples to `nitish`

Since it's now covered by the mock.

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Fix `GithubAPI::load_repo_branches`
Alexandre Terrasa [Wed, 19 Jun 2019 02:39:58 +0000 (22:39 -0400)]
github: Fix `GithubAPI::load_repo_branches`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Add mock api testing
Alexandre Terrasa [Wed, 19 Jun 2019 03:50:32 +0000 (23:50 -0400)]
github: Add mock api testing

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agonitrpg: Move `nitrpg` to its own repository
Alexandre Terrasa [Thu, 20 Jun 2019 23:31:41 +0000 (19:31 -0400)]
nitrpg: Move `nitrpg` to its own repository

See https://github.com/Morriar/nitrpg.

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agonitpm: Update to new INI api
Alexandre Terrasa [Sat, 15 Jun 2019 18:58:09 +0000 (14:58 -0400)]
nitpm: Update to new INI api

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agonitpackage: Update to new INI api
Alexandre Terrasa [Sat, 15 Jun 2019 18:57:51 +0000 (14:57 -0400)]
nitpackage: Update to new INI api

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agoloader: Update to new INI api
Alexandre Terrasa [Sat, 15 Jun 2019 18:56:19 +0000 (14:56 -0400)]
loader: Update to new INI api

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agodoc: Update to new INI api
Alexandre Terrasa [Sat, 15 Jun 2019 18:56:09 +0000 (14:56 -0400)]
doc: Update to new INI api

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agonitiwiki: Update to new INI api
Alexandre Terrasa [Sat, 15 Jun 2019 18:55:56 +0000 (14:55 -0400)]
nitiwiki: Update to new INI api

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agodocker-ci: ajoute libicu-dev
Jean Privat [Thu, 20 Jun 2019 15:19:53 +0000 (11:19 -0400)]
docker-ci: ajoute libicu-dev

4 years agoconfig: Update to new INI api
Alexandre Terrasa [Sat, 15 Jun 2019 18:55:35 +0000 (14:55 -0400)]
config: Update to new INI api

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agoini: Update `package.ini` file
Alexandre Terrasa [Sat, 15 Jun 2019 18:55:19 +0000 (14:55 -0400)]
ini: Update `package.ini` file

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agoini: Add a README with tests from the spec
Alexandre Terrasa [Sat, 15 Jun 2019 18:54:54 +0000 (14:54 -0400)]
ini: Add a README with tests from the spec

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agoini: Rewrite lib so it follows the INI spec
Alexandre Terrasa [Tue, 18 Jun 2019 23:13:01 +0000 (19:13 -0400)]
ini: Rewrite lib so it follows the INI spec

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agonitweb: Adapt server to new `pop_logging` interface
Alexandre Terrasa [Sat, 15 Jun 2019 01:39:40 +0000 (21:39 -0400)]
nitweb: Adapt server to new `pop_logging` interface

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agogithub: Adapt Github loader to new `pop_logging` interface
Alexandre Terrasa [Sat, 15 Jun 2019 01:39:18 +0000 (21:39 -0400)]
github: Adapt Github loader to new `pop_logging` interface

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agopopcorn: Remove useless dependency between `pop_tracker` and `pop_logging`
Alexandre Terrasa [Sat, 15 Jun 2019 01:38:46 +0000 (21:38 -0400)]
popcorn: Remove useless dependency between `pop_tracker` and `pop_logging`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agopopcorn: Use `logger`
Alexandre Terrasa [Sat, 15 Jun 2019 01:37:55 +0000 (21:37 -0400)]
popcorn: Use `logger`

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agoIntroduce `logger`, a simple logging utility for Nit
Alexandre Terrasa [Sat, 15 Jun 2019 01:01:26 +0000 (21:01 -0400)]
Introduce `logger`, a simple logging utility for Nit

Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

4 years agoMerge: Some more small improvements on gitlab-ci
Jean Privat [Thu, 13 Jun 2019 14:14:24 +0000 (10:14 -0400)]
Merge: Some more small improvements on gitlab-ci

Pull-Request: #2744

4 years agoMerge: concurrent_collections: Add implementation of has method
Jean Privat [Fri, 7 Jun 2019 17:16:31 +0000 (13:16 -0400)]
Merge: concurrent_collections: Add implementation of has method

Adding the implementation of the has method to call the has on the `real_collection`

Pull-Request: #2748

4 years agoMerge: lib/core/bytes: Add a redef of has method
Jean Privat [Fri, 7 Jun 2019 17:16:29 +0000 (13:16 -0400)]
Merge: lib/core/bytes: Add a redef of has method

Adding the redef of the `has` method  to take care of the negative numbers

Signed-off-by: Florian Deljarry <deljarry.florian@gmail.com>

Pull-Request: #2749
Reviewed-by: Lucas Bajolet <r4pass@hotmail.com>
Reviewed-by: Jean Privat <jean@pryen.org>

4 years agoMerge: Fix LineIterator
Jean Privat [Fri, 7 Jun 2019 17:16:26 +0000 (13:16 -0400)]
Merge: Fix LineIterator

The logic behind LineIteraor (and the contracts of the iterators methods) was broken because of a bad management of the cache.

Instead of solving it locally, this PR introduces a simple CacheIterator abstract class with the correct behavior and simplify LineIteraor by using it.

Pull-Request: #2750

4 years agotests: add test_file_read3 for LineIterator
Jean Privat [Thu, 30 May 2019 15:00:58 +0000 (11:00 -0400)]
tests: add test_file_read3 for LineIterator

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agolib/core/stream: LineIterator use CachedIterator
Jean Privat [Thu, 30 May 2019 14:51:55 +0000 (10:51 -0400)]
lib/core/stream: LineIterator use CachedIterator

The logic behind `is_ok` was broken and caused inconsitent results.

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agolib/core/collection: add `CachedIterator` to factorize the logic of iterators with...
Jean Privat [Thu, 30 May 2019 14:45:06 +0000 (10:45 -0400)]
lib/core/collection: add `CachedIterator` to factorize the logic of iterators with a cache

Signed-off-by: Jean Privat <jean@pryen.org>

4 years agolib/core/bytes: Adding a redef of has method
Florian Deljarry [Tue, 28 May 2019 16:03:12 +0000 (12:03 -0400)]
lib/core/bytes: Adding a redef of has method

Adding the redef of the `has` method  to take care of the negative numbers

Signed-off-by: Florian Deljarry <deljarry.florian@gmail.com>

4 years agoconcurrent_collections: Adding implementation of has method
Florian Deljarry [Mon, 27 May 2019 16:03:01 +0000 (12:03 -0400)]
concurrent_collections: Adding implementation of has method

Signed-off-by: Florian Deljarry <deljarry.florian@gmail.com>

4 years agoMerge: astbuilder: Adding new nodes makers(assert, method, or, and,...)
Jean Privat [Thu, 9 May 2019 15:10:28 +0000 (11:10 -0400)]
Merge: astbuilder: Adding new nodes makers(assert, method, or, and,...)

Adding new nodes creation services.
Signed-off-by: Florian Deljarry <deljarry.florian@gmail.com>

Pull-Request: #2745
Reviewed-by: Jean Privat <jean@pryen.org>

4 years agoastbuilder: Adding new nodes makers(assert, method, or, and,...)
Florian Deljarry [Fri, 12 Apr 2019 21:28:52 +0000 (17:28 -0400)]
astbuilder: Adding new nodes makers(assert, method, or, and,...)

Signed-off-by: Florian Deljarry <deljarry.florian@gmail.com>

5 years agonitunit: do not write empty testsuites in the xml file
Jean Privat [Fri, 1 Mar 2019 12:56:46 +0000 (07:56 -0500)]
nitunit: do not write empty testsuites in the xml file

Signed-off-by: Jean Privat <jean@pryen.org>

5 years agotests.sh: run junit2html to render xml files
Jean Privat [Fri, 1 Mar 2019 02:19:01 +0000 (21:19 -0500)]
tests.sh: run junit2html to render xml files

Signed-off-by: Jean Privat <jean@pryen.org>

5 years agogitlab-ci: add nitmetrics job
Jean Privat [Fri, 1 Mar 2019 02:16:33 +0000 (21:16 -0500)]
gitlab-ci: add nitmetrics job

Signed-off-by: Jean Privat <jean@pryen.org>

5 years agogitlab-ci: add valgrind job
Jean Privat [Fri, 1 Mar 2019 02:16:15 +0000 (21:16 -0500)]
gitlab-ci: add valgrind job

Signed-off-by: Jean Privat <jean@pryen.org>

5 years agoMerge: CI: macOS jobs for Gitlab CI
Jean Privat [Fri, 1 Mar 2019 00:08:49 +0000 (19:08 -0500)]
Merge: CI: macOS jobs for Gitlab CI

Add 3 CI jobs for macOS, equivalent to `build_tools`, `test_some` and `test_full_nitcs`. They are executed by a shell executor on a macOS host, Nit Gitlab repos should have a such a runner with the tag `macos`. The new jobs are similar enough to the GNU/Linux versions that they can share the same script.

This PR also fixes 3 problems with macOS portability:

* Workaround for the error with kqueue on libevent and nitcorn clients.

* Set `sed -E` explicitly in `check_manpages.sh` for portability with macOS.

* Download bdwgc in the CI docker image, to prevent `test_full_nitcs_macos` to fail on `hello_ios` because it downloads bdwgc at compilation and prints to the test output. This will require regenerating the official Docker image.

Pull-Request: #2743
Reviewed-by: Jean Privat <jean@pryen.org>

5 years agoMerge: ci: nitlang/nit-ci docker image runs in UTF8
Jean Privat [Fri, 1 Mar 2019 00:08:47 +0000 (19:08 -0500)]
Merge: ci: nitlang/nit-ci docker image runs in UTF8

Or else gradle fails with an exception

Pull-Request: #2742
Reviewed-by: Alexis Laferrière <alexis.laf@xymus.net>

5 years agoMerge: Moving the astvalidation module in astbuilder
Jean Privat [Fri, 1 Mar 2019 00:08:46 +0000 (19:08 -0500)]
Merge: Moving the astvalidation module in astbuilder

The astvalidation module has been moved into the astbuilder, as both are always used together.

Signed-off-by: Florian Deljarry <deljarry.florian@gmail.com>

Pull-Request: #2741
Reviewed-by: Jean Privat <jean@pryen.org>