def test_module_can_use_template_and_scheme_local_paths(
            self, mock_run_command):
        set_module_args({
            'scheme':
            'local-scheme',
            'template':
            'local-template',
            'schemes_source':
            os.path.join(
                os.path.dirname(__file__),
                'fixtures',
                'sources',
                'schemes',
            ),
            'templates_source':
            os.path.join(
                os.path.dirname(__file__),
                'fixtures',
                'sources',
                'templates',
            ),
            'cache_dir':
            self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertEqual(result_args['changed'], False)

        self.assertFalse(
            call([
                ANY,
                'clone',
                ANY,
                ANY,
            ], check_rc=True) in mock_run_command.mock_calls)

        self.assertEqual(
            result_args['schemes'],
            {
                'local-scheme-night': {
                    'local-template': {
                        'themes': {
                            'base16-local-scheme-night.test': "000000\n"
                        },
                    }
                },
                'local-scheme': {
                    'local-template': {
                        'themes': {
                            'base16-local-scheme.test': "111111\n"
                        },
                    }
                },
            },
        )
    def test_module_can_use_template_and_scheme_repos(self, mock_run_command):
        set_module_args({
            'scheme': 'tomorrow-night',
            'template': 'i3',
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()

        set_module_args({
            'scheme': 'tomorrow-night',
            'template': 'i3',
            'schemes_source':
            'https://github.com/mnussbaum/base16-schemes-source',
            'templates_source':
            'https://github.com/mnussbaum/base16-templates-source',
            'cache_dir': self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertEqual(result_args['changed'], True)

        schemes_source = os.path.join(
            self.test_cache_dir,
            'base16-builder-ansible',
            'sources',
            'schemes',
        )
        self.assertTrue(os.path.exists(schemes_source))
        self.assertTrue(
            call([
                ANY,
                'clone',
                'https://github.com/mnussbaum/base16-schemes-source',
                ANY,
            ],
                 check_rc=True) in mock_run_command.mock_calls)

        templates_source = os.path.join(
            self.test_cache_dir,
            'base16-builder-ansible',
            'sources',
            'templates',
        )
        self.assertTrue(os.path.exists(templates_source))
        self.assertTrue(
            call([
                ANY,
                'clone',
                'https://github.com/mnussbaum/base16-templates-source',
                ANY,
            ],
                 check_rc=True) in mock_run_command.mock_calls)
    def test_module_builds_nothing_if_build_false_is_passed(
            self, mock_run_command):
        set_module_args({'build': False})

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertEqual(result_args['changed'], False)
        self.assertEqual(result_args['schemes'], {})
    def test_module_builds_everything_if_no_scheme_or_template_is_passed(
            self, mock_run_command):
        set_module_args({'cache_dir': self.test_cache_dir})

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertTrue(len(result_args['schemes'].keys()) > 1)
        self.assertTrue(
            len(result_args['schemes']['tomorrow-night'].keys()) > 1)
    def test_module_update_runs(self, mock_run_command):
        set_module_args({
            'update': True,
            'build': False,
            'cache_dir': self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertEqual(result_args['changed'], True)
        self.assertEqual(result_args['schemes'], {})
    def test_module_update_runs(self, mock_run_command):
        set_module_args({
            "update": True,
            "build": False,
            "cache_dir": self.test_cache_dir
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertEqual(result_args["changed"], True)
        self.assertEqual(result_args["schemes"], {})
    def test_module_can_use_template_and_scheme_repos(self, mock_run_command):
        set_module_args({"scheme": "tomorrow-night", "template": "i3"})

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()

        set_module_args({
            "scheme": "tomorrow-night",
            "template": "i3",
            "schemes_source":
            "https://github.com/mnussbaum/base16-schemes-source",
            "templates_source":
            "https://github.com/mnussbaum/base16-templates-source",
            "cache_dir": self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertEqual(result_args["changed"], True)

        schemes_source = os.path.join(self.test_cache_dir,
                                      "base16-builder-ansible", "sources",
                                      "schemes")
        self.assertTrue(os.path.exists(schemes_source))
        self.assertTrue(
            call(
                [
                    ANY,
                    "clone",
                    "https://github.com/mnussbaum/base16-schemes-source",
                    ANY,
                ],
                check_rc=True,
            ) in mock_run_command.mock_calls)

        templates_source = os.path.join(self.test_cache_dir,
                                        "base16-builder-ansible", "sources",
                                        "templates")
        self.assertTrue(os.path.exists(templates_source))
        self.assertTrue(
            call(
                [
                    ANY,
                    "clone",
                    "https://github.com/mnussbaum/base16-templates-source",
                    ANY,
                ],
                check_rc=True,
            ) in mock_run_command.mock_calls)
    def test_module_builds_a_scheme_if_family_name_differs_and_is_passed_in(
            self, mock_run_command):
        set_module_args({
            'scheme': 'material-palenight',
            'scheme_family': 'materialtheme',
            'template': 'i3',
            'cache_dir': self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertIn('material-palenight', result_args['schemes'])
    def test_module_builds_all_schemes_in_a_family_if_family_name_is_passed(
            self, mock_run_command):
        set_module_args({
            'scheme': 'tomorrow',
            'template': 'i3',
            'cache_dir': self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertIn('tomorrow-night', result_args['schemes'])
        self.assertIn('tomorrow', result_args['schemes'])
    def test_module_builds_all_schemes_in_a_family_if_family_name_is_passed(
            self, mock_run_command):
        set_module_args({
            "scheme": "tomorrow",
            "template": "i3",
            "cache_dir": self.test_cache_dir
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertIn("tomorrow-night", result_args["schemes"])
        self.assertIn("tomorrow", result_args["schemes"])
    def test_module_can_use_template_and_scheme_local_paths(
            self, mock_run_command):
        set_module_args({
            "scheme":
            "local-scheme",
            "template":
            "local-template",
            "schemes_source":
            os.path.join(os.path.dirname(__file__), "fixtures", "sources",
                         "schemes"),
            "templates_source":
            os.path.join(os.path.dirname(__file__), "fixtures", "sources",
                         "templates"),
            "cache_dir":
            self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertEqual(result_args["changed"], False)

        self.assertFalse(
            call([ANY, "clone", ANY, ANY], check_rc=True) in
            mock_run_command.mock_calls)

        self.assertEqual(
            result_args["schemes"],
            {
                "local-scheme-night": {
                    "local-template": {
                        "themes": {
                            "base16-local-scheme-night.test":
                            "000000\n00\n00\n00\n0\n0\n0\n0.0\n0.0\n0.0\n"
                        }
                    },
                    "scheme-variables": ANY,
                },
                "local-scheme": {
                    "local-template": {
                        "themes": {
                            "base16-local-scheme.test":
                            "111111\n11\n11\n11\n17\n17\n17\n0.06666666666666667\n0.06666666666666667\n0.06666666666666667\n"
                        }
                    },
                    "scheme-variables": ANY,
                },
            },
        )
    def test_module_builds_a_scheme_if_family_name_differs_and_is_passed_in(
            self, mock_run_command):
        set_module_args({
            "scheme": "material-palenight",
            "scheme_family": "materialtheme",
            "template": "i3",
            "cache_dir": self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertIn("material-palenight", result_args["schemes"])
    def test_module_update_runs_with_build(self, mock_run_command):
        set_module_args({
            'update': True,
            'scheme': 'tomorrow-night',
            'template': 'i3',
            'cache_dir': self.test_cache_dir
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertEqual(list(result_args['schemes'].keys()),
                         ['tomorrow-night'])
        self.assertEqual(result_args['changed'], True)
    def test_module_update_runs_with_build(self, mock_run_command):
        set_module_args({
            "update": True,
            "scheme": "tomorrow-night",
            "template": "i3",
            "cache_dir": self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertEqual(list(result_args["schemes"].keys()),
                         ["tomorrow-night"])
        self.assertEqual(result_args["changed"], True)
    def test_module_update_can_use_template_and_scheme(self, mock_run_command):
        set_module_args({
            "update": True,
            "build": False,
            "scheme": "",
            "template": "",
            "cache_dir": self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        self.assertEqual(
            [
                call(
                    [
                        ANY,
                        "clone",
                        "https://github.com/chriskempson/base16-schemes-source",
                        ANY,
                    ],
                    check_rc=True,
                ),
                call(
                    [
                        ANY,
                        "clone",
                        "https://github.com/chriskempson/base16-templates-source",
                        ANY,
                    ],
                    check_rc=True,
                ),
            ],
            mock_run_command.mock_calls,
        )

        self.assertEqual(list(result_args["schemes"].keys()), [])
        self.assertTrue(result_args["changed"])
    def test_module_builds_a_given_scheme_and_template(self, mock_run_command):
        set_module_args({
            'scheme': 'tomorrow-night',
            'template': 'i3',
            'cache_dir': self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        with open(
                os.path.join(
                    os.path.dirname(__file__),
                    'fixtures',
                    'templates',
                    'i3',
                    'bar-colors',
                    'base16-tomorrow-night.config',
                )) as f:
            i3_tomorrow_night_bar_colors = f.read()
        with open(
                os.path.join(
                    os.path.dirname(__file__),
                    'fixtures',
                    'templates',
                    'i3',
                    'client-properties',
                    'base16-tomorrow-night.config',
                )) as f:
            i3_tomorrow_night_client_properties = f.read()
        with open(
                os.path.join(
                    os.path.dirname(__file__),
                    'fixtures',
                    'templates',
                    'i3',
                    'colors',
                    'base16-tomorrow-night.config',
                )) as f:
            i3_tomorrow_night_colors = f.read()
        with open(
                os.path.join(
                    os.path.dirname(__file__),
                    'fixtures',
                    'templates',
                    'i3',
                    'themes',
                    'base16-tomorrow-night.config',
                )) as f:
            i3_tomorrow_night = f.read()

        self.assertEqual(
            result_args['schemes'], {
                'tomorrow-night': {
                    'i3': {
                        'bar-colors': {
                            'base16-tomorrow-night.config':
                            i3_tomorrow_night_bar_colors
                        },
                        'colors': {
                            'base16-tomorrow-night.config':
                            i3_tomorrow_night_colors
                        },
                        'client-properties': {
                            'base16-tomorrow-night.config':
                            i3_tomorrow_night_client_properties
                        },
                        'themes': {
                            'base16-tomorrow-night.config': i3_tomorrow_night
                        },
                    }
                }
            })
    def test_module_builds_a_given_scheme_and_template(self, mock_run_command):
        set_module_args({
            "scheme": "tomorrow-night",
            "template": "i3",
            "cache_dir": self.test_cache_dir,
        })

        with self.assertRaises(AnsibleExitJson) as result:
            base16_builder.main()
        result_args = result.exception.args[0]

        with open(
                os.path.join(
                    os.path.dirname(__file__),
                    "fixtures",
                    "templates",
                    "i3",
                    "bar-colors",
                    "base16-tomorrow-night.config",
                )) as f:
            i3_tomorrow_night_bar_colors = f.read()
        with open(
                os.path.join(
                    os.path.dirname(__file__),
                    "fixtures",
                    "templates",
                    "i3",
                    "client-properties",
                    "base16-tomorrow-night.config",
                )) as f:
            i3_tomorrow_night_client_properties = f.read()
        with open(
                os.path.join(
                    os.path.dirname(__file__),
                    "fixtures",
                    "templates",
                    "i3",
                    "colors",
                    "base16-tomorrow-night.config",
                )) as f:
            i3_tomorrow_night_colors = f.read()
        with open(
                os.path.join(
                    os.path.dirname(__file__),
                    "fixtures",
                    "templates",
                    "i3",
                    "themes",
                    "base16-tomorrow-night.config",
                )) as f:
            i3_tomorrow_night = f.read()

        self.assertEqual(
            result_args["schemes"],
            {
                "tomorrow-night": {
                    "i3": {
                        "bar-colors": {
                            "base16-tomorrow-night.config":
                            i3_tomorrow_night_bar_colors
                        },
                        "colors": {
                            "base16-tomorrow-night.config":
                            i3_tomorrow_night_colors
                        },
                        "client-properties": {
                            "base16-tomorrow-night.config":
                            i3_tomorrow_night_client_properties
                        },
                        "themes": {
                            "base16-tomorrow-night.config": i3_tomorrow_night
                        },
                    },
                    "scheme-variables": {
                        "base00-dec-b": "0.12941176470588237",
                        "base00-dec-g": "0.12156862745098039",
                        "base00-dec-r": "0.11372549019607843",
                        "base00-hex": "1d1f21",
                        "base00-hex-bgr": "211f1d",
                        "base00-hex-b": "21",
                        "base00-hex-g": "1f",
                        "base00-hex-r": "1d",
                        "base00-rgb-b": "33",
                        "base00-rgb-g": "31",
                        "base00-rgb-r": "29",
                        "base01-dec-b": "0.1803921568627451",
                        "base01-dec-g": "0.16470588235294117",
                        "base01-dec-r": "0.1568627450980392",
                        "base01-hex": "282a2e",
                        "base01-hex-bgr": "2e2a28",
                        "base01-hex-b": "2e",
                        "base01-hex-g": "2a",
                        "base01-hex-r": "28",
                        "base01-rgb-b": "46",
                        "base01-rgb-g": "42",
                        "base01-rgb-r": "40",
                        "base02-dec-b": "0.2549019607843137",
                        "base02-dec-g": "0.23137254901960785",
                        "base02-dec-r": "0.21568627450980393",
                        "base02-hex": "373b41",
                        "base02-hex-bgr": "413b37",
                        "base02-hex-b": "41",
                        "base02-hex-g": "3b",
                        "base02-hex-r": "37",
                        "base02-rgb-b": "65",
                        "base02-rgb-g": "59",
                        "base02-rgb-r": "55",
                        "base03-dec-b": "0.5882352941176471",
                        "base03-dec-g": "0.596078431372549",
                        "base03-dec-r": "0.5882352941176471",
                        "base03-hex": "969896",
                        "base03-hex-bgr": "969896",
                        "base03-hex-b": "96",
                        "base03-hex-g": "98",
                        "base03-hex-r": "96",
                        "base03-rgb-b": "150",
                        "base03-rgb-g": "152",
                        "base03-rgb-r": "150",
                        "base04-dec-b": "0.7058823529411765",
                        "base04-dec-g": "0.7176470588235294",
                        "base04-dec-r": "0.7058823529411765",
                        "base04-hex": "b4b7b4",
                        "base04-hex-bgr": "b4b7b4",
                        "base04-hex-b": "b4",
                        "base04-hex-g": "b7",
                        "base04-hex-r": "b4",
                        "base04-rgb-b": "180",
                        "base04-rgb-g": "183",
                        "base04-rgb-r": "180",
                        "base05-dec-b": "0.7764705882352941",
                        "base05-dec-g": "0.7843137254901961",
                        "base05-dec-r": "0.7725490196078432",
                        "base05-hex": "c5c8c6",
                        "base05-hex-bgr": "c6c8c5",
                        "base05-hex-b": "c6",
                        "base05-hex-g": "c8",
                        "base05-hex-r": "c5",
                        "base05-rgb-b": "198",
                        "base05-rgb-g": "200",
                        "base05-rgb-r": "197",
                        "base06-dec-b": "0.8784313725490196",
                        "base06-dec-g": "0.8784313725490196",
                        "base06-dec-r": "0.8784313725490196",
                        "base06-hex": "e0e0e0",
                        "base06-hex-bgr": "e0e0e0",
                        "base06-hex-b": "e0",
                        "base06-hex-g": "e0",
                        "base06-hex-r": "e0",
                        "base06-rgb-b": "224",
                        "base06-rgb-g": "224",
                        "base06-rgb-r": "224",
                        "base07-dec-b": "1.0",
                        "base07-dec-g": "1.0",
                        "base07-dec-r": "1.0",
                        "base07-hex": "ffffff",
                        "base07-hex-bgr": "ffffff",
                        "base07-hex-b": "ff",
                        "base07-hex-g": "ff",
                        "base07-hex-r": "ff",
                        "base07-rgb-b": "255",
                        "base07-rgb-g": "255",
                        "base07-rgb-r": "255",
                        "base08-dec-b": "0.4",
                        "base08-dec-g": "0.4",
                        "base08-dec-r": "0.8",
                        "base08-hex": "cc6666",
                        "base08-hex-bgr": "6666cc",
                        "base08-hex-b": "66",
                        "base08-hex-g": "66",
                        "base08-hex-r": "cc",
                        "base08-rgb-b": "102",
                        "base08-rgb-g": "102",
                        "base08-rgb-r": "204",
                        "base09-dec-b": "0.37254901960784315",
                        "base09-dec-g": "0.5764705882352941",
                        "base09-dec-r": "0.8705882352941177",
                        "base09-hex": "de935f",
                        "base09-hex-bgr": "5f93de",
                        "base09-hex-b": "5f",
                        "base09-hex-g": "93",
                        "base09-hex-r": "de",
                        "base09-rgb-b": "95",
                        "base09-rgb-g": "147",
                        "base09-rgb-r": "222",
                        "base0A-dec-b": "0.4549019607843137",
                        "base0A-dec-g": "0.7764705882352941",
                        "base0A-dec-r": "0.9411764705882353",
                        "base0A-hex": "f0c674",
                        "base0A-hex-bgr": "74c6f0",
                        "base0A-hex-b": "74",
                        "base0A-hex-g": "c6",
                        "base0A-hex-r": "f0",
                        "base0A-rgb-b": "116",
                        "base0A-rgb-g": "198",
                        "base0A-rgb-r": "240",
                        "base0B-dec-b": "0.40784313725490196",
                        "base0B-dec-g": "0.7411764705882353",
                        "base0B-dec-r": "0.7098039215686275",
                        "base0B-hex": "b5bd68",
                        "base0B-hex-bgr": "68bdb5",
                        "base0B-hex-b": "68",
                        "base0B-hex-g": "bd",
                        "base0B-hex-r": "b5",
                        "base0B-rgb-b": "104",
                        "base0B-rgb-g": "189",
                        "base0B-rgb-r": "181",
                        "base0C-dec-b": "0.7176470588235294",
                        "base0C-dec-g": "0.7450980392156863",
                        "base0C-dec-r": "0.5411764705882353",
                        "base0C-hex": "8abeb7",
                        "base0C-hex-bgr": "b7be8a",
                        "base0C-hex-b": "b7",
                        "base0C-hex-g": "be",
                        "base0C-hex-r": "8a",
                        "base0C-rgb-b": "183",
                        "base0C-rgb-g": "190",
                        "base0C-rgb-r": "138",
                        "base0D-dec-b": "0.7450980392156863",
                        "base0D-dec-g": "0.6352941176470588",
                        "base0D-dec-r": "0.5058823529411764",
                        "base0D-hex": "81a2be",
                        "base0D-hex-bgr": "bea281",
                        "base0D-hex-b": "be",
                        "base0D-hex-g": "a2",
                        "base0D-hex-r": "81",
                        "base0D-rgb-b": "190",
                        "base0D-rgb-g": "162",
                        "base0D-rgb-r": "129",
                        "base0E-dec-b": "0.7333333333333333",
                        "base0E-dec-g": "0.5803921568627451",
                        "base0E-dec-r": "0.6980392156862745",
                        "base0E-hex": "b294bb",
                        "base0E-hex-bgr": "bb94b2",
                        "base0E-hex-b": "bb",
                        "base0E-hex-g": "94",
                        "base0E-hex-r": "b2",
                        "base0E-rgb-b": "187",
                        "base0E-rgb-g": "148",
                        "base0E-rgb-r": "178",
                        "base0F-dec-b": "0.35294117647058826",
                        "base0F-dec-g": "0.40784313725490196",
                        "base0F-dec-r": "0.6392156862745098",
                        "base0F-hex": "a3685a",
                        "base0F-hex-bgr": "5a68a3",
                        "base0F-hex-b": "5a",
                        "base0F-hex-g": "68",
                        "base0F-hex-r": "a3",
                        "base0F-rgb-b": "90",
                        "base0F-rgb-g": "104",
                        "base0F-rgb-r": "163",
                        "scheme-author":
                        "Chris Kempson (http://chriskempson.com)",
                        "scheme-name": "Tomorrow Night",
                        "scheme-slug": "tomorrow-night",
                        "scheme-slug-underscored": "tomorrow_night",
                    },
                }
            },
        )