Example #1
0
    def test_consistency(self):
        def _check_equal(hs1, hs2, hs3, hs4):
            opt_values1 = OptionsValues(hs1)
            opt_values2 = OptionsValues(hs2)
            opt_values3 = OptionsValues(hs3)
            opt_values4 = OptionsValues(hs4)

            self.assertEqual(opt_values1.dumps(), opt_values2.dumps())
            self.assertEqual(opt_values1.dumps(), opt_values3.dumps())
            self.assertEqual(opt_values1.dumps(), opt_values4.dumps())

        # Check that all possible input options give the same result
        _check_equal([('opt', 3)],       [('opt', '3'), ],       ('opt=3', ),       {'opt': 3})
        _check_equal([('opt', True)],    [('opt', 'True'), ],    ('opt=True', ),    {'opt': True})
        _check_equal([('opt', False)],   [('opt', 'False'), ],   ('opt=False', ),   {'opt': False})
        _check_equal([('opt', None)],    [('opt', 'None'), ],    ('opt=None', ),    {'opt': None})
        _check_equal([('opt', 0)],       [('opt', '0'), ],       ('opt=0', ),       {'opt': 0})
        _check_equal([('opt', '')],      [('opt', ''), ],        ('opt=', ),        {'opt': ''})

        # Check for leading and trailing spaces
        _check_equal([('  opt  ', 3)], [(' opt  ', '3'), ], ('  opt =3', ), {' opt ': 3})
        _check_equal([('opt', '  value  ')], [('opt', '  value '), ], ('opt= value  ', ),
                     {'opt': ' value '})

        # This is expected behaviour:
        self.assertNotEqual(OptionsValues([('opt', ''), ]).dumps(),
                            OptionsValues(('opt=""', )).dumps())
Example #2
0
 def test_exceptions_repeated_value(self):
     try:
         OptionsValues.loads("a=2\na=12\nb=3").dumps()
         OptionsValues(("a=2", "b=23", "a=12"))
         OptionsValues([('a', 2), ('b', True), ('a', '12')])
     except Exception as e:
         self.fail("Not expected exception: {}".format(e))
Example #3
0
    def print_inspect(self, inspect, raw=False):
        for k, v in inspect.items():
            if k == "default_options":
                if not isinstance(v, dict):
                    conan_v2_behavior(
                        "Declare 'default_options' as a dictionary")

                if isinstance(v, str):
                    v = OptionsValues.loads(v)
                elif isinstance(v, tuple):
                    v = OptionsValues(v)
                elif isinstance(v, list):
                    v = OptionsValues(tuple(v))
                elif isinstance(v, dict):
                    v = OptionsValues(v)

            if raw:
                self._out.write(str(v))
            else:
                if isinstance(v, (dict, OptionsValues)):
                    self._out.writeln("%s:" % k)
                    for ok, ov in sorted(v.items()):
                        self._out.writeln("    %s: %s" % (ok, ov))
                else:
                    self._out.writeln("%s: %s" % (k, str(v)))
Example #4
0
 def test_package_with_spaces(self):
     self.assertEqual(
         OptionsValues([
             ('pck2:opt', 50),
         ]).dumps(),
         OptionsValues([
             ('pck2 :opt', 50),
         ]).dumps())
Example #5
0
        def _check_equal(hs1, hs2, hs3, hs4):
            opt_values1 = OptionsValues(hs1)
            opt_values2 = OptionsValues(hs2)
            opt_values3 = OptionsValues(hs3)
            opt_values4 = OptionsValues(hs4)

            self.assertEqual(opt_values1.dumps(), opt_values2.dumps())
            self.assertEqual(opt_values1.dumps(), opt_values3.dumps())
            self.assertEqual(opt_values1.dumps(), opt_values4.dumps())
Example #6
0
    def test_exceptions_empty_value(self):
        emsg = "not enough values to unpack" if six.PY3 and sys.version_info.minor > 4 \
            else "need more than 1 value to unpack"
        with six.assertRaisesRegex(self, ValueError, emsg):
            OptionsValues("a=2\nconfig\nb=3")

        with six.assertRaisesRegex(self, ValueError, emsg):
            OptionsValues(("a=2", "config"))

        with six.assertRaisesRegex(self, ValueError, emsg):
            OptionsValues([('a', 2), ('config', ), ])
Example #7
0
 def print_inspect(self, inspect):
     for k, v in inspect.items():
         if k == "default_options":
             if isinstance(v, str):
                 v = OptionsValues.loads(v)
             elif isinstance(v, tuple):
                 v = OptionsValues(v)
             elif isinstance(v, list):
                 v = OptionsValues(tuple(v))
         if isinstance(v, (dict, OptionsValues)):
             self._out.writeln("%s:" % k)
             for ok, ov in sorted(v.items()):
                 self._out.writeln("    %s: %s" % (ok, ov))
         else:
             self._out.writeln("%s: %s" % (k, str(v)))
Example #8
0
def create_profile(folder,
                   name,
                   settings=None,
                   package_settings=None,
                   env=None,
                   package_env=None,
                   options=None):

    package_env = package_env or {}

    profile = Profile()
    profile.settings = settings or {}

    if package_settings:
        profile.package_settings = package_settings

    if options:
        profile.options = OptionsValues(options)

    for package_name, envs in package_env.items():
        for var_name, value in envs:
            profile.env_values.add(var_name, value, package_name)

    for var_name, value in env or {}:
        profile.env_values.add(var_name, value)

    save(os.path.join(folder, name), profile.dumps())
Example #9
0
    def update_profile(self, profile_name, key, value):
        first_key, rest_key = self._get_profile_keys(key)

        profile, _ = read_profile(profile_name, os.getcwd(),
                                  self._client_cache.profiles_path)
        if first_key == "settings":
            profile.settings[rest_key] = value
        elif first_key == "options":
            tmp = OptionsValues([(rest_key, value)])
            profile.options.update(tmp)
        elif first_key == "env":
            profile.env_values.update(
                EnvValues.loads("%s=%s" % (rest_key, value)))
        elif first_key == "scopes":
            profile.update_scopes(
                Scopes.from_list(["%s=%s" % (rest_key, value)]))
        elif first_key == "build_requires":
            raise ConanException(
                "Edit the profile manually to change the build_requires")

        contents = profile.dumps()
        profile_path = get_profile_path(profile_name,
                                        self._client_cache.profiles_path,
                                        os.getcwd())
        save(profile_path, contents)
Example #10
0
    def build_graph(self,
                    content,
                    profile_build_requires=None,
                    ref=None,
                    create_ref=None,
                    install=True):
        path = temp_folder()
        path = os.path.join(path, "conanfile.py")
        save(path, str(content))
        self.loader.cached_conanfiles = {}

        profile = Profile()
        if profile_build_requires:
            profile.build_requires = profile_build_requires
        profile.process_settings(self.cache)
        update = check_updates = False
        recorder = ActionRecorder()
        remotes = Remotes()
        build_mode = []  # Means build all
        ref = ref or ConanFileReference(None, None, None, None, validate=False)
        options = OptionsValues()
        graph_info = GraphInfo(profile, options, root_ref=ref)
        deps_graph, _ = self.manager.load_graph(path, create_ref, graph_info,
                                                build_mode, check_updates,
                                                update, remotes, recorder)
        if install:
            self.binary_installer.install(deps_graph, None, False, graph_info)
        return deps_graph
Example #11
0
def create_profile(folder,
                   name,
                   settings=None,
                   package_settings=None,
                   env=None,
                   package_env=None,
                   options=None,
                   conf=None):

    package_env = package_env or {}

    profile = Profile()
    profile.settings = settings or {}

    if package_settings:
        profile.package_settings = package_settings

    if options:
        profile.options = OptionsValues(options)

    if conf:
        _conf = "\n".join(conf) if isinstance(conf, list) else conf
        profile.conf.loads(_conf)

    for package_name, envs in package_env.items():
        for var_name, value in envs:
            profile.env_values.add(var_name, value, package_name)

    for var_name, value in env or {}:
        profile.env_values.add(var_name, value)

    save(os.path.join(folder, name), profile.dumps())
Example #12
0
    def _build_graph(self, profile_host, profile_build, install=False):
        path = temp_folder()
        path = os.path.join(path, "conanfile.txt")
        save(path, textwrap.dedent("""
            [requires]
            app/testing@user/channel
        """))

        ref = ConanFileReference(None, None, None, None, validate=False)
        options = OptionsValues()
        graph_info = GraphInfo(profile_host=profile_host, profile_build=profile_build,
                               options=options, root_ref=ref)
        recorder = ActionRecorder()
        app = self._get_app()
        deps_graph = app.graph_manager.load_graph(path, create_reference=None, graph_info=graph_info,
                                                  build_mode=[], check_updates=False, update=False,
                                                  remotes=Remotes(), recorder=recorder)

        if install:
            build_mode = []  # Means build all
            binary_installer = BinaryInstaller(app, recorder)
            build_mode = BuildMode(build_mode, app.out)
            binary_installer.install(deps_graph, None, build_mode, update=False,
                                     profile_host=profile_host, profile_build=profile_build,
                                     graph_lock=None,
                                     keep_build=False)
        return deps_graph
Example #13
0
    def _loader(self,
                current_path=None,
                user_settings_values=None,
                user_options_values=None):
        # The disk settings definition, already including the default disk values
        settings = self._paths.settings
        options = OptionsValues()

        if current_path:
            conan_info_path = os.path.join(current_path, CONANINFO)
            if os.path.exists(conan_info_path):
                existing_info = ConanInfo.load_file(conan_info_path)
                settings.values = existing_info.full_settings
                options = existing_info.full_options  # Take existing options from conaninfo.txt

        if user_settings_values:
            aux_values = Values.from_list(user_settings_values)
            settings.values = aux_values

        if user_options_values is not None:  # Install will pass an empty list []
            # Install OVERWRITES options, existing options in CONANINFO are not taken
            # into account, just those from CONANFILE + user command line
            options = OptionsValues.from_list(user_options_values)

        return ConanFileLoader(self._runner, settings, options=options)
Example #14
0
 def __init__(self):
     # Sections
     self.settings = OrderedDict()
     self.package_settings = defaultdict(OrderedDict)
     self.env_values = EnvValues()
     self.scopes = Scopes()
     self.options = OptionsValues()
Example #15
0
 def build_consumer(self,
                    path,
                    profile_build_requires=None,
                    ref=None,
                    create_ref=None,
                    install=True):
     profile = Profile()
     if profile_build_requires:
         profile.build_requires = profile_build_requires
     profile.process_settings(self.cache)
     update = check_updates = False
     recorder = ActionRecorder()
     remotes = Remotes()
     build_mode = []  # Means build all
     ref = ref or ConanFileReference(None, None, None, None, validate=False)
     options = OptionsValues()
     graph_info = GraphInfo(profile, options, root_ref=ref)
     app = self._get_app()
     deps_graph = app.graph_manager.load_graph(path, create_ref, graph_info,
                                               build_mode, check_updates,
                                               update, remotes, recorder)
     if install:
         binary_installer = BinaryInstaller(app, recorder)
         build_mode = BuildMode(build_mode, app.out)
         binary_installer.install(deps_graph, None, build_mode, update,
                                  False, graph_info)
     return deps_graph
Example #16
0
    def _loader(self, current_path=None, user_settings_values=None, package_settings=None,
                user_options_values=None, scopes=None, env_values=None, use_conaninfo=True):

        # The disk settings definition, already including the default disk values
        settings = self._client_cache.settings

        conaninfo_scopes = Scopes()
        user_options = OptionsValues(user_options_values)
        mixed_env_values = EnvValues()
        mixed_env_values.update(env_values)

        if current_path:
            conan_info_path = os.path.join(current_path, CONANINFO)
            if use_conaninfo and os.path.exists(conan_info_path):
                existing_info = ConanInfo.load_file(conan_info_path)
                settings.values = existing_info.full_settings
                options = existing_info.full_options  # Take existing options from conaninfo.txt
                options.update(user_options)
                user_options = options
                conaninfo_scopes = existing_info.scope
                # Update with info (prioritize user input)
                mixed_env_values.update(existing_info.env_values)

        if user_settings_values:
            aux_values = Values.from_list(user_settings_values)
            settings.values = aux_values

        if scopes:
            conaninfo_scopes.update_scope(scopes)

        self._current_scopes = conaninfo_scopes
        return ConanFileLoader(self._runner, settings, package_settings=package_settings,
                               options=user_options, scopes=conaninfo_scopes,
                               env_values=mixed_env_values)
Example #17
0
def _profile_parse_args(settings, options, envs, conf):
    """ return a Profile object result of parsing raw data
    """
    def _get_tuples_list_from_extender_arg(items):
        if not items:
            return []
        # Validate the pairs
        for item in items:
            chunks = item.split("=", 1)
            if len(chunks) != 2:
                raise ConanException("Invalid input '%s', use 'name=value'" %
                                     item)
        return [(item[0], item[1])
                for item in [item.split("=", 1) for item in items]]

    def _get_simple_and_package_tuples(items):
        """Parse items like "thing:item=value or item2=value2 and returns a tuple list for
        the simple items (name, value) and a dict for the package items
        {package: [(item, value)...)], ...}
        """
        simple_items = []
        package_items = defaultdict(list)
        tuples = _get_tuples_list_from_extender_arg(items)
        for name, value in tuples:
            if ":" in name:  # Scoped items
                tmp = name.split(":", 1)
                ref_name = tmp[0]
                name = tmp[1]
                package_items[ref_name].append((name, value))
            else:
                simple_items.append((name, value))
        return simple_items, package_items

    def _get_env_values(_env, _package_env):
        _env_values = EnvValues()
        for name, value in _env:
            _env_values.add(name, EnvValues.load_value(value))
        for package, data in _package_env.items():
            for name, value in data:
                _env_values.add(name, EnvValues.load_value(value), package)
        return _env_values

    options = _get_tuples_list_from_extender_arg(options)
    env, package_env = _get_simple_and_package_tuples(envs)
    env_values = _get_env_values(env, package_env)
    settings, package_settings = _get_simple_and_package_tuples(settings)

    result = Profile()
    result.options = OptionsValues(options)
    result.env_values = env_values
    result.settings = OrderedDict(settings)
    if conf:
        result.conf = ConfDefinition()
        result.conf.loads("\n".join(conf))

    for pkg, values in package_settings.items():
        result.package_settings[pkg] = OrderedDict(values)

    return result
Example #18
0
 def __init__(self):
     # Sections
     self.processed_settings = None
     self.settings = OrderedDict()
     self.package_settings = defaultdict(OrderedDict)
     self.env_values = EnvValues()
     self.options = OptionsValues()
     self.build_requires = OrderedDict()  # ref pattern: list of ref
Example #19
0
 def __init__(self):
     # Sections
     self.settings = OrderedDict()
     self.package_settings = defaultdict(OrderedDict)
     self.env_values = EnvValues()
     self.options = OptionsValues()
     self.build_requires = OrderedDict(
     )  # conan_ref Pattern: list of conan_ref
Example #20
0
 def loads(text):
     graph_json = json.loads(text)
     profile = graph_json["profile"]
     # FIXME: Reading private very ugly
     profile, _ = _load_profile(profile, None, None)
     try:
         options = graph_json["options"]
     except KeyError:
         options = None
     else:
         options = OptionsValues(options)
     return GraphInfo(profile=profile, options=options)
Example #21
0
    def __init__(self):
        # Input sections, as defined by user profile files and command line
        self.settings = OrderedDict()
        self.package_settings = defaultdict(OrderedDict)
        self.env_values = EnvValues()
        self.options = OptionsValues()
        self.build_requires = OrderedDict()  # ref pattern: list of ref

        # Cached processed values
        self.processed_settings = None  # Settings with values, and smart completion
        self._user_options = None
        self._package_settings_values = None
        self.dev_reference = None  # Reference of the package being develop
Example #22
0
def create_options(conanfile):
    try:
        package_options = PackageOptions(getattr(conanfile, "options", None))
        options = Options(package_options)

        default_options = getattr(conanfile, "default_options", None)
        if default_options:
            if isinstance(default_options, dict):
                default_values = OptionsValues(default_options)
            elif isinstance(default_options, (list, tuple)):
                conan_v2_error("Declare 'default_options' as a dictionary")
                default_values = OptionsValues(default_options)
            elif isinstance(default_options, six.string_types):
                conan_v2_error("Declare 'default_options' as a dictionary")
                default_values = OptionsValues.loads(default_options)
            else:
                raise ConanException("Please define your default_options as list, "
                                     "multiline string or dictionary")
            options.values = default_values
        return options
    except Exception as e:
        raise ConanException("Error while initializing options. %s" % str(e))
Example #23
0
    def loads(text):
        graph_json = json.loads(text)
        try:
            options = graph_json["options"]
        except KeyError:
            options = None
        else:
            options = OptionsValues(options)
        root = graph_json.get("root", {"name": None, "version": None, "user": None, "channel": None})
        root_ref = ConanFileReference(root["name"], root["version"], root["user"], root["channel"],
                                      validate=False)

        return GraphInfo(options=options, root_ref=root_ref)
Example #24
0
def cmd_profile_update(profile_name, key, value, cache_profiles_path):
    first_key, rest_key = _get_profile_keys(key)

    profile, _ = read_profile(profile_name, get_cwd(), cache_profiles_path)
    if first_key == "settings":
        profile.settings[rest_key] = value
    elif first_key == "options":
        tmp = OptionsValues([(rest_key, value)])
        profile.options.update(tmp)
    elif first_key == "env":
        profile.env_values.update_replace(rest_key, value)
    elif first_key == "build_requires":
        raise ConanException("Edit the profile manually to change the build_requires")

    contents = profile.dumps()
    profile_path = get_profile_path(profile_name, cache_profiles_path, get_cwd())
    save(profile_path, contents)
Example #25
0
def create_options(conanfile):
    try:
        package_options = PackageOptions(getattr(conanfile, "options", None))
        options = Options(package_options)

        default_options = getattr(conanfile, "default_options", None)
        if default_options:
            if isinstance(default_options, (list, tuple)):
                default_values = OptionsValues(default_options)
            elif isinstance(default_options, str):
                default_values = OptionsValues.loads(default_options)
            else:
                raise ConanException("Please define your default_options as list or "
                                     "multiline string")
            options.values = default_values
        return options
    except Exception as e:
        raise ConanException("Error while initializing options. %s" % str(e))
Example #26
0
 def loads(text):
     graph_json = json.loads(text)
     profile = graph_json["profile"]
     # FIXME: Reading private very ugly
     profile, _ = _load_profile(profile, None, None)
     try:
         options = graph_json["options"]
     except KeyError:
         options = None
     else:
         options = OptionsValues(options)
     root = graph_json["root"]
     root_ref = ConanFileReference(root["name"],
                                   root["version"],
                                   root["user"],
                                   root["channel"],
                                   validate=False)
     return GraphInfo(profile=profile, options=options, root_ref=root_ref)
Example #27
0
 def test_from_list(self):
     option_values = OptionsValues(self.sut.as_list())
     self.assertEqual(option_values.dumps(), self.sut.dumps())
Example #28
0
 def test_from_dict(self):
     options_as_dict = dict(
         [item.split('=') for item in self.sut.dumps().splitlines()])
     option_values = OptionsValues(options_as_dict)
     self.assertEqual(option_values.dumps(), self.sut.dumps())