예제 #1
0
 def _get_source_supporting_files_dir(self, project_name: str,
                                      project_output_dir: str,
                                      project_package: str):
     subDirs = project_package.split('.')
     outputDir = os.path.join(project_output_dir,
                              self._get_module_name(project_name), 'src',
                              'main', 'java', *subDirs)
     utils.make_dir(outputDir)
     return outputDir
예제 #2
0
    def run(self, output_dir, db, project, project_version, project_namespaces,
            project_languages, default_language):
        json_dir = os.path.join(output_dir, 'json')
        print('  Creating json output directory')
        utils.make_dir(json_dir)

        for language in project_languages:
            language_file = os.path.join(
                json_dir, '{}.json'.format(language['slug'].strip().lower()))

            language_namespaces = {}

            for project_namespace in project_namespaces:
                translated_keys = db.get_translated_keys(
                    project_namespace['id'], language['id'])
                count_translated_keys = len(translated_keys)

                skip_text = ''

                if count_translated_keys == 0:
                    skip_text = ', skipping it'

                print('      Found {} keys for namespace {} with locale {}{}'.
                      format(len(translated_keys), project_namespace['name'],
                             language['slug'], skip_text))

                if count_translated_keys > 0:
                    current_namespace = {}
                    for translated_key in translated_keys:
                        value = translated_key['value'].strip()
                        placeholders = utils.get_placeholders(
                            translated_key['value'])

                        # Replace placeholders format from ${name} to {{name}}
                        if placeholders:
                            for placeholder in placeholders:
                                value = value.replace(
                                    placeholder.placeholder,
                                    '{{' + placeholder.variableName + '}}')

                        current_namespace[utils.filter_chars_numbers(
                            translated_key['key'])] = value
                    language_namespaces[utils.filter_chars_numbers(
                        project_namespace['name'])] = current_namespace

            with open(language_file, 'w') as json_file:
                json.dump(language_namespaces, json_file)
예제 #3
0
 def _get_supporting_files_dir(self, project_output_dir: str):
     outputDir = os.path.join(project_output_dir, 'Sources',
                              'LocaliserExtensions')
     utils.make_dir(outputDir)
     return outputDir
예제 #4
0
    def run(self, output_dir, db, project, project_version, project_namespaces,
            project_languages, default_language):
        print('  Creating {} output directory'.format(self.name()))
        generator_output_path = os.path.join(
            output_dir, self.get_base_output_directory_name())
        generator_environment = jinja2.Environment(
            loader=jinja2.PackageLoader(self.get_package_name()))
        # https://stackoverflow.com/a/35777386
        generator_environment.trim_blocks = True
        generator_environment.lstrip_blocks = True

        utils.make_dir(generator_output_path)

        print('  Creating {} supporting files'.format(self.name()))

        available_namespaces = []

        for project_namespace in project_namespaces:
            localised_keys = db.get_namespace_localised_keys(
                project_namespace['id'], default_language['id'])

            if localised_keys:
                available_namespaces.append(project_namespace['name'])
                self.generate_namespace_supporting_files(
                    NamespaceSupportingFilesArguments(
                        project_name=project['name'],
                        project_short_identifier=project['short_identifier'],
                        project_package=project['package'],
                        project_version=project_version,
                        namespace_name=project_namespace['name'],
                        localised_keys=localised_keys,
                        project_output_dir=generator_output_path,
                        environment=generator_environment))

        self.generate_project_supporting_files(
            ProjectSupportingFilesArguments(
                project_name=project['name'],
                project_language=default_language['slug'],
                project_organization=project['organization'],
                project_short_identifier=project['short_identifier'],
                project_package=project['package'].strip(),
                project_version=project_version,
                project_namespaces=available_namespaces,
                project_android_min_sdk=project['android_min_sdk'],
                project_internal_maven_repo=project['internal_maven_repo_url'],
                project_nexus_maven_repo=project['nexus_maven_repo_url'],
                project_ios_deployment_target=project['ios_deployment_target'].
                strip(),
                project_output_dir=generator_output_path,
                environment=generator_environment))

        localisation_base_path = os.path.join(
            generator_output_path,
            self.get_localisation_directory_base_path(
                project['name'], project['short_identifier']))
        utils.make_dir(localisation_base_path)

        for projectLanguage in project_languages:
            language_directory_name = self.get_localisation_directory_name(
                slug=projectLanguage['slug'].strip().lower(),
                default_slug=default_language['slug'].strip().lower())

            print('    Creating {}'.format(language_directory_name))
            language_directory = os.path.join(localisation_base_path,
                                              language_directory_name)
            utils.make_dir(language_directory)

            for project_namespace in project_namespaces:
                translated_keys = db.get_translated_keys(
                    project_namespace['id'], projectLanguage['id'])
                count_translated_keys = len(translated_keys)

                skip_text = ''

                if count_translated_keys == 0:
                    skip_text = ', skipping it'

                print('      Found {} keys for namespace {} with locale {}{}'.
                      format(len(translated_keys), project_namespace['name'],
                             projectLanguage['slug'], skip_text))

                if count_translated_keys > 0:
                    output_file_name = self.get_namespace_file_name(
                        project_namespace['name'])

                    with open(
                            os.path.join(language_directory, output_file_name),
                            'w') as namespaceFile:
                        template = generator_environment.get_template(
                            self.get_namespace_template())
                        namespaceFile.write(
                            template.render(
                                keyPrefix=self.get_namespace_key_prefix(
                                    project_namespace['name']),
                                translatedKeys=translated_keys))
예제 #5
0
    def generate_project_supporting_files(
            self, arguments: ProjectSupportingFilesArguments):
        outputDir = self._get_source_supporting_files_dir(
            arguments.project_name, arguments.project_output_dir,
            arguments.project_package)
        moduleOutputDir = os.path.join(
            arguments.project_output_dir,
            self._get_module_name(arguments.project_name))

        moduleMainOutputDir = os.path.join(moduleOutputDir, 'src', 'main')
        projectGroup = '.'.join(arguments.project_package.split('.')[:2])
        moduleName = self._get_module_name(arguments.project_name)

        outputFile = os.path.join(
            outputDir, '{}Strings.kt'.format(
                arguments.project_short_identifier.capitalize()))

        with open(outputFile, 'w') as file:
            template = arguments.environment.get_template('Project.kt')
            file.write(
                template.render(
                    projectName=arguments.project_name,
                    projectShortIdentifier=arguments.project_short_identifier,
                    projectPackage=arguments.project_package,
                    projectNamespaces=[
                        self._sanitize_namespace(n)
                        for n in arguments.project_namespaces
                    ]))

        self._copy_raw_file(
            environment=arguments.environment,
            template_name='gradle/gitignore',
            destination=os.path.join(arguments.project_output_dir,
                                     '.gitignore'),
        )

        self._copy_raw_file(environment=arguments.environment,
                            template_name='gradle/gradlew',
                            destination=os.path.join(
                                arguments.project_output_dir, 'gradlew'),
                            executable=True)

        self._copy_raw_file(
            environment=arguments.environment,
            template_name='gradle/gradlew.bat',
            destination=os.path.join(arguments.project_output_dir,
                                     'gradlew.bat'),
        )

        self._copy_raw_file(
            environment=arguments.environment,
            template_name='gradle/gradle.properties',
            destination=os.path.join(arguments.project_output_dir,
                                     'gradle.properties'),
        )

        self._copy_raw_file(
            environment=arguments.environment,
            template_name='gradle/build.gradle',
            destination=os.path.join(arguments.project_output_dir,
                                     'build.gradle'),
        )

        self._copy_raw_file(
            environment=arguments.environment,
            template_name='gradle/module/proguard-rules.pro',
            destination=os.path.join(moduleOutputDir, 'proguard-rules.pro'),
        )

        wrapperOutDir = os.path.join(arguments.project_output_dir, 'gradle',
                                     'wrapper')
        utils.make_dir(wrapperOutDir)

        self._copy_raw_file(
            environment=arguments.environment,
            template_name='gradle/wrapper/gradle-wrapper.properties',
            destination=os.path.join(wrapperOutDir,
                                     'gradle-wrapper.properties'),
        )

        # This is absolute madness. No way of getting a gradle-wrapper.jar from an URL.
        # So in order to generate a fully functional project, a cached one in base64 must be used.
        with open(os.path.join(wrapperOutDir, 'gradle-wrapper.jar'),
                  'wb') as file:
            template = arguments.environment.get_template(
                'gradle/wrapper/gradle-wrapper.jar.b64')
            base64data = template.render()
            file.write(base64.b64decode(base64data))

        outputFile = os.path.join(arguments.project_output_dir,
                                  'manifest.gradle')

        with open(outputFile, 'w') as file:
            template = arguments.environment.get_template(
                'gradle/manifest.gradle')
            file.write(
                template.render(
                    projectName=arguments.project_name,
                    projectShortIdentifier=arguments.project_short_identifier,
                    projectVersion=arguments.project_version,
                    projectOrganization=arguments.project_organization,
                    projectInternalMavenRepo=arguments.
                    project_internal_maven_repo,
                    projectNexusMavenRepo=arguments.project_nexus_maven_repo,
                    projectAndroidMinSdk=arguments.project_android_min_sdk,
                    projectGroup=projectGroup,
                    moduleName=moduleName))

        outputFile = os.path.join(arguments.project_output_dir, 'README.md')

        with open(outputFile, 'w') as file:
            template = arguments.environment.get_template('README.md')
            file.write(
                template.render(
                    projectName=arguments.project_name,
                    projectShortIdentifier=arguments.project_short_identifier,
                    projectInternalMavenRepo=arguments.
                    project_internal_maven_repo,
                    projectNexusMavenRepo=arguments.project_nexus_maven_repo,
                    projectVersion=arguments.project_version,
                    projectGroup=projectGroup,
                    moduleName=moduleName))

        outputFile = os.path.join(moduleMainOutputDir, 'AndroidManifest.xml')

        with open(outputFile, 'w') as file:
            template = arguments.environment.get_template(
                'gradle/module/AndroidManifest.xml')
            file.write(
                template.render(projectPackage=arguments.project_package))

        self._copy_raw_file(
            environment=arguments.environment,
            template_name='gradle/module/build.gradle',
            destination=os.path.join(moduleOutputDir, 'build.gradle'),
        )

        outputFile = os.path.join(arguments.project_output_dir, 'LICENSE')

        with open(outputFile, 'w') as file:
            template = arguments.environment.get_template('LICENSE')
            file.write(
                template.render(
                    projectOrganization=arguments.project_organization,
                    year=time.strftime("%Y")))

        outputFile = os.path.join(arguments.project_output_dir,
                                  'settings.gradle')

        with open(outputFile, 'w') as file:
            template = arguments.environment.get_template(
                'gradle/settings.gradle')
            file.write(
                template.render(libraryModule=self._get_module_name(
                    arguments.project_name)))