Skip to content

Commit ef78677

Browse files
Merge pull request #2157 from fetchai/develop
Release v0.9.1
2 parents e520f2f + b168c2d commit ef78677

File tree

114 files changed

+1798
-454
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

114 files changed

+1798
-454
lines changed

.spelling

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ unregistering
162162
pipx
163163
BibTex
164164
Kubernetes
165+
Golang
166+
web3
165167
- docs/language-agnostic-definition.md
166168
fetchai
167169
protocol_id

HISTORY.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
# Release History
22

3+
## 0.9.1 (2020-01-14)
4+
5+
- Fixes multiple issues with `MultiAgentManager` including overrides not being correctly applied
6+
- Restructures docs navigation
7+
- Updates `MultiAgentManager` documentation
8+
- Extends functionality of `aea upgrade` command to cover more cases
9+
- Fixes a bug in the `aea upgrade` command which prevented upgrading across version minors
10+
- Fixes a bug in `aea fetch` where the console output was inconsistent with the actual error
11+
- Fixes scaffold connection constructor
12+
- Multiple additional tests to improve stability
13+
- Multiple docs updates based on user feedback
14+
- Multiple additional tests and test stability fixes
15+
316
## 0.9.0 (2020-01-06)
417

518
- Adds multiple bug fixes on `MultiAgentManager`

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ The `fetchai/p2p_libp2p` package is partially developed in Go.
187187

188188
- To install Go visit the [Golang site](https://golang.org/doc/install).
189189

190-
- We use [golines](https://github.com/segmentio/golines) and [golangci-lint](https://golangci-lint.run) for linting.
190+
- We use [`golines`](https://github.com/segmentio/golines) and [`golangci-lint`](https://golangci-lint.run) for linting.
191191

192192
- To run tests, use `go test -p 1 -timeout 0 -count 1 -v ./...` from the root directory of the package.
193193

aea/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
__title__ = "aea"
2323
__description__ = "Autonomous Economic Agent framework"
2424
__url__ = "https://github.com/fetchai/agents-aea.git"
25-
__version__ = "0.9.0"
25+
__version__ = "0.9.1"
2626
__author__ = "Fetch.AI Limited"
2727
__license__ = "Apache-2.0"
2828
__copyright__ = "2019 Fetch.AI Limited"

aea/aea_builder.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ def __init__(
311311
self,
312312
with_default_packages: bool = True,
313313
registry_dir: str = DEFAULT_REGISTRY_NAME,
314+
build_dir_root: Optional[str] = None,
314315
):
315316
"""
316317
Initialize the builder.
@@ -320,6 +321,7 @@ def __init__(
320321
WithLogger.__init__(self, logger=_default_logger)
321322
self.registry_dir = os.path.join(os.getcwd(), registry_dir)
322323
self._with_default_packages = with_default_packages
324+
self.build_dir_root = build_dir_root
323325
self._reset(is_full_reset=True)
324326

325327
def reset(self, is_full_reset: bool = False) -> None:
@@ -773,7 +775,7 @@ def _set_component_build_directory(
773775
:return: None
774776
"""
775777
configuration.build_directory = os.path.join(
776-
self.AEA_CLASS.get_build_dir(),
778+
self.get_build_root_directory(),
777779
configuration.component_type.value,
778780
configuration.author,
779781
configuration.name,
@@ -900,14 +902,12 @@ def remove_contract(self, public_id: PublicId) -> "AEABuilder":
900902
self.remove_component(ComponentId(ComponentType.CONTRACT, public_id))
901903
return self
902904

903-
def call_all_build_entrypoints(self, root_dir: str = "."):
905+
def call_all_build_entrypoints(self):
904906
"""Call all the build entrypoints."""
905907
for config in self._package_dependency_manager._dependencies.values(): # type: ignore # pylint: disable=protected-access
906908
self.run_build_for_component_configuration(config, logger=self.logger)
907909

908-
target_directory = os.path.abspath(
909-
os.path.join(root_dir, self.AEA_CLASS.get_build_dir())
910-
)
910+
target_directory = self.get_build_root_directory()
911911

912912
if self._build_entrypoint:
913913
self.logger.info("Building AEA package...")
@@ -917,9 +917,13 @@ def call_all_build_entrypoints(self, root_dir: str = "."):
917917
build_entrypoint, source_directory, target_directory, logger=self.logger
918918
)
919919

920+
def get_build_root_directory(self) -> str:
921+
"""Get build directory root."""
922+
return os.path.join(self.build_dir_root or ".", self.AEA_CLASS.get_build_dir())
923+
920924
@classmethod
921925
def run_build_for_component_configuration(
922-
cls, config: ComponentConfiguration, logger: Optional[logging.Logger] = None
926+
cls, config: ComponentConfiguration, logger: Optional[logging.Logger] = None,
923927
) -> None:
924928
"""Run a build entrypoint script for component configuration."""
925929
if not config.build_entrypoint:

aea/cli/add.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,17 @@ def add_item(ctx: Context, item_type: str, item_public_id: PublicId) -> None:
9898
:return: None
9999
"""
100100
click.echo(f"Adding {item_type} '{item_public_id}'...")
101-
if is_item_present(ctx, item_type, item_public_id):
102-
present_item_id = get_item_id_present(ctx, item_type, item_public_id)
101+
if is_item_present(ctx.cwd, ctx.agent_config, item_type, item_public_id):
102+
present_item_id = get_item_id_present(
103+
ctx.agent_config, item_type, item_public_id
104+
)
103105
raise click.ClickException(
104106
"A {} with id '{}' already exists. Aborting...".format(
105107
item_type, present_item_id
106108
)
107109
)
108110

109-
dest_path = get_package_path(ctx, item_type, item_public_id)
111+
dest_path = get_package_path(ctx.cwd, item_type, item_public_id)
110112
is_local = ctx.config.get("is_local")
111113
is_mixed = ctx.config.get("is_mixed")
112114

aea/cli/core.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#
1919
# ------------------------------------------------------------------------------
2020
"""Core definitions for the AEA command-line tool."""
21+
from typing import Optional
2122

2223
import click
2324

@@ -58,6 +59,7 @@
5859
from aea.cli.search import search
5960
from aea.cli.transfer import transfer
6061
from aea.cli.upgrade import upgrade
62+
from aea.cli.utils.click_utils import registry_path_option
6163
from aea.cli.utils.config import get_or_create_cli_config
6264
from aea.cli.utils.constants import AUTHOR_KEY
6365
from aea.cli.utils.context import Context
@@ -77,11 +79,15 @@
7779
default=False,
7880
help="Skip consistency checks of agent during command execution.",
7981
)
82+
@registry_path_option
8083
@click.pass_context
81-
def cli(click_context, skip_consistency_check: bool) -> None:
84+
def cli(
85+
click_context, skip_consistency_check: bool, registry_path: Optional[str]
86+
) -> None:
8287
"""Command-line tool for setting up an Autonomous Economic Agent (AEA)."""
8388
verbosity_option = click_context.meta.pop("verbosity")
8489
click_context.obj = Context(cwd=".", verbosity=verbosity_option)
90+
click_context.obj.registry_path = registry_path
8591
click_context.obj.set_config("skip_consistency_check", skip_consistency_check)
8692

8793
# enables CTRL+C support on windows!

aea/cli/eject.py

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,13 @@
2323
from typing import cast
2424

2525
import click
26+
from packaging.version import Version
2627

28+
import aea
2729
from aea.cli.remove import ItemRemoveHelper
2830
from aea.cli.utils.click_utils import PublicIdParameter
2931
from aea.cli.utils.config import (
32+
load_item_config,
3033
set_cli_author,
3134
try_to_load_agent_config,
3235
update_item_config,
@@ -59,7 +62,11 @@
5962
SKILL,
6063
)
6164
from aea.configurations.utils import get_latest_component_id_from_prefix
62-
from aea.helpers.base import find_topological_order, reachable_nodes
65+
from aea.helpers.base import (
66+
compute_specifier_from_version,
67+
find_topological_order,
68+
reachable_nodes,
69+
)
6370

6471

6572
@click.group()
@@ -149,17 +156,25 @@ def _eject_item(
149156
cli_author: str = cast(str, ctx.config.get("cli_author"))
150157
item_type_plural = item_type + "s"
151158
if not is_item_present(
152-
ctx, item_type, public_id, is_vendor=True, with_version=True
159+
ctx.cwd,
160+
ctx.agent_config,
161+
item_type,
162+
public_id,
163+
is_vendor=True,
164+
with_version=True,
153165
): # pragma: no cover
154166
raise click.ClickException(
155167
f"{item_type.title()} {public_id} not found in agent's vendor items."
156168
)
157-
src = get_package_path(ctx, item_type, public_id)
158-
dst = get_package_path(ctx, item_type, public_id, is_vendor=False)
159-
if is_item_present(ctx, item_type, public_id, is_vendor=False): # pragma: no cover
169+
src = get_package_path(ctx.cwd, item_type, public_id)
170+
dst = get_package_path(ctx.cwd, item_type, public_id, is_vendor=False)
171+
if is_item_present(
172+
ctx.cwd, ctx.agent_config, item_type, public_id, is_vendor=False
173+
): # pragma: no cover
160174
raise click.ClickException(
161175
f"{item_type.title()} {public_id} is already a non-vendor package."
162176
)
177+
configuration = load_item_config(item_type, Path(src))
163178

164179
if public_id.package_version.is_latest:
165180
# get 'concrete' public id, in case it is 'latest'
@@ -208,8 +223,18 @@ def _eject_item(
208223
copy_package_directory(Path(src), dst)
209224

210225
new_public_id = PublicId(cli_author, public_id.name, DEFAULT_VERSION)
226+
current_version = Version(aea.__version__)
227+
new_aea_range = (
228+
configuration.aea_version
229+
if configuration.aea_version_specifiers.contains(current_version)
230+
else compute_specifier_from_version(current_version)
231+
)
211232
update_item_config(
212-
item_type, Path(dst), author=new_public_id.author, version=new_public_id.version
233+
item_type,
234+
Path(dst),
235+
author=new_public_id.author,
236+
version=new_public_id.version,
237+
aea_version=new_aea_range,
213238
)
214239
update_item_public_id_in_init(item_type, Path(dst), new_public_id)
215240
shutil.rmtree(src)

aea/cli/get_multiaddress.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,9 @@ def _try_get_connection_multiaddress(
225225
if connection_id not in ctx.agent_config.connections:
226226
raise ValueError(f"Cannot find connection with the public id {connection_id}.")
227227

228-
package_path = Path(get_package_path_unified(ctx, CONNECTION, connection_id))
228+
package_path = Path(
229+
get_package_path_unified(ctx.cwd, ctx.agent_config, CONNECTION, connection_id)
230+
)
229231
connection_config = cast(
230232
ConnectionConfig, load_item_config(CONNECTION, package_path)
231233
)

aea/cli/issue_certificates.py

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
# limitations under the License.
1717
#
1818
# ------------------------------------------------------------------------------
19-
2019
"""Implementation of the 'aea issue_certificates' subcommand."""
2120
import os
2221
from typing import Dict, List, cast
@@ -28,7 +27,7 @@
2827
from aea.cli.utils.decorators import check_aea_project
2928
from aea.cli.utils.loggers import logger
3029
from aea.cli.utils.package_utils import get_dotted_package_path_unified
31-
from aea.configurations.base import PublicId
30+
from aea.configurations.base import AgentConfig, PublicId
3231
from aea.configurations.constants import CONNECTION
3332
from aea.configurations.manager import AgentConfigManager, VariableDoesNotExist
3433
from aea.crypto.helpers import make_certificate
@@ -43,29 +42,66 @@
4342
def issue_certificates(click_context):
4443
"""Issue certificates for connections that require them."""
4544
ctx = cast(Context, click_context.obj)
46-
issue_certificates_(ctx)
45+
agent_config_manager = AgentConfigManager.load(ctx.cwd)
46+
issue_certificates_(ctx.cwd, agent_config_manager)
47+
click.echo("All certificates have been issued.")
4748

4849

49-
def issue_certificates_(ctx: Context):
50+
def issue_certificates_(
51+
project_directory: str, agent_config_manager: AgentConfigManager
52+
):
5053
"""Issue certificates for connections that require them."""
51-
agent_config_manager = AgentConfigManager.load(ctx.cwd)
52-
53-
# agent_config_manager.
5454
for connection_id in agent_config_manager.agent_config.connections:
55-
_process_connection(ctx, agent_config_manager, connection_id)
55+
cert_requests = _get_cert_requests(
56+
project_directory, agent_config_manager, connection_id
57+
)
58+
_process_connection(
59+
project_directory, agent_config_manager, cert_requests, connection_id
60+
)
5661

5762
click.echo("All certificates have been issued.")
5863

5964

65+
def _get_cert_requests(
66+
project_directory: str, manager: AgentConfigManager, connection_id: PublicId
67+
) -> List[CertRequest]:
68+
"""
69+
Get certificate requests, taking the overrides into account.
70+
71+
:param project_directory: aea project directory.
72+
:param manager: AgentConfigManager
73+
:param connection_id: the connection id.
74+
75+
:return: the list of cert requests.
76+
"""
77+
path = get_dotted_package_path_unified(
78+
project_directory, manager.agent_config, CONNECTION, connection_id
79+
)
80+
path_to_cert_requests = f"{path}.cert_requests"
81+
82+
try:
83+
cert_requests = manager.get_variable(path_to_cert_requests)
84+
except VariableDoesNotExist:
85+
return []
86+
87+
cert_requests = cast(List[Dict], cert_requests)
88+
return [
89+
CertRequest.from_json(cert_request_json) for cert_request_json in cert_requests
90+
]
91+
92+
6093
def _process_certificate(
61-
ctx: Context, cert_request: CertRequest, connection_id: PublicId
94+
project_directory: str,
95+
agent_config: AgentConfig,
96+
cert_request: CertRequest,
97+
connection_id: PublicId,
6298
):
6399
"""Process a single certificate request."""
64100
ledger_id = cert_request.ledger_id
65101
output_path = cert_request.save_path
66102
if cert_request.key_identifier is not None:
67103
key_identifier = cert_request.key_identifier
68-
connection_private_key_path = ctx.agent_config.connection_private_key_paths.read(
104+
connection_private_key_path = agent_config.connection_private_key_paths.read(
69105
key_identifier
70106
)
71107
if connection_private_key_path is None:
@@ -82,38 +118,43 @@ def _process_certificate(
82118
public_key is not None,
83119
"Internal error - one of key_identifier or public_key must be not None.",
84120
)
85-
crypto_private_key_path = ctx.agent_config.private_key_paths.read(ledger_id)
121+
crypto_private_key_path = agent_config.private_key_paths.read(ledger_id)
86122
if crypto_private_key_path is None:
87123
raise ClickException(
88124
f"Cannot find private key with id '{ledger_id}'. Please use `aea generate-key {key_identifier}` and `aea add-key {key_identifier}` to add a private key with id '{key_identifier}'."
89125
)
90126
message = cert_request.get_message(public_key)
91127
cert = make_certificate(
92-
ledger_id, crypto_private_key_path, message, os.path.join(ctx.cwd, output_path)
128+
ledger_id,
129+
crypto_private_key_path,
130+
message,
131+
os.path.join(project_directory, output_path),
93132
)
94133
click.echo(f"Generated signature: '{cert}'")
95134

96135

97136
def _process_connection(
98-
ctx: Context, agent_config_manager: AgentConfigManager, connection_id: PublicId
137+
project_directory: str,
138+
agent_config_manager: AgentConfigManager,
139+
cert_requests: List[CertRequest],
140+
connection_id: PublicId,
99141
):
100-
path = get_dotted_package_path_unified(ctx, CONNECTION, connection_id)
101-
path_to_cert_requests = f"{path}.cert_requests"
102142

103-
try:
104-
cert_requests = agent_config_manager.get_variable(path_to_cert_requests)
105-
except VariableDoesNotExist:
143+
if len(cert_requests) == 0:
106144
logger.debug("No certificates to process.")
107145
return
108146

109147
logger.debug(f"Processing connection '{connection_id}'...")
110-
cert_requests = cast(List[Dict], cert_requests)
111-
for cert_request_json in cert_requests:
112-
cert_request = CertRequest.from_json(cert_request_json)
148+
for cert_request in cert_requests:
113149
click.echo(
114150
f"Issuing certificate '{cert_request.identifier}' for connection {connection_id}..."
115151
)
116-
_process_certificate(ctx, cert_request, connection_id)
152+
_process_certificate(
153+
project_directory,
154+
agent_config_manager.agent_config,
155+
cert_request,
156+
connection_id,
157+
)
117158
click.echo(
118159
f"Dumped certificate '{cert_request.identifier}' in '{cert_request.save_path}' for connection {connection_id}."
119160
)

0 commit comments

Comments
 (0)