[
  {
    "path": ".codeclimate.yml",
    "content": "engines:\n  radon:\n    enabled: true\n\n  duplication:\n    enabled: true\n    config:\n      languages:\n      - python\n    exclude_fingerprints:\n  FIXME:\n    enabled: true\n\nratings:\n  paths:\n  - nslocalizer/\n\nexclude_paths:\n- examples/\n- tests/\n- tools/\n- \"*.md\"\n- \"*.yml\"\n- \"*.ini\"\n- Makefile\n- Dangerfile\n- Gemfile\n- LICENSE\n- contributing/\n- docs/\n- setup.py\n- nslocalizer.py"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "<!-- REQUIRED FIELDS -->\n**Type of issue**: [ Bug | Enhancement | Request ]\n\n---\n\n**Related Files**: \n\n---\n\n**Description**:\n\n\n---\n\n<!-- OPTIONAL FIELDS, REMOVE THE FIELDS THAT ARE NOT APPLICABLE -->\n**Crash Report**:\n<details>\n <summary>Summary Goes Here</summary>\n```\n...crash report trace goes here...\n```\n</details>\n\n---\n\n**Sample File**:\n<details>\n <summary>`sample.pyconfig`</summary>\n```\n...sample.pyconfig contents go here...\n```\n</details>\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!-- REQUIRED FIELDS -->\n**Title**:\n\n---\n\n**Description**:\n<!-- \nPlease create a list of changes using the following format: \n* Top level change description, this can be a couple of sentences. please be descriptive.\n\t- <commit hash of relevant change regarding the described change>\n\t- <commit hash of another relevant change>\n-->"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\ninstalled_files.txt\nbuild/\ndist/\nnslocalizer.egg-info/\n.tox/\n.coverage\n*.pyc\n__pycache__/\nhtmlcov/\n.eggs/\nlint_output.txt\n*_output.plist"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"docs\"]\n\tpath = docs\n\turl = https://samdmarshall@github.com/samdmarshall/pylocalizer.wiki.git\n"
  },
  {
    "path": "Dangerfile",
    "content": "# this dangerfile sets values that will be consumed by the global danger \n# file. The global dangerfile is run automatically after this repo-specific \n# file is run. The global dangerfile is located at: https://github.com/samdmarshall/danger\n\n# set the number of lines that must be changed before this classifies as a 'Big PR'\n@SDM_DANGER_BIG_PR_LINES = 75\n\n# set the files to watch and warn about if there are changes made\n@SDM_DANGER_BUILD_FILES = ['Makefile', 'Gemfile', 'Dangerfile', 'circle.yml', '.codeclimate.yml', 'tox.ini', 'pylintrc']\n\n# set the files to watch and warn about if there are \n@SDM_DANGER_INSTALL_REQUIREMENTS_FILES = ['requirements.txt', 'setup.py']\n\n# set the files to watch and fail if there are changes\n@SDM_DANGER_IMMUTABLE_FILES = ['LICENSE', 'contributing.md', 'contributing/code-of-conduct.md']\n\n# mark the paths that should be reported as part of the circle ci build artifacts\n@SDM_DANGER_REPORT_CIRCLE_CI_ARTIFACTS = Array[\n  {\n    'message'=> 'html coverage report',\n    'path'=> 'htmlcov/index.html'\n  },\n  {\n    'message'=> 'linter report',\n    'path'=> 'lint_output.txt'\n  }\n]\n"
  },
  {
    "path": "Gemfile",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n# \n# Redistribution and use in source and binary forms, with or without modification, \n# are permitted provided that the following conditions are met:\n# \n# 1. Redistributions of source code must retain the above copyright notice, this \n# list of conditions and the following disclaimer.\n# \n# 2. Redistributions in binary form must reproduce the above copyright notice, \n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n# \n# 3. Neither the name of Samantha Marshall nor the names of its contributors may \n# be used to endorse or promote products derived from this software without \n# specific prior written permission.\n# \n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR \n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nsource 'https://rubygems.org'\n\ngem 'danger'\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2016, Samantha Marshall\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of Samantha Marshall nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "Makefile",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# Variables\n\n# path to installation record that gets written when performing:\n# - make build2\n# - make build3\n\nINSTALLED_FILES_RECORD := ./installed_files.txt\n\n# names of the executables that are used as a part of this project\n\nPYTHON3_CMD := python3\nTOX_CMD := tox\nCOVERAGE_CMD := coverage\nDANGER_CMD := danger\nGEM_CMD := gem\nFIND_CMD := find\nRM_CMD := rm\nWHICH_CMD := which\nXARGS_CMD := xargs\nPRINTF_CMD := printf\nTOUCH_CMD := touch\nCP_CMD := cp\nCAT_CMD := cat\nPIP_CMD := pip\nPIP3_CMD := pip3\nCCTREPORTER_CMD := codeclimate-test-reporter\nUNAME_CMD := uname\nEXIT_CMD := exit\nTPUT_CMD := tput\nTR_CMD := tr\nPYLINT_CMD := pylint\nBREW_CMD := brew\nPYENV_CMD := pyenv\n\nTOX_PYENV := tox-pyenv\nPYOBJC_CORE := pyobjc-core\nPYOBJC_COCOA := pyobjc-framework-Cocoa\n\n\n# invoke the specific executable command\n\nPYTHON3 = $(shell command -v $(PYTHON3_CMD) 2> /dev/null)\nTOX = $(shell command -v $(TOX_CMD) 2> /dev/null)\nCOVERAGE = $(shell command -v $(COVERAGE_CMD) 2> /dev/null)\nDANGER = $(shell command -v $(DANGER_CMD) 2> /dev/null)\nGEM = $(shell command -v $(GEM_CMD) 2> /dev/null)\nFIND = $(shell command -v $(FIND_CMD) 2> /dev/null)\nRM = $(shell command -v $(RM_CMD) 2> /dev/null)\nWHICH = $(shell command -v $(WHICH_CMD) 2> /dev/null)\nXARGS = $(shell command -v $(XARGS_CMD) 2> /dev/null)\nPRINTF = $(shell command -v $(PRINTF_CMD) 2> /dev/null)\nTOUCH = $(shell command -v $(TOUCH_CMD) 2> /dev/null)\nCP = $(shell command -v $(CP_CMD) 2> /dev/null)\nCAT = $(shell command -v $(CAT_CMD) 2> /dev/null)\nPIP = $(shell command -v $(PIP_CMD) 2> /dev/null)\nPIP3 = $(shell command -v $(PIP3_CMD) 2> /dev/null)\nCCTREPORTER = $(shell command -v $(CCTREPORTER_CMD) 2> /dev/null)\nUNAME = $(shell command -v $(UNAME_CMD) 2> /dev/null)\nEXIT = $(shell command -v $(EXIT_CMD) 2> /dev/null)\nTPUT = $(shell command -v $(TPUT_CMD) 2> /dev/null)\nTR = $(shell command -v $(TR_CMD) 2> /dev/null)\nPYLINT = $(shell command -v $(PYLINT_CMD) 2> /dev/null)\nBREW = $(shell command -v $(BREW_CMD) 2> /dev/null)\nPYENV = $(shell command -v $(PYENV_CMD) 2> /dev/null)\n\nSYSTEM := $(shell $(UNAME) -s)\nifeq ($(SYSTEM),Darwin)\n\tUSER_FLAG := --user\nelse\n\tUSER_FLAG :=\nendif\n\nTERM_COLUMNS := `$(TPUT) cols`\nDISPLAY_SEPARATOR := $(PRINTF) \"%*.s\\n\" $(TERM_COLUMNS) \" \" | $(TR) ' ' '='\n\n# Targets\n\n# ---\n\ncheckfor = @$(PRINTF) \"Checking for $1...\"; \\\nif [ -z `$(WHICH) $1` ]; then \\\n\t$(PRINTF) \" no\\n\"; \\\n\t$(EXIT) 1;\\\nelse \\\n\t$(PRINTF) \" yes\\n\"; \\\nfi\n\ncheck:\n\t$(call checkfor,$(WHICH_CMD))\n\t$(call checkfor,$(CAT_CMD))\n\t$(call checkfor,$(CP_CMD))\n\t$(call checkfor,$(TPUT_CMD))\n\t$(call checkfor,$(TR_CMD))\n\t$(call checkfor,$(PRINTF_CMD))\n\t$(call checkfor,$(TOUCH_CMD))\n\t$(call checkfor,$(FIND_CMD))\n\t$(call checkfor,$(XARGS_CMD))\n\t$(call checkfor,$(RM_CMD))\n\t$(call checkfor,$(BREW_CMD))\n\t$(call checkfor,$(PYTHON3_CMD))\n\t$(call checkfor,$(PIP3_CMD))\n\t$(call checkfor,$(TOX_CMD))\n\t$(call checkfor,$(COVERAGE_CMD))\n\t$(call checkfor,$(PYLINT_CMD))\n\t$(call checkfor,$(PYENV_CMD))\n\t$(call checkfor,$(GEM_CMD))\n\t$(call checkfor,$(DANGER_CMD))\n\t@$(DISPLAY_SEPARATOR)\n\n# ---\n\npipinstall = @$(PIP) install $1 $(USER_FLAG)\npipthreeinstall = @$(PIP3_CMD) install $1\ngeminstall = @$(GEM) install $1\nbrewinstall = @$(BREW) install $1\n\npyenv_exec = @$(PYENV_CMD) $1 $2\n\ninstall-deps:\n\t$(call brewinstall,$(PYENV_CMD))\n\t$(call brewinstall,$(PYTHON3_CMD))\n\t$(call checkfor,$(PIP3_CMD))\n\t$(call pipthreeinstall,-r requirements.txt)\n\t@$(DISPLAY_SEPARATOR)\n\t$(call checkfor,$(GEM_CMD))\n\t$(call geminstall,$(DANGER_CMD))\n\t@$(DISPLAY_SEPARATOR)\n\t$(call pyenv_exec, install, 3.5.1)\n\t@$(DISPLAY_SEPARATOR)\n\n# ---\n\n# this is for installing any tools that we don't already have\n\ninstall-tools: check\n\t@$(PRINTF) \"Installing git hooks...\"\n\t@$(PYTHON2) ./tools/hooks-config.py\n\t@$(PRINTF) \" done!\\n\"\n\t@$(DISPLAY_SEPARATOR)\n\n# ---\n\nremoveall = $(RM) -rRf\ncleanlocation = @$(FIND) $1 $2 -print0 | $(XARGS) -0 $(removeall)\n\nclean: check\n\t@$(PRINTF) \"Removing existing installation... \"\n\t@$(TOUCH) $(INSTALLED_FILES_RECORD)\n\t@$(CAT) $(INSTALLED_FILES_RECORD) | $(XARGS) $(removeall)\n\t@$(removeall) ./nslocalizer.egg-info\n\t@$(removeall) ./build\n\t@$(removeall) ./dist\n\t@$(removeall) ./.tox\n\t@$(removeall) .coverage\n\t@$(removeall) ./htmlcov\n\t@$(removeall) ./.eggs\n\t$(call cleanlocation, ., -name \".DS_Store\")\n\t$(call cleanlocation, ., -name \"*.pyc\")\n\t$(call cleanlocation, ., -name \"__pycache__\" -type d)\n\t$(call cleanlocation, ., -name \"*_output.plist\")\n\t@$(PRINTF) \"done!\\n\"\n\t@$(DISPLAY_SEPARATOR)\n\t\n\t\n# ---\n\nbuild: clean\n\t$(PYTHON3) ./setup.py install --record $(INSTALLED_FILES_RECORD)\n\t@$(DISPLAY_SEPARATOR)\n\n# ---\n\ntest: clean\n\t$(TOX)\n\t@$(DISPLAY_SEPARATOR)\n\n# ---\n\nupload_artifacts = @$(PRINTF) \"Checking for path to upload artifacts...\" ; \\\nif [ -d $1 ] ; then \\\n\t$(PRINTF) \"uploading.\\n\" ; \\\n\t$(CP) -r ./htmlcov $1 ; \\\n\t$(CP) lint_output.txt $1 ; \\\nelse \\\n\t$(PRINTF) \"skipping.\\n\" ; \\\nfi\n\nrun_cctreporter = @$(PRINTF) \"Checking CI branch to upload coverage results... \" ; \\\nif [ \"$(CIRCLE_BRANCH)\" = \"develop\" ]; then \\\n\t$(PRINTF) \"OK.\\n\"; \\\n\t$(CCTREPORTER) --token $(value CIRCLECI_CODECLIMATE_TOKEN) ; \\\nelse \\\n\t$(PRINTF) \"skipping.\\n\"; \\\nfi\n\nchecktest = @$(PRINTF) \"Checking that coverage data exists... \" ; \\\nif [ -e ./.coverage ] ; then \\\n\t$(PRINTF) \"ok!\\n\" ; \\\nelse \\\n\t$(PRINTF) \"not found!\\n\" ; \\\n\t$(PRINTF) \"Please run 'make test' before running 'make report'\\n\" ; \\\n\texit 1 ; \\\nfi \\\n\nreport: check\n\t@$(call checktest)\n\t$(COVERAGE) report\n\t@$(DISPLAY_SEPARATOR)\n\t@$(PRINTF) \"Generating html report... \"\n\t@$(COVERAGE) html\n\t@$(PRINTF) \"done!\\n\"\n\t@$(PRINTF) \"Generated html report is located at: ./htmlcov/index.html\\n\"\nifdef CIRCLE_ARTIFACTS\n\t@$(DISPLAY_SEPARATOR)\n\t$(call upload_artifacts,$(CIRCLE_ARTIFACTS))\nendif\n\t@$(DISPLAY_SEPARATOR)\n\t$(call run_cctreporter)\n\t@$(DISPLAY_SEPARATOR)\n\n# ---\n\ndanger: check\n\t@$(PRINTF) \"Running danger \"\nifdef CIRCLECI_DANGER_GITHUB_API_TOKEN\n\t@$(PRINTF) \"(PR)... \\n\"\n\t@export DANGER_GITHUB_API_TOKEN=$(value CIRCLECI_DANGER_GITHUB_API_TOKEN)\n\t@$(DANGER) --verbose\nelse\n\t@$(PRINTF) \"(local)... \\n\"\n\t@$(DANGER) local --verbose\nendif\n\t@$(DISPLAY_SEPARATOR)\n\t\n# ---\n\nci: test lint report danger\n\n# ---\n\nlint: check\n\t@$(TOUCH) lint_output.txt\n\t@$(PRINTF) \"Running linter... \"\n\t@$(PYLINT) --rcfile=pylintrc ./nslocalizer > lint_output.txt || :\n\t@$(PRINTF) \" done!\\n\"\n\t@$(PRINTF) \"Generated linter report: lint_output.txt\\n\"\n\t@$(DISPLAY_SEPARATOR)\n\n# ---\n\n.PHONY: danger lint ci report test build clean install-tools install-deps check\n"
  },
  {
    "path": "circle.yml",
    "content": "machine:\n  environment:\n    XCODE_SCHEME: CIRCLECI_IS_BROKEN\n    XCODE_WORKSPACE: CIRCLECI_IS_BROKEN\n  xcode:\n    version: 7.3.1\n  pre:\n    - export PATH=/usr/local/bin:$PATH:/Users/distiller/Library/Python/2.7/bin\n    - pip install --user --ignore-installed --upgrade virtualenv\n    - ln -s $HOME/Library/Python/2.7/bin/virtualenv /usr/local/bin/virtualenv\n    - cd \"$(brew --repository)\" && git fetch && git reset --hard origin/master\n    - brew update\n\ndependencies:\n  override:\n    - make install-deps\n    - pyenv local 3.5.1\n\ntest:\n  override:\n    - make ci"
  },
  {
    "path": "contributing/code-of-conduct.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, gender identity and expression, level of experience,\nnationality, personal appearance, race, religion, or sexual identity and\norientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\nadvances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n\taddress, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n\tprofessional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at [INSERT EMAIL ADDRESS]. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at [http://contributor-covenant.org/version/1/4][version]\n\n[homepage]: http://contributor-covenant.org\n[version]: http://contributor-covenant.org/version/1/4/"
  },
  {
    "path": "contributing.md",
    "content": "# [Code of Conduct](./contributing/code-of-conduct.md)\nThis project has and enforces a Code of Conduct. This must be adhered to at all times when engaging with maintainers not only on Github but also all other mediums (including social networks). The maintainers reserve the right to remove you from being able to contribute or comment on this project.\n\n---\n\n# [Issues](../../wiki/github_issues)\nWhen a new issue is created it will use a template that will ask for all the relevant information. If there is something missing or confusing, please look at the contributing guidelines for Issues on the wiki.\n\n---\n\n# [Pull Requests](../../wiki/github_prs)\nOn each pull request, a new CI build will be dispatched. This will run the test suite and upload the results of the coverage report. This project uses a tool called Danger to analyze many aspects of a PR and report if anything about the PR breaks expectations that the repo has. If you are interested in what will be analyzed, then please look at the contributing guildelines for PRs on the wiki.\n\n---\n\nYou made it! If you have finished reading the contributing guide then you can put 🌈 in your issue or pull request to acknowledge that you have read this document and have done your best to adhere"
  },
  {
    "path": "install_requirements.txt",
    "content": "pyobjc-core >= 2.5.1\npyobjc-framework-Cocoa >= 2.5.1\npbPlist >= 1.0.4\nlangcodes >= 1.2.0\n"
  },
  {
    "path": "nslocalizer/Executor/Executor.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport os\nimport re\nimport sys\nfrom ..Helpers.Logger               import Logger\nfrom ..Helpers.FileOperations       import FileOperations\nfrom ..Language                     import Language\nfrom ..Reporter                     import Reporter\nfrom ..xcodeproj.xcodeproj          import xcodeproj\nfrom ..Finder.LanguageFinder        import LanguageFinder\nfrom ..Finder                       import CodeFinder\n\nclass Executor(object):\n    base_language = None\n    additional_languages = None\n\n    @classmethod\n    def run(cls, arguments) -> None:\n        has_set_flag = arguments.find_missing or arguments.find_unused\n        can_run = arguments.project and len(arguments.target) > 0 and has_set_flag\n\n        xcodeproj_file = None\n        desired_targets = list()\n\n        if can_run:\n            Logger.write().info('Loading project file...')\n            # parse project file\n            project_file_path = os.path.normpath(arguments.project)\n            xcodeproj_file = xcodeproj(project_file_path)\n\n            Logger.write().info('Search for target \"%s\" in project \"%s\"' % (arguments.target, os.path.basename(project_file_path)))\n            # find target\n            desired_targets = [target for target in xcodeproj_file.project_file.targets() if target['name'] in arguments.target]\n        else:\n            Logger.write().error('Please specify a project (--project) with a valid target (--target), and at least one search flag (--find-unused, --find-missing).') # pragma: no cover\n\n        if xcodeproj is not None and len(desired_targets) == len(arguments.target):\n            missing_strings = dict()\n            unused_strings = dict()\n\n            if arguments.find_missing:\n                missing_strings = cls.findMissingStrings(xcodeproj_file, desired_targets)\n                # log data to xcode console\n                Reporter.logMissingStrings(missing_strings, arguments.ignore, arguments.error)\n\n            if arguments.find_unused:\n                unused_strings = cls.findUnusedStrings(xcodeproj_file, desired_targets)\n                # log data to xcode console\n                Reporter.logUnusedStrings(unused_strings, arguments.error)\n\n        else: # pragma: no cover\n            missing_targets = [target for target in arguments.target if target not in desired_targets]\n            Logger.write().info('Could not find target \"%s\" in the specified project file.' % '\", \"'.join(missing_targets))\n\n    @classmethod\n    def findMissingStrings(cls, project, targets) -> dict:\n        Logger.write().info('Finding strings that are missing from language files...')\n        _ = targets\n        base_language, additional_languages = cls.generateLanguages(project)\n\n        missing_results = [string.processMapping(base_language, additional_languages) for string in base_language.strings]\n\n        return dict(missing_results)\n\n    @classmethod\n    def findUnusedStrings(cls, project, targets) -> list:\n        Logger.write().info('Finding strings that are unused but are in language files...')\n        code_files = list()\n        for target in targets:\n            code_files.extend(CodeFinder.getCodeFileList(project.project_file, target))\n        base_language, _ = cls.generateLanguages(project)\n\n        known_strings = set()\n\n        for source_code_file in code_files:\n            data = FileOperations.getData(source_code_file)\n            if data is None:\n                continue\n            matches = re.findall(r'NSLocalizedString\\(@?\\\"(.*?)\\\",', data)\n            Logger.write().debug('%s: %i results' % (os.path.basename(source_code_file), len(matches)))\n            known_strings.update(matches)\n        unused_strings = [lstring for lstring in base_language.strings if lstring.string not in known_strings]\n        for unused_string in unused_strings:\n            unused_string.registerBase(base_language)\n\n        return unused_strings\n\n    @classmethod\n    def generateLanguages(cls, project) -> (Language, {Language}):\n        strings_files, stringsdict_files = LanguageFinder.getLocalizationFiles(project.project_file)\n\n        languages = set([Language.Language(path) for path in strings_files])\n        for language in languages:\n            language.loadStringsDictFile(stringsdict_files)\n\n        if cls.base_language is None and cls.additional_languages is None:\n            cls.additional_languages = set([language for language in languages if language.code != 'Base'])\n            if len(cls.additional_languages) == len(languages):\n                Logger.write().info('Could not find a \"Base\" language, assuming \"English\"...')\n                cls.additional_languages = set([language for language in languages if language.code != 'en'])\n            if len(cls.additional_languages) == len(languages):\n                Logger.write().error('Unable to locate the \"Base\" language, please assign one in the project file!')\n                sys.exit(1)\n            other_languages = languages.difference(cls.additional_languages)\n            cls.base_language = other_languages.pop()\n            cls.base_language.findStrings()\n\n        return (cls.base_language, cls.additional_languages)\n"
  },
  {
    "path": "nslocalizer/Executor/__init__.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "nslocalizer/Finder/CodeFinder.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom ..Helpers.Logger                           import Logger\nfrom ..xcodeproj.pbProj                         import pbProj\nfrom ..xcodeproj.pbProj.PBXSourcesBuildPhase    import PBXSourcesBuildPhase\nfrom .                                          import PathFinder\n\ndef getCodeFileList(project, target) -> list:\n    Logger.write().info('Finding Code files for target \"%s\"...' % target[pbProj.PBX_Constants.kPBX_TARGET_name])\n    build_phases = target.store[pbProj.PBX_Constants.kPBX_TARGET_buildPhases]\n    source_phases = [build_phase for build_phase in build_phases if isinstance(build_phase, PBXSourcesBuildPhase)]\n\n    all_build_files = list()\n    for phase in source_phases:\n        all_build_files.extend(phase.store[pbProj.PBX_Constants.kPBX_PHASE_files])\n\n    all_file_refs = [PathFinder.resolveFilePathForReference(project, build_file.store[pbProj.PBX_Constants.kPBX_BUILDFILE_fileRef]) for build_file in all_build_files]\n\n    return all_file_refs\n"
  },
  {
    "path": "nslocalizer/Finder/LanguageFinder.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom ..Helpers.Logger                           import Logger\nfrom ..xcodeproj.pbProj                         import pbProj\nfrom ..xcodeproj.pbProj.PBXVariantGroup         import PBXVariantGroup\nfrom .                                          import PathFinder\n\ndef FilterByName(items, name) -> PBXVariantGroup:\n    matched_items = [item for item in items if item.store[pbProj.PBX_Constants.kPBX_REFERENCE_name] == name]\n    if len(matched_items):\n        matched_items = matched_items[0]\n    else:\n        matched_items = None\n    return matched_items\n\nclass LanguageFinder(object):\n    localizable_strings = None\n    localizable_stringsdict = None\n    strings_file_refs = list()\n    stringsdict_file_refs = list()\n\n    @classmethod\n    def getLocalizationFiles(cls, project) -> (dict, dict):\n        if cls.localizable_strings is None or cls.localizable_stringsdict is None:\n            variant_groups = [pbx_object for pbx_object in project.pbx_objects if isinstance(pbx_object, PBXVariantGroup)]\n\n            # localizable.strings\n            if cls.localizable_strings is None:\n                Logger.write().info('Filtering for Localizable.strings files...')\n                cls.localizable_strings = FilterByName(variant_groups, 'Localizable.strings')\n\n            # localizable.stringsdict\n            if cls.localizable_stringsdict is None:\n                Logger.write().info('Filtering for Localizable.stringsdict files...')\n                cls.localizable_stringsdict = FilterByName(variant_groups, 'Localizable.stringsdict')\n\n        if len(cls.strings_file_refs) == 0 or len(cls.stringsdict_file_refs) == 0:\n            Logger.write().info('Resolving language-specific file paths...')\n\n            if len(cls.strings_file_refs) == 0 and cls.localizable_strings is not None:\n                languages = cls.localizable_strings.store[pbProj.PBX_Constants.kPBX_REFERENCE_children]\n                cls.strings_file_refs = [PathFinder.resolveFilePathForReference(project, language_file) for language_file in languages]\n            else:\n                Logger.write().info('Could not find any Localizable.strings files, continuing...')\n\n            if len(cls.stringsdict_file_refs) == 0 and cls.localizable_stringsdict is not None:\n                language_dicts = cls.localizable_stringsdict.store[pbProj.PBX_Constants.kPBX_REFERENCE_children]\n                cls.stringsdict_file_refs = [PathFinder.resolveFilePathForReference(project, language_file_dict) for language_file_dict in language_dicts]\n            else:\n                Logger.write().info('Could not find any Localizable.stringsdict files, continuing...')\n\n        return (cls.strings_file_refs, cls.stringsdict_file_refs)\n"
  },
  {
    "path": "nslocalizer/Finder/PathFinder.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport os\n\ndef resolveFilePathForReference(project, reference) -> str:\n    file_path = reference.resolvePath(project)\n    project_dir = os.path.dirname(os.path.dirname(project.pbx_file_path))\n    file_path = os.path.join(project_dir, file_path)\n    norm_file_path = os.path.normpath(file_path)\n    return norm_file_path\n"
  },
  {
    "path": "nslocalizer/Finder/__init__.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "nslocalizer/Helpers/FileOperations.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport os\nimport sys\nfrom pbPlist import pbParser\n\nclass FileOperations(object):\n\n    @classmethod\n    def getData(cls, file_path) -> object:\n        data = None\n        if os.path.isfile(file_path) is True:\n            try:\n                encoding = pbParser.GetFileEncoding(file_path)\n                file_descriptor = pbParser.OpenFileWithEncoding(file_path, encoding)\n                data = file_descriptor.read()\n                file_descriptor.close()\n            except IOError as exception: # pragma: no cover\n                print('I/O error({0}): {1}'.format(exception.errno, exception.strerror))\n            except: # pragma: no cover\n                print('Unexpected error:'+str(sys.exc_info()[0]))\n                raise\n        return data\n"
  },
  {
    "path": "nslocalizer/Helpers/Logger.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport logging\n\nclass Singleton(type):\n    _instances = {}\n\n    def __call__(cls, *args, **kwargs): # pragma: no cover\n        if cls not in cls._instances.keys():\n            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)\n        return cls._instances[cls]\n\n#These are the sequences need to get colored ouput\nRESET_SEQ = '\\033[0m'\nBOLD_SEQ = '\\033[1m'\n\nCOLORS = {\n    'BLACK': '\\033[1;30m',\n    'RED': '\\033[1;31m',\n    'GREEN': '\\033[1;32m',\n    'YELLOW': '\\033[1;33m',\n    'BLUE': '\\033[1;34m',\n    'MAGENTA': '\\033[1;35m',\n    'CYAN': '\\033[1;36m',\n    'WHITE': '\\033[1;37m'\n}\n\nLEVELS = {\n    'WARNING': COLORS['YELLOW'],\n    'INFO': COLORS['BLACK'],\n    'DEBUG': COLORS['MAGENTA'],\n    'CRITICAL': COLORS['BLUE'],\n    'ERROR': COLORS['RED']\n}\n\nclass ColoredFormatter(logging.Formatter):\n    def __init__(self, msg, use_color=True):\n        logging.Formatter.__init__(self, msg)\n        self.use_color = use_color\n\n    def format(self, record): # pragma: no cover\n        levelname = record.levelname\n        if self.use_color and levelname in LEVELS:\n            levelname_color = LEVELS[levelname] + levelname + RESET_SEQ\n            record.levelname = levelname_color\n        return logging.Formatter.format(self, record)\n\nclass Logger(object):\n    __metaclass__ = Singleton\n    _internal_logger = None\n    _debug_logging = False\n    _use_ansi_codes = False\n\n    def __init__(self, *args, **kwargs): # pragma: no cover\n        pass\n\n    @staticmethod\n    def enableDebugLogger(is_debug_logger=False):\n        Logger._debug_logging = is_debug_logger\n\n    @staticmethod\n    def disableANSI(disable_ansi=False):\n        Logger._use_ansi_codes = not disable_ansi\n\n    @staticmethod\n    def setupLogger():\n        Logger._internal_logger = logging.getLogger('com.pewpewthespells.py.logging_helper')\n\n        level = logging.DEBUG if Logger._debug_logging else logging.INFO\n        Logger._internal_logger.setLevel(level)\n\n        handler = logging.StreamHandler()\n        handler.setLevel(level)\n\n        # create formatter\n        formatter = None\n        if Logger._debug_logging is True: # pragma: no cover\n            formatter = ColoredFormatter('[%(levelname)s][%(filename)s:%(lineno)s]: %(message)s', Logger._use_ansi_codes)\n        else:\n            formatter = ColoredFormatter('[%(levelname)s]: %(message)s', Logger._use_ansi_codes)\n\n        # add formatter to ch\n        handler.setFormatter(formatter)\n\n        # add ch to logger\n        Logger._internal_logger.addHandler(handler)\n\n    @staticmethod\n    def isVerbose(verbose_logging=False):\n        if Logger._internal_logger is None: # pragma: no cover\n            Logger.setupLogger()\n        if not verbose_logging:\n            Logger._internal_logger.setLevel(logging.WARNING)\n\n    @staticmethod\n    def isSilent(should_quiet=False):\n        if Logger._internal_logger is None: # pragma: no cover\n            Logger.setupLogger()\n        if should_quiet:\n            logging_filter = logging.Filter(name='com.pewpewthespells.py.logging_helper.shut_up')\n            Logger._internal_logger.addFilter(logging_filter)\n\n    @staticmethod\n    def write():\n        if Logger._internal_logger is None: # pragma: no cover\n            Logger.setupLogger()\n        return Logger._internal_logger\n"
  },
  {
    "path": "nslocalizer/Helpers/Switch.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\n# Original code taken from http://code.activestate.com/recipes/410692/\n\nclass Switch(object):\n    def __init__(self, value):\n        self.value = value\n        self.fall = False\n\n    def __iter__(self):\n        \"\"\"Return the match method once, then stop\"\"\"\n        yield self.match\n        raise StopIteration # pragma: no cover\n\n    def match(self, *args):\n        \"\"\"Indicate whether or not to enter a case suite\"\"\"\n        result = False\n        if self.fall or not args:\n            result = True\n        elif self.value in args: # changed for v1.5, see below\n            self.fall = True\n            result = True\n        return result\n"
  },
  {
    "path": "nslocalizer/Helpers/__init__.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "nslocalizer/Helpers/xcrun.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/pylocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport os\nimport sys\nimport struct\nimport hashlib\nimport subprocess\nimport CoreFoundation\nfrom .Logger    import Logger\nfrom .Switch    import Switch\n\ndef hashStringForPath(path) -> str:\n    \"\"\"\n    Returns the hash for a project's DerivedData location.\n\n    path is the filesystem path to the .xcodeproj file.\n    \"\"\"\n    hash_context = hashlib.md5()\n    hash_context.update(path)\n    md5_digest_hex = hash_context.digest()\n\n    hash_path = [None] * 28\n\n    first_value = struct.unpack('>Q', md5_digest_hex[:8])[0]\n\n    counter = 13\n    while counter >= 0:\n        hash_path[counter] = chr((first_value % 26) + ord('a'))\n        first_value = first_value / 26\n        counter -= 1\n\n    second_value = struct.unpack('>Q', md5_digest_hex[8:])[0]\n\n    counter = 27\n    while counter > 13:\n        hash_path[counter] = chr((second_value % 26) + ord('a'))\n        second_value = second_value / 26\n        counter -= 1\n\n    hash_path_string = ''.join(hash_path)\n\n    return hash_path_string\n\ndef ResolveDerivedDataPath(project) -> str:\n    default_dd_path = os.path.expanduser(\"~/Library/Developer/Xcode/DerivedData/\")\n    derived_data = CoreFoundation.CFPreferencesCopyAppValue('IDECustomDerivedDataLocation', 'com.apple.dt.Xcode') # pylint: disable=no-member\n    if derived_data is None:\n        derived_data = default_dd_path\n    else:\n        if derived_data[0] != '/':\n            derived_data = os.path.join(project.path, derived_data)\n    return derived_data\n\ndef ResolveBuildLocation(project, sym_root) -> str:\n    build_dir_path = ''\n    derived_data = ResolveDerivedDataPath(project)\n    location_style = CoreFoundation.CFPreferencesCopyAppValue('IDEBuildLocationStyle', 'com.apple.dt.Xcode') # pylint: disable=no-member\n    for case in Switch(location_style):\n        if case('Unique'):\n            xcodeproj_path = os.path.join(project.projectRoot.obj_path, project.name)\n            unique_path = hashStringForPath(xcodeproj_path)\n            # this is missing the configuration path.\n            project_dir_name = os.path.splitext(project.name)[0]+'-'+unique_path+'/Build/Products/'\n            build_dir_path = os.path.join(derived_data, project_dir_name)\n            break\n        if case('Shared'):\n            shared_path = CoreFoundation.CFPreferencesCopyAppValue('IDESharedBuildFolderName', 'com.apple.dt.Xcode') # pylint: disable=no-member\n            build_dir_path = os.path.join(derived_data, shared_path)\n            break\n        if case('Custom'):\n            location_type = CoreFoundation.CFPreferencesCopyAppValue('IDECustomBuildLocationType', 'com.apple.dt.Xcode') # pylint: disable=no-member\n            custom_path = CoreFoundation.CFPreferencesCopyAppValue('IDECustomBuildProductsPath', 'com.apple.dt.Xcode') # pylint: disable=no-member\n            for case in Switch(location_type):\n                if case('RelativeToDerivedData'):\n                    build_dir_path = os.path.join(derived_data, custom_path)\n                    break\n                if case('RelativeToWorkspace'):\n                    build_dir_path = os.path.join(project.path.base_path, custom_path)\n                    break\n                if case('Absolute'):\n                    build_dir_path = custom_path\n                    break\n                if case():\n                    break\n        if case('DeterminedByTargets'):\n            # this is missing the configuration path\n            build_dir_path = os.path.join(project.projectRoot.obj_path, sym_root)\n            break\n        if case(): # pragma: no cover\n            break\n    return build_dir_path\n\ndef IntermediatesBuildLocation(project, target_name, config_name, sym_root) -> str:\n    build_dir_path = ResolveBuildLocation(project, sym_root)\n    project_name = project.name.split('.')[0]\n    project_dir_path = os.path.join(build_dir_path, project_name+'.build')\n    config_dir_path = os.path.join(project_dir_path, config_name)\n    target_dir_path = os.path.join(config_dir_path, target_name+'.build')\n    return target_dir_path\n\ndef ProductsBuildLocation(project, sym_root) -> str:\n    \"\"\"\n    Returns the full path to the location of the build products.\n\n    project is the project that the build product is in.\n\n    sym_root is the value of $(SYMROOT) for the current configuration\n    \"\"\"\n    # this needs to also take CONFIGURATION_DIR\n    build_dir_path = ResolveBuildLocation(project, sym_root)\n    return build_dir_path\n\ndef resolvePathFromLocation(location_string, path, base_path) -> str:\n    path_string = ''\n    path_type, item_path = location_string.split(':')\n    for case in Switch(path_type):\n        if case('group'):\n            path = os.path.join(base_path, path)\n            path_string = os.path.join(path, item_path)\n            break\n        if case('absolute'):\n            path_string = item_path\n            break\n        if case('developer'):\n            path_string = os.path.join(resolve_developer_path(), item_path)\n            break\n        if case('container'):\n            path_string = os.path.join(base_path, item_path)\n            break\n        if case(): # pragma: no cover\n            Logger.write().error('Invalid item path name!')\n            path_string = item_path\n            break\n    return path_string\n\ndef make_subprocess_call(call_args, shell_state=False) -> (str, int):\n    error = 0\n    output = ''\n    try:\n        output = subprocess.check_output(call_args, shell=shell_state)\n        error = 0\n    except subprocess.CalledProcessError as exception: # pragma: no cover\n        output = str(exception.output)\n        error = exception.returncode\n    return (output, error)\n\ndef make_xcrun_with_args(args_tuple) -> str:\n    xcrun_result = make_subprocess_call((('xcrun',) + args_tuple))\n    if xcrun_result[1] != 0: # pragma: no cover\n        Logger.write().error('[xcrun]: Error in exec!')\n        sys.exit()\n    xcrun_output = str(xcrun_result[0]).rstrip('\\n')\n    return xcrun_output\n\ndef resolve_sdk_path(sdk_name) -> str:\n    return make_xcrun_with_args(('--show-sdk-path', '--sdk', sdk_name))\n\ndef resolve_developer_path() -> str:\n    xcrun_result = make_subprocess_call(('xcode-select', '-p'))\n    if xcrun_result[1] != 0: # pragma: no cover\n        Logger.write().error('[xcrun]: Please run Xcode first!')\n        sys.exit()\n    developer_path = str(xcrun_result[0]).rstrip('\\n')\n    return developer_path\n\nDEVELOPER_DIR = os.environ.get('DEVELOPER_DIR')\nif DEVELOPER_DIR:\n    Logger.write().info('DEVELOPER_DIR environment variable is already set, existing value \"%s\" will be used.' % (DEVELOPER_DIR))\nelse:\n    os.environ['DEVELOPER_DIR'] = resolve_developer_path()\n"
  },
  {
    "path": "nslocalizer/Language/Language.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport os\nimport langcodes\nfrom pbPlist                    import pbPlist\nfrom .LanguageString            import LanguageString\nfrom ..Helpers.Logger           import Logger\nfrom ..Helpers.FileOperations   import FileOperations\n\ndef GetLanguageCodeFromPath(path) -> str:\n    dirname = os.path.dirname(path)\n    basename = os.path.basename(dirname)\n    locale, _ = os.path.splitext(basename)\n    return locale\n\ndef FindLineIndex(data, string) -> int:\n    line_index = 0\n    localized_string_entry = '\"'+str(string)+'\"'\n    if data is not None:\n        position = data.find(localized_string_entry)\n        line_index = data[:position].count('\\n') + 1\n    return line_index\n\ndef LoadStrings(file_path) -> list:\n    strings_file_contents = pbPlist.PBPlist(file_path)\n    results = [LanguageString(localized_string_key, strings_file_contents.root[localized_string_key]) for localized_string_key in list(strings_file_contents.root.keys())]\n    return results\n\nclass Language(object):\n    def __init__(self, strings_file_path):\n        self.code = GetLanguageCodeFromPath(strings_file_path)\n        self.name = langcodes.LanguageData(language=self.code).language_name()\n        self.strings_file = strings_file_path\n        self.stringsdict_file = None\n        self.stringsdict = None\n        self.strings = LoadStrings(self.strings_file)\n\n    def findStrings(self) -> None:\n        strings_missing_line_numbers = [lstring for lstring in self.strings if lstring.line_number == 0]\n        if len(strings_missing_line_numbers):\n            Logger.write().info('Resolving line numbers...')\n            data = FileOperations.getData(self.strings_file)\n            for lstring in strings_missing_line_numbers:\n                lstring.line_number = FindLineIndex(data, lstring.string)\n\n    def loadStringsDictFile(self, stringsdict_file_array) -> None:\n        for stringsdict_file in stringsdict_file_array:\n            dict_locale = GetLanguageCodeFromPath(stringsdict_file)\n            if self.code == dict_locale:\n                self.stringsdict_file = stringsdict_file\n                break\n        if self.stringsdict_file is not None:\n            self.stringsdict = LoadStrings(self.stringsdict_file)\n\n    def __repr__(self) -> str: # pragma: no cover\n        return '<%s : %s>' % (type(self).__name__, self.name)\n"
  },
  {
    "path": "nslocalizer/Language/LanguageString.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndef HasStringForLanguage(string, language) -> bool:\n    result = False\n    for lang_string in language.strings:\n        result = (string == lang_string.string)\n        if result is True:\n            break\n    return result\n\nclass LanguageString(object):\n    def __init__(self, string_key, string_value):\n        self.line_number = 0\n        self.string = string_key\n        self.value = string_value\n        self.base = None\n        self.mapping = dict()\n\n    def __repr__(self) -> str: # pragma: no cover\n        return str(self.string)\n\n    def registerBase(self, base_language):\n        self.base = base_language\n\n    def processMapping(self, base_language, additional_languages) -> (object, list):\n        self.registerBase(base_language)\n        results = [(language, HasStringForLanguage(self.string, language)) for language in additional_languages]\n        self.mapping = dict(results)\n        missing_keys = [key for key in self.mapping if self.mapping[key] is False]\n        return (self, missing_keys)\n"
  },
  {
    "path": "nslocalizer/Language/__init__.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "nslocalizer/Reporter/Reporter.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndef log(file_name, line_number, type_string, message_string) -> None:\n    message = '%s:%s: %s: %s' % (file_name, line_number, type_string, message_string)\n    ascii_message = message.encode('ascii', 'replace')\n    display_message = ascii_message.decode('ascii', 'ignore')\n    print(display_message)\n\ndef logError(file_name, line_number, message_string) -> None:\n    log(file_name, line_number, 'error', message_string)\n\ndef logWarning(file_name, line_number, message_string) -> None:\n    log(file_name, line_number, 'warning', message_string)\n\ndef logMissingStrings(warnings_dictionary, ignore_languages, is_error=False) -> None:\n    keys = list(warnings_dictionary.keys())\n    keys.sort(key=lambda string: string.line_number)\n    for key in keys:\n        locale_names = [language.name for language in warnings_dictionary.get(key) if language.code not in ignore_languages]\n        if len(locale_names):\n            message = ', '.join(locale_names)\n            message_string = 'String \"%s\" missing for: %s' %  (key.string, message)\n            if is_error is False:\n                logWarning(key.base.strings_file, key.line_number, message_string)\n            else:\n                logError(key.base.strings_file, key.line_number, message_string)\n\ndef logUnusedStrings(unused_strings_list, is_error=False) -> None:\n    unused_strings_list.sort(key=lambda string: string.line_number)\n    for unused_string in unused_strings_list:\n        message = 'String \"%s\" is not used' % unused_string.string\n        if is_error is False:\n            logWarning(unused_string.base.strings_file, unused_string.line_number, message)\n        else:\n            logError(unused_string.base.strings_file, unused_string.line_number, message)\n"
  },
  {
    "path": "nslocalizer/Reporter/__init__.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "nslocalizer/__init__.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .main        import main\nfrom .version     import __version__ as PYLOCALIZER_VERSION\n__version__ = PYLOCALIZER_VERSION\n"
  },
  {
    "path": "nslocalizer/main.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport sys\nimport argparse\nfrom .version             import __version__ as PYLOCALIZER_VERSION\nfrom .Helpers.Logger      import Logger\nfrom .Executor.Executor   import Executor\n\n# Main\ndef main(argv=sys.argv[1:]):\n    parser = argparse.ArgumentParser(description='nslocalizer is a tool for identifying unused or missing localization string usage in Xcode projects')\n    parser.add_argument(\n        '--version',\n        help='Displays the version information',\n        action='version',\n        version=PYLOCALIZER_VERSION\n    )\n    parser.add_argument(\n        '--project',\n        metavar='<Xcode project path>',\n        help='specify the path to the .xcodeproj file',\n        required=True,\n        action='store'\n    )\n    parser.add_argument(\n        '--target',\n        metavar='<target name>',\n        help='specify the name of targets to analyze, this accepts multiple target names',\n        type=str,\n        default=list(),\n        required=True,\n        action='store',\n        nargs='*'\n    )\n    parser.add_argument(\n        '--find-missing',\n        help='look for localized strings that are missing from any of the .strings files',\n        default=False,\n        action='store_true'\n    )\n    parser.add_argument(\n        '--find-unused',\n        help='look for localized strings that are not used in the code',\n        default=False,\n        action='store_true'\n    )\n    parser.add_argument(\n        '--quiet',\n        help='Silences all logging output',\n        default=False,\n        action='store_true'\n    )\n    parser.add_argument(\n        '--verbose',\n        help='Adds verbosity to logging output',\n        default=False,\n        action='store_true'\n    )\n    parser.add_argument(\n        '--ignore',\n        help='Specify languages to ignore (by code; eg: German = de).',\n        type=str,\n        default=list(),\n        nargs='*'\n    )\n    parser.add_argument(\n        '--no-ansi',\n        help='Disables the ANSI color codes as part of the logger',\n        default=False,\n        action='store_true'\n    )\n    parser.add_argument(\n        '--error',\n        help='Changes warnings to errors',\n        default=False,\n        action='store_true'\n    )\n    parser.add_argument(\n        '--debug',\n        help=argparse.SUPPRESS,\n        default=False,\n        action='store_true'\n    )\n    args = parser.parse_args(argv)\n\n    # perform the logging modifications before we do any other operations\n    Logger.disableANSI(args.no_ansi)\n    Logger.enableDebugLogger(args.debug)\n    Logger.isVerbose(args.verbose)\n    Logger.isSilent(args.quiet)\n\n    ignored_locales = ', '.join(args.ignore)\n    Logger.write().info('Ignoring languages: %s' % ignored_locales)\n\n    Executor.run(args)\n\nif __name__ == \"__main__\": # pragma: no cover\n    main()\n"
  },
  {
    "path": "nslocalizer/version.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom . import version_info\n\n__version__ = '1.0.2 ('+version_info.remote_origin+' @ '+version_info.commit_hash+')'\n"
  },
  {
    "path": "nslocalizer/version_info.py",
    "content": "remote_origin = 'ssh://github.com/samdmarshall/nslocalizer'\ncommit_hash = '14d376e'\n"
  },
  {
    "path": "nslocalizer/xcodeproj/__init__.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom ..Helpers import Logger\nfrom ..Helpers import xcrun\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXAggregateTarget.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Target\n\nclass PBXAggregateTarget(PBX_Base_Target):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXAppleScriptBuildPhase.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Phase\n\nclass PBXAppleScriptBuildPhase(PBX_Base_Phase):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXApplicationReference.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Reference\n\nclass PBXApplicationReference(PBX_Base_Reference):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXApplicationTarget.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Target\n\nclass PBXApplicationTarget(PBX_Base_Target):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXBuildFile.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBXItem\n\nclass PBXBuildFile(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_BUILDFILE_fileRef, project)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXBuildRule.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBXItem\n\nclass PBXBuildRule(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXBundleReference.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Reference\n\nclass PBXBundleReference(PBX_Base_Reference):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXBundleTarget.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Target\n\nclass PBXBundleTarget(PBX_Base_Target):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXContainerItemProxy.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBXItem\n\nclass PBXContainerItemProxy(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_CONTAINERITEMPROXY_containerPortal, project)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXCopyFilesBuildPhase.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Phase\n\nclass PBXCopyFilesBuildPhase(PBX_Base_Phase):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXExecutableFileReference.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Reference\n\nclass PBXExecutableFileReference(PBX_Base_Reference):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXFileReference.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Reference\n\nclass PBXFileReference(PBX_Base_Reference):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXFrameworkReference.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Reference\n\nclass PBXFrameworkReference(PBX_Base_Reference):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXFrameworkTarget.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Target\n\nclass PBXFrameworkTarget(PBX_Base_Target):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXFrameworksBuildPhase.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Phase\n\nclass PBXFrameworksBuildPhase(PBX_Base_Phase):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXGroup.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBX_Base_Reference\n\nclass PBXGroup(PBX_Base_Reference):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodesForArray(PBX_Constants.kPBX_REFERENCE_children, project)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXHeadersBuildPhase.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Phase\n\nclass PBXHeadersBuildPhase(PBX_Base_Phase):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXItem.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/pylocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport os\nimport collections\nfrom . import PBX_Constants\nfrom ...Helpers              import xcrun\n\ndef getGraphNodeWithIdentifier(identifier, project):\n    found_object = project.objectForIdentifier(identifier)\n    if found_object and not found_object.resolved:\n        found_object.resolveGraph(project)\n    return found_object\n\nclass PBXItem(collections.MutableMapping):\n    def __init__(self, identifier, dictionary):\n        self.isa = dictionary.get(PBX_Constants.kPBX_isa, None)\n        self.identifier = identifier\n        self.store = dict()\n        self.key_storage = set()\n        self.update(dictionary)  # use the free update to set keys\n        self.resolved = False\n\n    def __getitem__(self, key):\n        return self.store[key]\n\n    def __setitem__(self, key, value):\n        if key not in self.key_storage:\n            self.key_storage.add(key)\n        self.store[key] = value\n\n    def __delitem__(self, key):\n        if key in self.key_storage:\n            self.key_storage.remove(key)\n        del self.store[key]\n\n    def __iter__(self):\n        return self.key_storage.__iter__()\n\n    def __len__(self):\n        return self.key_storage.__len__()\n\n    def __str__(self):\n        return self.__repr__()+'\\n'+self.store.__str__()+'\\n'\n\n    def __contains__(self, item):\n        return item in self.key_storage\n\n    def __getattr__(self, attrib):\n        return getattr(self.store, attrib)\n\n    def __hash__(self):\n        return hash(self.identifier)\n\n    def __repr__(self):\n        return '<%s : %s>' % (self.isa, self.identifier)\n\n    def resolveGraphNodeForKey(self, key, project):\n        identifier = self.get(key, None)\n        if not isinstance(identifier, PBXItem):\n            found_object = getGraphNodeWithIdentifier(identifier, project)\n            if found_object:\n                self[key] = found_object\n\n    def resolveGraphNodesForArray(self, key, project):\n        identifier_array = self.get(key, None)\n        resolved_array = list()\n        for identifier in identifier_array:\n            resolved_item = getGraphNodeWithIdentifier(identifier, project)\n            if resolved_item:\n                resolved_array.append(resolved_item)\n            else:\n                resolved_array.append(identifier)\n        self[key] = resolved_array\n\n    def resolveGraph(self, project):\n        self.resolved = True\n        _ = project\n\nclass PBX_Base_Target(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(PBX_Base_Target, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(PBX_Base_Target, self).resolveGraph(project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_TARGET_buildConfigurationList, project)\n        self.resolveGraphNodesForArray(PBX_Constants.kPBX_TARGET_buildPhases, project)\n        self.resolveGraphNodesForArray(PBX_Constants.kPBX_TARGET_dependencies, project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_TARGET_productReference, project)\n\nclass PBX_Base_Phase(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(PBX_Base_Phase, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(PBX_Base_Phase, self).resolveGraph(project)\n        self.resolveGraphNodesForArray(PBX_Constants.kPBX_PHASE_files, project)\n\ndef resolvePathTypeFromSource(source):\n    result = None\n    lookup = {\n        '<absolute>': 'resolveAbsolutePath',\n        '<group>': 'resolveGroupPath',\n        'SOURCE_ROOT': 'resolveSourceRootPath',\n        'DEVELOPER_DIR': 'resolveDeveloperDirPath',\n        'BUILT_PRODUCTS_DIR': 'resolveBuildProductsPath',\n        'SDKROOT': 'resolveSDKPath',\n    }\n    if source in list(lookup.keys()):\n        result = lookup[source]\n    return result\n\nclass PBX_Base_Reference(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(PBX_Base_Reference, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(PBX_Base_Reference, self).resolveGraph(project)\n    def findParent(self, project):\n        parent = None\n        results = [pbx_object for pbx_object in project.pbx_objects if isinstance(pbx_object, PBX_Base_Reference) and PBX_Constants.kPBX_REFERENCE_children in list(pbx_object.keys())]\n        for item in results:\n            child_results = [ref for ref in item[PBX_Constants.kPBX_REFERENCE_children] if self.identifier == ref.identifier]\n            if len(child_results) > 0:\n                parent = item\n                break\n        return parent\n    def resolveAbsolutePath(self, project): # pylint: disable=no-self-use,unused-argument\n        return ''\n    def resolveGroupPath(self, project):\n        file_path = ''\n        parent = self.findParent(project)\n        if parent is not None:\n            grandparent_path = parent.resolvePath(project)\n            file_path = os.path.join(grandparent_path, '')\n        return file_path\n    def resolveSourceRootPath(self, project): # pylint: disable=no-self-use\n        project_dir = os.path.dirname(os.path.dirname(project.pbx_file_path))\n        return project_dir\n    def resolveDeveloperDirPath(self, project): # pylint: disable=no-self-use\n        _ = project\n        return xcrun.resolve_developer_path()\n    def resolveSDKPath(self, project): # pylint: disable=no-self-use\n        _ = project\n        sdk_name = os.environ.get('SDKROOT')\n        if sdk_name == '':\n            raise ValueError('Unable to get a value for SDKROOT, please make sure to run this inside of Xcode!')\n        return xcrun.resolve_sdk_path(sdk_name)\n    def resolvePath(self, project):\n        source = self.store[PBX_Constants.kPBX_REFERENCE_sourceTree]\n        source_func = resolvePathTypeFromSource(source)\n        parent_path = getattr(self, source_func)(project)\n        current_path = ''\n        if PBX_Constants.kPBX_REFERENCE_path in list(self.store.keys()):\n            current_path = self.store[PBX_Constants.kPBX_REFERENCE_path]\n        file_path = os.path.join(parent_path, current_path)\n        return file_path\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXJavaArchiveBuildPhase.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Phase\n\nclass PBXJavaArchiveBuildPhase(PBX_Base_Phase):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXLegacyTarget.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Target\n\nclass PBXLegacyTarget(PBX_Base_Target):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXLibraryReference.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Reference\n\nclass PBXLibraryReference(PBX_Base_Reference):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXLibraryTarget.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Target\n\nclass PBXLibraryTarget(PBX_Base_Target):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXNativeTarget.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBX_Base_Target\n\nclass PBXNativeTarget(PBX_Base_Target):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodesForArray(PBX_Constants.kPBX_TARGET_buildRules, project)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXProject.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBXItem\n\nclass PBXProject_ProjectReference(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def __repr__(self):\n        return self.store.__repr__()\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_PROJECTREF_ProjectRef, project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_PROJECTREF_ProductGroup, project)\n\nclass PBXProject(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_TARGET_buildConfigurationList, project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_PROJECT_mainGroup, project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_PROJECT_productRefGroup, project)\n        self.resolveGraphNodesForArray(PBX_Constants.kPBX_PROJECT_targets, project)\n        project_references = self.get(PBX_Constants.kPBX_PROJECT_projectReferences, None)\n        if project_references:\n            resolved_references = list()\n            for reference in project_references:\n                project_reference = PBXProject_ProjectReference(None, reference)\n                project_reference.resolveGraph(project)\n                resolved_references.append(project_reference)\n            self[PBX_Constants.kPBX_PROJECT_projectReferences] = resolved_references\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXReferenceProxy.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBXItem\n\nclass PBXReferenceProxy(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_PROXY_remoteRef, project)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXResourcesBuildPhase.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Phase\n\nclass PBXResourcesBuildPhase(PBX_Base_Phase):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXRezBuildPhase.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Phase\n\nclass PBXRezBuildPhase(PBX_Base_Phase):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXShellScriptBuildPhase.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Phase\n\nclass PBXShellScriptBuildPhase(PBX_Base_Phase):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXSourcesBuildPhase.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Phase\n\nclass PBXSourcesBuildPhase(PBX_Base_Phase):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXStandAloneTarget.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBX_Base_Target\n\nclass PBXStandAloneTarget(PBX_Base_Target):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodesForArray(PBX_Constants.kPBX_TARGET_buildRules, project)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXTargetDependency.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBXItem\n\nclass PBXTargetDependency(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_TARGETDEP_target, project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_TARGETDEP_targetProxy, project)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXToolTarget.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Target\n\nclass PBXToolTarget(PBX_Base_Target):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXVariantGroup.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBX_Base_Reference\n\nclass PBXVariantGroup(PBX_Base_Reference):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodesForArray(PBX_Constants.kPBX_REFERENCE_children, project)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBXZipArchiveReference.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .PBXItem import PBX_Base_Reference\n\nclass PBXZipArchiveReference(PBX_Base_Reference):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBX_Constants.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nkPBX_rootObject = 'rootObject'\nkPBX_objects = 'objects'\nkPBX_archiveVersion = 'archiveVersion'\nkPBX_objectVersion = 'objectVersion'\nkPBX_classes = 'classes'\n\nkPBX_ProjectRef = 'ProjectRef'\n\nkPBX_isa = 'isa'\n\nkPBX_TARGET_name = 'name'\nkPBX_TARGET_productName = 'productName'\nkPBX_TARGET_buildConfigurationList = 'buildConfigurationList'\nkPBX_TARGET_buildPhases = 'buildPhases'\nkPBX_TARGET_dependencies = 'dependencies'\nkPBX_TARGET_productReference = 'productReference'\nkPBX_TARGET_buildSettings = 'buildSettings'\nkPBX_TARGET_productInstallPath = 'productInstallPath'\nkPBX_TARGET_productSettingsXML = 'productSettingsXML'\nkPBX_TARGET_shouldUseHeadermap = 'shouldUseHeadermap'\nkPBX_TARGET_buildRules = 'buildRules'\nkPBX_TARGET_passBuildSettingsInEnvironment = 'passBuildSettingsInEnvironment'\nkPBX_TARGET_buildArgumentsString = 'buildArgumentsString'\nkPBX_TARGET_buildToolPath = 'buildToolPath'\nkPBX_TARGET_buildWorkingDirectory = 'buildWorkingDirectory'\nkPBX_TARGET_settingsToExpand = 'settingsToExpand'\nkPBX_TARGET_settingsToPassInEnvironment = 'settingsToPassInEnvironment'\nkPBX_TARGET_settingsToPassOnCommandLine = 'settingsToPassOnCommandLine'\nkPBX_TARGET_productType = 'productType'\nkPBX_TARGET_buildProperties = 'buildProperties'\n\nkPBX_PHASE_buildActionMask = 'buildActionMask'\nkPBX_PHASE_files = 'files'\nkPBX_PHASE_runOnlyForDeploymentPostprocessing = 'runOnlyForDeploymentPostprocessing'\nkPBX_PHASE_contextName = 'contextName'\nkPBX_PHASE_isSharedContext = 'isSharedContext'\nkPBX_PHASE_dstPath = 'dstPath'\nkPBX_PHASE_dstSubfolderSpec = 'dstSubfolderSpec'\nkPBX_PHASE_shellScript = 'shellScript'\nkPBX_PHASE_shellPath = 'shellPath'\nkPBX_PHASE_inputPaths = 'inputPaths'\nkPBX_PHASE_outputPaths = 'outputPaths'\nkPBX_PHASE_showEnvVarsInLog = 'showEnvVarsInLog'\n\nkPBX_REFERENCE_path = 'path'\nkPBX_REFERENCE_name = 'name'\nkPBX_REFERENCE_refType = 'refType'\nkPBX_REFERENCE_sourceTree = 'sourceTree'\nkPBX_REFERENCE_lastKnownFileType = 'lastKnownFileType'\nkPBX_REFERENCE_fileEncoding = 'fileEncoding'\nkPBX_REFERENCE_explicitFileType = 'explicitFileType'\nkPBX_REFERENCE_includeInIndex = 'includeInIndex'\nkPBX_REFERENCE_children = 'children'\n\nkPBX_BUILDFILE_fileRef = 'fileRef'\nkPBX_BUILDFILE_settings = 'settings'\n\nkPBX_PROXY_remoteRef = 'remoteRef'\n\nkPBX_PROJECT_mainGroup = 'mainGroup'\nkPBX_PROJECT_targets = 'targets'\nkPBX_PROJECT_attributes = 'attributes'\nkPBX_PROJECT_compatibilityVersion = 'compatibilityVersion'\nkPBX_PROJECT_developmentRegion = 'developmentRegion'\nkPBX_PROJECT_hasScannedForEncodings = 'hasScannedForEncodings'\nkPBX_PROJECT_knownRegions = 'knownRegions'\nkPBX_PROJECT_productRefGroup = 'productRefGroup'\nkPBX_PROJECT_projectReferences = 'projectReferences'\n\nkPBX_PROJECTREF_ProductGroup = 'ProductGroup'\nkPBX_PROJECTREF_ProjectRef = 'ProjectRef'\n\nkPBX_TARGETDEP_target = 'target'\nkPBX_TARGETDEP_targetProxy = 'targetProxy'\n\nkPBX_CONTAINERITEMPROXY_remoteGlobalIDString = 'remoteGlobalIDString'\nkPBX_CONTAINERITEMPROXY_containerPortal = 'containerPortal'\n\nkPBX_XCBUILDCONFIG_baseConfigurationReference = 'baseConfigurationReference'\n\nkPBX_XCCONFIGURATION_buildConfigurations = 'buildConfigurations'\n\nkPBX_XCVersionGroup_currentVersion = 'currentVersion'\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/PBX_Lookup.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom . import PBX_Constants\nfrom . import PBXItem\nfrom . import PBXAggregateTarget\nfrom . import PBXAppleScriptBuildPhase\nfrom . import PBXApplicationReference\nfrom . import PBXApplicationTarget\nfrom . import PBXBuildFile\nfrom . import PBXBuildRule\nfrom . import PBXBundleReference\nfrom . import PBXBundleTarget\nfrom . import PBXContainerItemProxy\nfrom . import PBXCopyFilesBuildPhase\nfrom . import PBXExecutableFileReference\nfrom . import PBXFileReference\nfrom . import PBXFrameworkReference\nfrom . import PBXFrameworksBuildPhase\nfrom . import PBXFrameworkTarget\nfrom . import PBXGroup\nfrom . import PBXHeadersBuildPhase\nfrom . import PBXJavaArchiveBuildPhase\nfrom . import PBXLegacyTarget\nfrom . import PBXLibraryReference\nfrom . import PBXLibraryTarget\nfrom . import PBXNativeTarget\nfrom . import PBXProject\nfrom . import PBXReferenceProxy\nfrom . import PBXResourcesBuildPhase\nfrom . import PBXRezBuildPhase\nfrom . import PBXShellScriptBuildPhase\nfrom . import PBXSourcesBuildPhase\nfrom . import PBXStandAloneTarget\nfrom . import PBXTargetDependency\nfrom . import PBXToolTarget\nfrom . import PBXVariantGroup\nfrom . import PBXZipArchiveReference\nfrom . import XCBuildConfiguration\nfrom . import XCConfigurationList\nfrom . import XCVersionGroup\n\nPBX_TYPE_TABLE = {\n    'PBXAggregateTarget': PBXAggregateTarget.PBXAggregateTarget,\n    'PBXAppleScriptBuildPhase': PBXAppleScriptBuildPhase.PBXAppleScriptBuildPhase,\n    'PBXApplicationReference': PBXApplicationReference.PBXApplicationReference,\n    'PBXApplicationTarget': PBXApplicationTarget.PBXApplicationTarget,\n    'PBXBuildFile': PBXBuildFile.PBXBuildFile,\n    'PBXBuildRule': PBXBuildRule.PBXBuildRule,\n    'PBXBundleReference': PBXBundleReference.PBXBundleReference,\n    'PBXBundleTarget': PBXBundleTarget.PBXBundleTarget,\n    'PBXContainerItemProxy': PBXContainerItemProxy.PBXContainerItemProxy,\n    'PBXCopyFilesBuildPhase': PBXCopyFilesBuildPhase.PBXCopyFilesBuildPhase,\n    'PBXExecutableFileReference': PBXExecutableFileReference.PBXExecutableFileReference,\n    'PBXFileReference': PBXFileReference.PBXFileReference,\n    'PBXFrameworkReference': PBXFrameworkReference.PBXFrameworkReference,\n    'PBXFrameworksBuildPhase': PBXFrameworksBuildPhase.PBXFrameworksBuildPhase,\n    'PBXFrameworkTarget': PBXFrameworkTarget.PBXFrameworkTarget,\n    'PBXGroup': PBXGroup.PBXGroup,\n    'PBXHeadersBuildPhase': PBXHeadersBuildPhase.PBXHeadersBuildPhase,\n    'PBXJavaArchiveBuildPhase': PBXJavaArchiveBuildPhase.PBXJavaArchiveBuildPhase,\n    'PBXLegacyTarget': PBXLegacyTarget.PBXLegacyTarget,\n    'PBXLibraryReference': PBXLibraryReference.PBXLibraryReference,\n    'PBXLibraryTarget': PBXLibraryTarget.PBXLibraryTarget,\n    'PBXNativeTarget': PBXNativeTarget.PBXNativeTarget,\n    'PBXProject': PBXProject.PBXProject,\n    'PBXReferenceProxy': PBXReferenceProxy.PBXReferenceProxy,\n    'PBXResourcesBuildPhase': PBXResourcesBuildPhase.PBXResourcesBuildPhase,\n    'PBXRezBuildPhase': PBXRezBuildPhase.PBXRezBuildPhase,\n    'PBXShellScriptBuildPhase': PBXShellScriptBuildPhase.PBXShellScriptBuildPhase,\n    'PBXSourcesBuildPhase': PBXSourcesBuildPhase.PBXSourcesBuildPhase,\n    'PBXStandAloneTarget': PBXStandAloneTarget.PBXStandAloneTarget,\n    'PBXTargetDependency': PBXTargetDependency.PBXTargetDependency,\n    'PBXToolTarget': PBXToolTarget.PBXToolTarget,\n    'PBXVariantGroup': PBXVariantGroup.PBXVariantGroup,\n    'PBXZipArchiveReference': PBXZipArchiveReference.PBXZipArchiveReference,\n    'XCBuildConfiguration': XCBuildConfiguration.XCBuildConfiguration,\n    'XCConfigurationList': XCConfigurationList.XCConfigurationList,\n    'XCVersionGroup': XCVersionGroup.XCVersionGroup,\n}\n\ndef PBX_Type_Resolver(identifier, dictionary):\n    object_type = dictionary.get(PBX_Constants.kPBX_isa, None)\n    result = None\n    if object_type:\n        result = PBX_TYPE_TABLE.get(object_type, PBXItem.PBXItem)(identifier, dictionary)\n    return result\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/XCBuildConfiguration.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBXItem\n\nclass XCBuildConfiguration(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_XCBUILDCONFIG_baseConfigurationReference, project)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/XCConfigurationList.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBXItem\n\nclass XCConfigurationList(PBXItem):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodesForArray(PBX_Constants.kPBX_XCCONFIGURATION_buildConfigurations, project)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/XCVersionGroup.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom .        import PBX_Constants\nfrom .PBXItem import PBX_Base_Reference\n\nclass XCVersionGroup(PBX_Base_Reference):\n    def __init__(self, identifier, dictionary):\n        super(self.__class__, self).__init__(identifier, dictionary)\n    def resolveGraph(self, project):\n        super(self.__class__, self).resolveGraph(project)\n        self.resolveGraphNodesForArray(PBX_Constants.kPBX_REFERENCE_children, project)\n        self.resolveGraphNodeForKey(PBX_Constants.kPBX_XCVersionGroup_currentVersion, project)\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/__init__.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport sys\nimport os\nimport pbPlist\n"
  },
  {
    "path": "nslocalizer/xcodeproj/pbProj/pbProj.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport pbPlist\nfrom .                  import PBX_Constants\nfrom .                  import PBX_Lookup\n\nclass PBXProj(object):\n\n    def __init__(self, file_path):\n        plist = pbPlist.pbPlist.PBPlist(file_path)\n        contents = plist.root.nativeType()\n\n        self.pbx_objects = set()\n        self.pbx_identifier = None\n        self.pbx_root_object = None\n        self.pbx_object_version = 0\n        self.pbx_archive_version = 0\n        if contents is not None:\n            # get the path that we read from\n            self.pbx_file_path = plist.file_path\n\n            # get the root object identifier\n            self.pbx_identifier = contents.get(PBX_Constants.kPBX_rootObject, None)\n\n            # get the archive version number\n            archive_version = contents.get(PBX_Constants.kPBX_archiveVersion, None)\n            if archive_version:\n                self.pbx_archive_version = int(archive_version)\n\n            # get the object version number\n            object_version = contents.get(PBX_Constants.kPBX_objectVersion, None)\n            if object_version:\n                self.pbx_object_version = int(object_version)\n\n            # get the classes\n            self.pbx_classes = contents.get(PBX_Constants.kPBX_classes, None)\n\n            # get all the objects\n            objects_dict = contents.get(PBX_Constants.kPBX_objects, None)\n\n            self.pbx_objects = [PBX_Lookup.PBX_Type_Resolver(entry, value) for entry, value in list(objects_dict.items())]\n\n            self.pbx_root_object = self.objectForIdentifier(self.pbx_identifier)\n            self.pbx_root_object.resolveGraph(self)\n\n    def __repr__(self):\n        rep_string = '<%s : INVALID OBJECT>' % (self.__class__.__name__)\n        if self.isValid():\n            rep_string = '<%s : %s : %s>' % (self.__class__.__name__, self.pbx_identifier, self.pbx_file_path)\n        return rep_string\n\n    def __attrs(self):\n        return (self.pbx_identifier, self.pbx_file_path)\n\n    def __eq__(self, other):\n        return isinstance(other, PBXProj) and self.pbx_identifier == other.pbx_identifier and self.pbx_file_path == other.pbx_file_path\n\n    def __hash__(self):\n        return hash(self.__attrs())\n\n    def isValid(self):\n        return self.pbx_identifier is not None\n\n    def objectForIdentifier(self, identifier):\n        \"\"\"\n        Returns the parsed object from the project file for matching identifier, if no matching object is found it will return None.\n        \"\"\"\n        result = None\n        if self.isValid():\n            filter_results = [pbx_object for pbx_object in self.pbx_objects if pbx_object.identifier == identifier]\n            if len(filter_results):\n                result = filter_results[0]\n        return result\n\n    def projects(self):\n        \"\"\"\n        This method returns a set of 'xcodeproj' objects that represents any referenced\n        xcodeproj files in this project.\n        \"\"\"\n        subprojects = set()\n        if self.isValid():\n            subprojects = [path for path in self.__subproject_paths()]\n        return subprojects\n\n    def __subproject_paths(self):\n        \"\"\"\n        This method is for returning a list of paths to referenced project files in this\n        xcodeproj file.\n        \"\"\"\n        paths = list()\n        if self.isValid():\n            project_references = self.pbx_root_object.get(PBX_Constants.kPBX_PROJECT_projectReferences, None)\n            if project_references:\n                paths = [project_dict[PBX_Constants.kPBX_PROJECTREF_ProjectRef] for project_dict in project_references]\n        return paths\n\n    def targets(self):\n        \"\"\"\n        This method will return a list of build targets that are associated with this xcodeproj.\n        \"\"\"\n        targets = list()\n        if self.isValid():\n            target_list = self.pbx_root_object.get(PBX_Constants.kPBX_PROJECT_targets, None)\n            if target_list:\n                targets.extend(target_list)\n        return targets\n"
  },
  {
    "path": "nslocalizer/xcodeproj/xcodeproj.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport os\nfrom .pbProj           import pbProj\nfrom ..Helpers.Logger import Logger\n\nclass xcodeproj(object):\n\n    def __init__(self, xcodeproj_file_path):\n        if os.path.exists(xcodeproj_file_path):\n            if xcodeproj_file_path.endswith(('.xcodeproj', '.pbproj')):\n                self.file_path = xcodeproj_file_path\n                # loading the pbxproj\n                pbxproj_file_path = os.path.join(self.file_path, 'project.pbxproj')\n                if os.path.exists(pbxproj_file_path):\n                    self.project_file = pbProj.PBXProj(pbxproj_file_path)\n                else: # pragma: no cover\n                    Logger.write().error('Could not find the pbxproj file!')\n            else: # pragma: no cover\n                Logger.write().error('Not a Xcode project file!')\n        else: # pragma: no cover\n            Logger.write().error('Could not find the Xcode project file!')\n\n    def projects(self):\n        return self.project_file.projects()\n"
  },
  {
    "path": "nslocalizer.py",
    "content": "#!/usr/bin/python\n\nimport nslocalizer\n\ndef main():\n    nslocalizer.main()\n\nif __name__ == \"__main__\":\n    main()"
  },
  {
    "path": "pylintrc",
    "content": "[MASTER]\n\n# Add files or directories to the blacklist. They should be base names, not\n# paths.\nignore=\n\n# Add files or directories matching the regex patterns to the blacklist. The\n# regex matches against base names, not paths.\nignore-patterns=\n\n# Pickle collected data for later comparisons.\npersistent=yes\n\n# List of plugins (as comma separated values of python modules names) to load,\n# usually to register additional checkers.\nload-plugins=\n\n# Use multiple processes to speed up Pylint.\njobs=1\n\n# Allow loading of arbitrary C extensions. Extensions are imported into the\n# active Python interpreter and may run arbitrary code.\nunsafe-load-any-extension=no\n\n# A comma-separated list of package or module names from where C extensions may\n# be loaded. Extensions are loading into the active Python interpreter and may\n# run arbitrary code\nextension-pkg-whitelist=\n\n# Allow optimization of some AST trees. This will activate a peephole AST\n# optimizer, which will apply various small optimizations. For instance, it can\n# be used to obtain the result of joining multiple strings with the addition\n# operator. Joining a lot of strings can lead to a maximum recursion error in\n# Pylint and this flag can prevent that. It has one side effect, the resulting\n# AST will be different than the one from reality. This option is deprecated\n# and it will be removed in Pylint 2.0.\noptimize-ast=no\n\n\n[MESSAGES CONTROL]\n\n# Only show warnings with the listed confidence levels. Leave empty to show\n# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED\nconfidence=\n\n# Enable the message, report, category or checker with the given id(s). You can\n# either give multiple identifier separated by comma (,) or put this option\n# multiple time (only on the command line, not in the configuration file where\n# it should appear only once). See also the \"--disable\" option for examples.\n#enable=\n\n# Disable the message, report, category or checker with the given id(s). You\n# can either give multiple identifiers separated by comma (,) or put this\n# option multiple times (only on the command line, not in the configuration\n# file where it should appear only once).You can also use \"--disable=all\" to\n# disable everything first and then reenable specific checks. For example, if\n# you want to run only the similarities checker, you can use \"--disable=all\n# --enable=similarities\". If you want to run only the classes checker, but have\n# no Warning level messages displayed, use\"--disable=all --enable=classes\n# --disable=W\"\ndisable=missing-docstring,too-many-lines,locally-disabled,too-many-ancestors\n\n\n[REPORTS]\n\n# Set the output format. Available formats are text, parseable, colorized, msvs\n# (visual studio) and html. You can also give a reporter class, eg\n# mypackage.mymodule.MyReporterClass.\noutput-format=text\n\n# Put messages in a separate file for each module / package specified on the\n# command line instead of printing them on stdout. Reports (if any) will be\n# written in a file name \"pylint_global.[txt|html]\". This option is deprecated\n# and it will be removed in Pylint 2.0.\nfiles-output=no\n\n# Tells whether to display a full report or only the messages\nreports=yes\n\n# Python expression which should return a note less than 10 (10 is the highest\n# note). You have access to the variables errors warning, statement which\n# respectively contain the number of errors / warnings messages and the total\n# number of statements analyzed. This is used by the global evaluation report\n# (RP0004).\nevaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)\n\n# Template used to display messages. This is a python new-style format string\n# used to format the message information. See doc for all details\n#msg-template=\n\n\n[BASIC]\n\n# Good variable names which should always be accepted, separated by a comma\ngood-names=Run,_\n\n# Bad variable names which should always be refused, separated by a comma\nbad-names=foo,bar,baz,toto,tutu,tata,i,j,k,idx\n\n# Colon-delimited sets of names that determine each other's naming style when\n# the name regexes allow several styles.\nname-group=\n\n# Include a hint for the correct naming format with invalid-name\ninclude-naming-hint=no\n\n# List of decorators that produce properties, such as abc.abstractproperty. Add\n# to this list to register other decorators that produce valid properties.\nproperty-classes=abc.abstractproperty\n\n# Regular expression matching correct function names\nfunction-rgx=[A-Za-z_][a-zA-Z0-9_]{2,40}$\n\n# Naming hint for function names\nfunction-name-hint=[A-Za-z_][a-zA-Z0-9_]{2,40}$\n\n# Regular expression matching correct variable names\nvariable-rgx=[a-z_][a-z0-9_]{2,30}$\n\n# Naming hint for variable names\nvariable-name-hint=[a-z_][a-z0-9_]{2,30}$\n\n# Regular expression matching correct constant names\nconst-rgx=(([A-Za-z_][A-Za-z0-9_]*)|(__.*__))$\n\n# Naming hint for constant names\nconst-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$\n\n# Regular expression matching correct attribute names\nattr-rgx=[a-z_][a-z0-9_]{2,30}$\n\n# Naming hint for attribute names\nattr-name-hint=[a-z_][a-z0-9_]{2,30}$\n\n# Regular expression matching correct argument names\nargument-rgx=[a-z_][a-z0-9_]{2,30}$\n\n# Naming hint for argument names\nargument-name-hint=[a-z_][a-z0-9_]{2,30}$\n\n# Regular expression matching correct class attribute names\nclass-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$\n\n# Naming hint for class attribute names\nclass-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$\n\n# Regular expression matching correct inline iteration names\ninlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$\n\n# Naming hint for inline iteration names\ninlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$\n\n# Regular expression matching correct class names\nclass-rgx=[a-zA-Z0-9_]+$\n\n# Naming hint for class names\nclass-name-hint=[a-zA-Z0-9_]+$\n\n# Regular expression matching correct module names\nmodule-rgx=(([a-z_][a-z0-9_]*)|([A-Za-z][a-zA-Z0-9_]+))$\n\n# Naming hint for module names\nmodule-name-hint=(([a-z_][a-z0-9_]*)|([A-Za-z][a-zA-Z0-9]+))$\n\n# Regular expression matching correct method names\nmethod-rgx=[a-z_][a-zA-Z0-9_]{2,40}$\n\n# Naming hint for method names\nmethod-name-hint=[a-zA-Z0-9_]{2,40}$\n\n# Regular expression which should only match function or class names that do\n# not require a docstring.\nno-docstring-rgx=^_\n\n# Minimum line length for functions/classes that require docstrings, shorter\n# ones are exempt.\ndocstring-min-length=0\n\n\n[ELIF]\n\n# Maximum number of nested blocks for function / method body\nmax-nested-blocks=5\n\n\n[FORMAT]\n\n# Maximum number of characters on a single line.\nmax-line-length=100000\n\n# Regexp for a line that is allowed to be longer than the limit.\nignore-long-lines=^\\s*(# )?<?https?://\\S+>?$\n\n# Allow the body of an if to be on the same line as the test if there is no\n# else.\nsingle-line-if-stmt=no\n\n# List of optional constructs for which whitespace checking is disabled. `dict-\n# separator` is used to allow tabulation in dicts, etc.: {1  : 1,\\n222: 2}.\n# `trailing-comma` allows a space between comma and closing bracket: (a, ).\n# `empty-line` allows space-only lines.\nno-space-check=trailing-comma,dict-separator\n\n# Maximum number of lines in a module\nmax-module-lines=0\n\n# String used as indentation unit. This is usually \"    \" (4 spaces) or \"\\t\" (1\n# tab).\nindent-string='    '\n\n# Number of spaces of indent required inside a hanging  or continued line.\nindent-after-paren=4\n\n# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.\nexpected-line-ending-format=\n\n\n[LOGGING]\n\n# Logging modules to check that the string format arguments are in logging\n# function parameter format\nlogging-modules=logging\n\n\n[MISCELLANEOUS]\n\n# List of note tags to take in consideration, separated by a comma.\nnotes=FIXME,XXX,TODO\n\n\n[SIMILARITIES]\n\n# Minimum lines number of a similarity.\nmin-similarity-lines=10\n\n# Ignore comments when computing similarities.\nignore-comments=yes\n\n# Ignore docstrings when computing similarities.\nignore-docstrings=yes\n\n# Ignore imports when computing similarities.\nignore-imports=yes\n\n\n[SPELLING]\n\n# Spelling dictionary name. Available dictionaries: none. To make it working\n# install python-enchant package.\nspelling-dict=\n\n# List of comma separated words that should not be checked.\nspelling-ignore-words=\n\n# A path to a file that contains private dictionary; one word per line.\nspelling-private-dict-file=\n\n# Tells whether to store unknown words to indicated private dictionary in\n# --spelling-private-dict-file option instead of raising a message.\nspelling-store-unknown-words=no\n\n\n[TYPECHECK]\n\n# Tells whether missing members accessed in mixin class should be ignored. A\n# mixin class is detected if its name ends with \"mixin\" (case insensitive).\nignore-mixin-members=yes\n\n# List of module names for which member attributes should not be checked\n# (useful for modules/projects where namespaces are manipulated during runtime\n# and thus existing member attributes cannot be deduced by static analysis. It\n# supports qualified module names, as well as Unix pattern matching.\nignored-modules=\n\n# List of class names for which member attributes should not be checked (useful\n# for classes with dynamically set attributes). This supports the use of\n# qualified names.\nignored-classes=optparse.Values,thread._local,_thread._local\n\n# List of members which are set dynamically and missed by pylint inference\n# system, and so shouldn't trigger E1101 when accessed. Python regular\n# expressions are accepted.\ngenerated-members=\n\n# List of decorators that produce context managers, such as\n# contextlib.contextmanager. Add to this list to register other decorators that\n# produce valid context managers.\ncontextmanager-decorators=contextlib.contextmanager\n\n\n[VARIABLES]\n\n# Tells whether we should check for unused import in __init__ files.\ninit-import=no\n\n# A regular expression matching the name of dummy variables (i.e. expectedly\n# not used).\ndummy-variables-rgx=(_+[a-zA-Z0-9]*?$)|dummy\n\n# List of additional names supposed to be defined in builtins. Remember that\n# you should avoid to define new builtins when possible.\nadditional-builtins=\n\n# List of strings which can identify a callback function by name. A callback\n# name must start or end with one of those strings.\ncallbacks=cb_,_cb\n\n# List of qualified module names which can have objects that can redefine\n# builtins.\nredefining-builtins-modules=six.moves,future.builtins\n\n\n[CLASSES]\n\n# List of method names used to declare (i.e. assign) instance attributes.\ndefining-attr-methods=__init__,__new__,setUp\n\n# List of valid names for the first argument in a class method.\nvalid-classmethod-first-arg=cls\n\n# List of valid names for the first argument in a metaclass class method.\nvalid-metaclass-classmethod-first-arg=mcs\n\n# List of member names, which should be excluded from the protected access\n# warning.\nexclude-protected=_asdict,_fields,_replace,_source,_make\n\n\n[DESIGN]\n\n# Maximum number of arguments for function / method\nmax-args=5\n\n# Argument names that match this expression will be ignored. Default to name\n# with leading underscore\nignored-argument-names=_.*\n\n# Maximum number of locals for function / method body\nmax-locals=15\n\n# Maximum number of return / yield for function / method body\nmax-returns=1\n\n# Maximum number of branch for function / method body\nmax-branches=12\n\n# Maximum number of statements in function / method body\nmax-statements=50\n\n# Maximum number of parents for a class (see R0901).\nmax-parents=7\n\n# Maximum number of attributes for a class (see R0902).\nmax-attributes=10\n\n# Minimum number of public methods for a class (see R0903).\nmin-public-methods=0\n\n# Maximum number of public methods for a class (see R0904).\nmax-public-methods=20\n\n# Maximum number of boolean expressions in a if statement\nmax-bool-expr=3\n\n\n[IMPORTS]\n\n# Deprecated modules which should not be used, separated by a comma\ndeprecated-modules=regsub,TERMIOS,Bastion,rexec\n\n# Create a graph of every (i.e. internal and external) dependencies in the\n# given file (report RP0402 must not be disabled)\nimport-graph=\n\n# Create a graph of external dependencies in the given file (report RP0402 must\n# not be disabled)\next-import-graph=\n\n# Create a graph of internal dependencies in the given file (report RP0402 must\n# not be disabled)\nint-import-graph=\n\n# Force import order to recognize a module as part of the standard\n# compatibility libraries.\nknown-standard-library=os,re,sys,argparse,logging\n\n# Force import order to recognize a module as part of a third party library.\nknown-third-party=\n\n# Analyse import fallback blocks. This can be used to support both Python 2 and\n# 3 compatible code, which means that the block might have code that exists\n# only in one or another interpreter, leading to false positives when analysed.\nanalyse-fallback-blocks=no\n\n\n[EXCEPTIONS]\n\n# Exceptions that will emit a warning when being caught. Defaults to\n# \"Exception\"\novergeneral-exceptions=Exception\n"
  },
  {
    "path": "readme.md",
    "content": "nslocalizer\n===========\n\n[![Code Climate](https://img.shields.io/codeclimate/github/samdmarshall/nslocalizer.svg)](https://codeclimate.com/github/samdmarshall/nslocalizer)\n[![Test Coverage](https://img.shields.io/codeclimate/coverage/github/samdmarshall/nslocalizer.svg)](https://codeclimate.com/github/samdmarshall/nslocalizer/coverage)\n[![CircleCI branch](https://img.shields.io/circleci/project/samdmarshall/nslocalizer/develop.svg)](https://circleci.com/gh/samdmarshall/nslocalizer/tree/develop)\n[![Dependency Status](https://dependencyci.com/github/samdmarshall/nslocalizer/badge)](https://dependencyci.com/github/samdmarshall/nslocalizer)\n\nThis is a command line tool that is used for discovering missing and unused localization strings in Xcode projects.\n\n## Contributing and Code of Conduct [![License](https://img.shields.io/badge/License-3--Clause%20BSD-blue.svg)](./LICENSE)\nThis project and related material has a Code of Conduct that is listed in the [contributing.md](./contributing.md) file. This must be read and adhered to when interacting with this project. Additionally this code is released under a 3-clause BSD license that you can read [here](./LICENSE).\n\n## Requirements  ![Python](https://img.shields.io/badge/Python3-3.5.0-brightgreen.svg)\nThis tool is built and tested against Python 3.5.0.\n\n   Module | Version\n----------|-----------\npbPlist   | >=1.0\npyobjc-core | >= 2.5.1\npyobjc-framework-Cocoa | >= 2.5.1\nlangcodes | >= 1.2.0\n\n## Installation\nVia pip and python 3\n\n\t$ pip3 install nslocalizer\n\nTo install the tool from the repo, clone from Github then run the `make build` command.\n\n## Usage\nTo use **nslocalizer** to generate warnings about missing or unused NSLocalizedStrings, you will have to pass it a project and target as input:\n\n\t$ nslocalizer --project <path to xcodeproj file> --target <names of targets to analyze>\n\nThere are a number of flags that can be passed to modify the behavior of **pyconfig**:\n\n   Flags | Usage\n-------------------|-----------------------------------------------------------\n`--version`        | Displays the version of **nslocalizer** and exits\n`--find-missing`   | Finds any strings that are missing translations for any of the supported languages\n`--find-unused`    | Finds any strings that are unused in the code\n`--quiet`          | Silences all logging output\n`--verbose`        | Logs additional information\n`--ignore <languages>` | Will silence warnings for any of the languages listed to be ignored\n\n> Note: Both `--find-missing` and `--find-unused` flags can be supplied to the same invocation of `nslocalizer`.\n\n## Example\n\nFind missing translation strings:\n```\n$ nslocalizer --project Foo.xcodeproj --target MyNewApp --find-missing\n/Users/Samantha/Projects/Foo/Foo/Assets/Base.lproj/Localizable.strings:327: warning: String \"foo_setup_twitter_integation\" missing for: German, Traditional Chinese, European Portuguese, Spanish\n/Users/Samantha/Projects/Foo/Foo/Assets/Base.lproj/Localizable.strings:356: warning: String \"foo_setup_facebook_integation\" missing for: German, Traditional Chinese, European Portuguese, Swedish, Polish, Latin American Spanish, British English, Brazilian Portuguese\n```\n\nFind unused translation strings:\n```\n$ nslocalizer --project Foo.xcodeproj --target MyNewApp --find-unused\n/Users/Samantha/Projects/Foo/Foo/Assets/Base.lproj/Localizable.strings:327: warning: String \"foo_setup_twitter_integation\" is not used\n/Users/Samantha/Projects/Foo/Foo/Assets/Base.lproj/Localizable.strings:356: warning: String \"foo_setup_facebook_integation\" is not used\n```\n\n\n## Integration\n**nslocalizer** is intended to be used as part of a build of the Xcode project file. To integrate you will have to add a new \"run script\" phase to your target and then invoke as such:\n\n```\nnslocalizer --project $PROJECT_DIR/YourProject.xcodeproj --target $TARGET_NAME --find-missing --find-unused\n```\n"
  },
  {
    "path": "requirements.txt",
    "content": "coverage >= 4\ntox >= 2.3.1\ntox_pyenv >= 1.0.3\ncodeclimate-test-reporter >= 0.1.2\npylint >= 1.6.1\n\npyobjc-core >= 2.5.1\npyobjc-framework-Cocoa >= 2.5.1\npbPlist >= 1.0.4\nlangcodes >= 1.2.0\n"
  },
  {
    "path": "setup.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n#\n# Redistribution and use in source and binary forms, with or without modification,\n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this\n# list of conditions and the following disclaimer.\n#\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n#\n# 3. Neither the name of Samantha Marshall nor the names of its contributors may\n# be used to endorse or promote products derived from this software without\n# specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom setuptools import setup\nimport sys\n\nif sys.version_info < (3,0):\n    print('This tool requires at least Python 3.0. Please run `brew install python3` first.')\n    sys.exit()\n\nsetup(\n    name = 'nslocalizer',\n    version = '1.0.2',\n    description = 'Tool for finding missing and unused NSLocalizdStrings',\n    url = 'https://github.com/samdmarshall/nslocalizer',\n    author = 'Samantha Marshall',\n    author_email = 'hello@pewpewthespells.com',\n    license = 'BSD 3-Clause',\n    packages = [\n        'nslocalizer',\n        'nslocalizer/Helpers',\n        'nslocalizer/xcodeproj',\n        'nslocalizer/xcodeproj/pbProj',\n        'nslocalizer/Language',\n        'nslocalizer/Executor',\n        'nslocalizer/Finder',\n        'nslocalizer/Reporter',\n        \n    ],\n    entry_points = {\n        'console_scripts': [ 'nslocalizer = nslocalizer:main' ]\n    },\n    test_suite = 'tests',\n    zip_safe = False,\n    install_requires = [\n        'pyobjc-core',\n        'pyobjc-framework-Cocoa',\n        'pbPlist',\n        'langcodes',\n    ]\n)\n"
  },
  {
    "path": "tests/__init__.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n# \n# Redistribution and use in source and binary forms, with or without modification, \n# are permitted provided that the following conditions are met:\n# \n# 1. Redistributions of source code must retain the above copyright notice, this \n# list of conditions and the following disclaimer.\n# \n# 2. Redistributions in binary form must reproduce the above copyright notice, \n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n# \n# 3. Neither the name of Samantha Marshall nor the names of its contributors may \n# be used to endorse or promote products derived from this software without \n# specific prior written permission.\n# \n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR \n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nfrom . import test_runner\n"
  },
  {
    "path": "tests/nslocalizer-example/Base.lproj/Localizable.strings",
    "content": "/* \n  Localizable.strings\n  pylocalizer-example\n\n  Created by Samantha Marshall on 7/27/16.\n  Copyright © 2016 Samantha Marshall. All rights reserved.\n*/\n"
  },
  {
    "path": "tests/nslocalizer-example/de.lproj/Localizable.strings",
    "content": "/* \n  Localizable.strings\n  pylocalizer-example\n\n  Created by Samantha Marshall on 7/27/16.\n  Copyright © 2016 Samantha Marshall. All rights reserved.\n*/\n"
  },
  {
    "path": "tests/nslocalizer-example/en.lproj/Localizable.strings",
    "content": "/* \n  Localizable.strings\n  pylocalizer-example\n\n  Created by Samantha Marshall on 7/27/16.\n  Copyright © 2016 Samantha Marshall. All rights reserved.\n*/\n"
  },
  {
    "path": "tests/nslocalizer-example/es.lproj/Localizable.strings",
    "content": "/* \n  Localizable.strings\n  pylocalizer-example\n\n  Created by Samantha Marshall on 7/27/16.\n  Copyright © 2016 Samantha Marshall. All rights reserved.\n*/\n"
  },
  {
    "path": "tests/nslocalizer-example/fr.lproj/Localizable.strings",
    "content": "/* \n  Localizable.strings\n  pylocalizer-example\n\n  Created by Samantha Marshall on 7/27/16.\n  Copyright © 2016 Samantha Marshall. All rights reserved.\n*/\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/AppDelegate.h",
    "content": "//\n//  AppDelegate.h\n//  pylocalizer-example\n//\n//  Created by Samantha Marshall on 7/27/16.\n//  Copyright © 2016 Samantha Marshall. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n\n@end\n\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/AppDelegate.m",
    "content": "//\n//  AppDelegate.m\n//  pylocalizer-example\n//\n//  Created by Samantha Marshall on 7/27/16.\n//  Copyright © 2016 Samantha Marshall. All rights reserved.\n//\n\n#import \"AppDelegate.h\"\n#import \"DetailViewController.h\"\n\n@interface AppDelegate () <UISplitViewControllerDelegate>\n\n@end\n\n@implementation AppDelegate\n\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n\t// Override point for customization after application launch.\n\tUISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;\n\tUINavigationController *navigationController = [splitViewController.viewControllers lastObject];\n\tnavigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;\n\tsplitViewController.delegate = self;\n\treturn YES;\n}\n\n- (void)applicationWillResignActive:(UIApplication *)application {\n\t// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n\t// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.\n}\n\n- (void)applicationDidEnterBackground:(UIApplication *)application {\n\t// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n\t// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n}\n\n- (void)applicationWillEnterForeground:(UIApplication *)application {\n\t// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.\n}\n\n- (void)applicationDidBecomeActive:(UIApplication *)application {\n\t// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n}\n\n- (void)applicationWillTerminate:(UIApplication *)application {\n\t// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n}\n\n#pragma mark - Split view\n\n- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController {\n    if ([secondaryViewController isKindOfClass:[UINavigationController class]] && [[(UINavigationController *)secondaryViewController topViewController] isKindOfClass:[DetailViewController class]] && ([(DetailViewController *)[(UINavigationController *)secondaryViewController topViewController] detailItem] == nil)) {\n        // Return YES to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.\n        return YES;\n    } else {\n        return NO;\n    }\n}\n\n@end\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15G31\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Llm-lL-Icb\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xb3-aO-Qok\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"6211\" systemVersion=\"14A298i\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" initialViewController=\"H1p-Uh-vWS\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"6204\"/>\n    </dependencies>\n    <scenes>\n        <!--Master-->\n        <scene sceneID=\"pY4-Hu-kfo\">\n            <objects>\n                <navigationController title=\"Master\" id=\"RMx-3f-FxP\" sceneMemberID=\"viewController\">\n                    <navigationBar key=\"navigationBar\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" id=\"Pmd-2v-anx\">\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"7bK-jq-Zjz\" kind=\"relationship\" relationship=\"rootViewController\" id=\"tsl-Nk-0bq\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"8fS-aE-onr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-38\" y=\"-630\"/>\n        </scene>\n        <!--Detail-->\n        <scene sceneID=\"yUG-lL-AsK\">\n            <objects>\n                <viewController title=\"Detail\" id=\"JEX-9P-axG\" customClass=\"DetailViewController\" customModuleProvider=\"\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"SYR-Wa-9uf\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"GAO-Cl-Wes\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"svH-Pt-448\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" text=\"Detail view content goes here\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" minimumFontSize=\"10\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0XM-y9-sOw\">\n                                <rect key=\"frame\" x=\"20\" y=\"292\" width=\"560\" height=\"17\"/>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" size=\"system\"/>\n                                <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstItem=\"0XM-y9-sOw\" firstAttribute=\"leading\" secondItem=\"svH-Pt-448\" secondAttribute=\"leading\" constant=\"20\" symbolic=\"YES\" id=\"Tsc-yG-G1q\"/>\n                            <constraint firstItem=\"0XM-y9-sOw\" firstAttribute=\"centerY\" secondItem=\"svH-Pt-448\" secondAttribute=\"centerY\" id=\"jWN-iV-94e\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"0XM-y9-sOw\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"tHV-ZD-HQj\"/>\n                        </constraints>\n                    </view>\n                    <toolbarItems/>\n                    <navigationItem key=\"navigationItem\" title=\"Detail\" id=\"mOI-FS-AaM\"/>\n                    <connections>\n                        <outlet property=\"detailDescriptionLabel\" destination=\"0XM-y9-sOw\" id=\"deQ-Na-JPF\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"FJe-Yq-33r\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"709\" y=\"129\"/>\n        </scene>\n        <!--Split View Controller-->\n        <scene sceneID=\"Nki-YV-4Qg\">\n            <objects>\n                <splitViewController id=\"H1p-Uh-vWS\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <connections>\n                        <segue destination=\"RMx-3f-FxP\" kind=\"relationship\" relationship=\"masterViewController\" id=\"BlO-5A-QYV\"/>\n                        <segue destination=\"vC3-pB-5Vb\" kind=\"relationship\" relationship=\"detailViewController\" id=\"Tll-UG-LXB\"/>\n                    </connections>\n                </splitViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"cZU-Oi-B1e\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-856\" y=\"-330\"/>\n        </scene>\n        <!--Master-->\n        <scene sceneID=\"smW-Zh-WAh\">\n            <objects>\n                <tableViewController title=\"Master\" clearsSelectionOnViewWillAppear=\"NO\" id=\"7bK-jq-Zjz\" customClass=\"MasterViewController\" customModuleProvider=\"\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"r7i-6Z-zg0\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <prototypes>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"blue\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"Cell\" textLabel=\"Arm-wq-HPj\" style=\"IBUITableViewCellStyleDefault\" id=\"WCw-Qf-5nD\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"86\" width=\"320\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"WCw-Qf-5nD\" id=\"37f-cq-3Eg\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"43\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                    <subviews>\n                                        <label opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" text=\"Title\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"Arm-wq-HPj\">\n                                            <rect key=\"frame\" x=\"15\" y=\"0.0\" width=\"290\" height=\"43\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"20\"/>\n                                            <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                                            <color key=\"highlightedColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        </label>\n                                    </subviews>\n                                </tableViewCellContentView>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <connections>\n                                    <segue destination=\"vC3-pB-5Vb\" kind=\"showDetail\" identifier=\"showDetail\" id=\"6S0-TO-JiA\"/>\n                                </connections>\n                            </tableViewCell>\n                        </prototypes>\n                        <sections/>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"7bK-jq-Zjz\" id=\"Gho-Na-rnu\"/>\n                            <outlet property=\"delegate\" destination=\"7bK-jq-Zjz\" id=\"RA6-mI-bju\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Master\" id=\"Zdf-7t-Un8\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Rux-fX-hf1\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"709\" y=\"-630\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"r7l-gg-dq7\">\n            <objects>\n                <navigationController id=\"vC3-pB-5Vb\" sceneMemberID=\"viewController\">\n                    <navigationBar key=\"navigationBar\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" id=\"DjV-YW-jjY\">\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"JEX-9P-axG\" kind=\"relationship\" relationship=\"rootViewController\" id=\"GKi-kA-LjT\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"SLD-UC-DBI\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-45\" y=\"129\"/>\n        </scene>\n    </scenes>\n    <inferredMetricsTieBreakers>\n        <segue reference=\"6S0-TO-JiA\"/>\n    </inferredMetricsTieBreakers>\n</document>\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/DetailViewController.h",
    "content": "//\n//  DetailViewController.h\n//  pylocalizer-example\n//\n//  Created by Samantha Marshall on 7/27/16.\n//  Copyright © 2016 Samantha Marshall. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface DetailViewController : UIViewController\n\n@property (strong, nonatomic) id detailItem;\n@property (weak, nonatomic) IBOutlet UILabel *detailDescriptionLabel;\n\n@end\n\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/DetailViewController.m",
    "content": "//\n//  DetailViewController.m\n//  pylocalizer-example\n//\n//  Created by Samantha Marshall on 7/27/16.\n//  Copyright © 2016 Samantha Marshall. All rights reserved.\n//\n\n#import \"DetailViewController.h\"\n\n@interface DetailViewController ()\n\n@end\n\n@implementation DetailViewController\n\n#pragma mark - Managing the detail item\n\n- (void)setDetailItem:(id)newDetailItem {\n\tif (_detailItem != newDetailItem) {\n\t    _detailItem = newDetailItem;\n\t        \n\t    // Update the view.\n\t    [self configureView];\n\t}\n}\n\n- (void)configureView {\n\t// Update the user interface for the detail item.\n\tif (self.detailItem) {\n\t    self.detailDescriptionLabel.text = [self.detailItem description];\n\t}\n}\n\n- (void)viewDidLoad {\n\t[super viewDidLoad];\n\t// Do any additional setup after loading the view, typically from a nib.\n\t[self configureView];\n}\n\n- (void)didReceiveMemoryWarning {\n\t[super didReceiveMemoryWarning];\n\t// Dispose of any resources that can be recreated.\n}\n\n@end\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIStatusBarTintParameters</key>\n\t<dict>\n\t\t<key>UINavigationBar</key>\n\t\t<dict>\n\t\t\t<key>Style</key>\n\t\t\t<string>UIBarStyleDefault</string>\n\t\t\t<key>Translucent</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</dict>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/MasterViewController.h",
    "content": "//\n//  MasterViewController.h\n//  pylocalizer-example\n//\n//  Created by Samantha Marshall on 7/27/16.\n//  Copyright © 2016 Samantha Marshall. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@class DetailViewController;\n\n@interface MasterViewController : UITableViewController\n\n@property (strong, nonatomic) DetailViewController *detailViewController;\n\n\n@end\n\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/MasterViewController.m",
    "content": "//\n//  MasterViewController.m\n//  pylocalizer-example\n//\n//  Created by Samantha Marshall on 7/27/16.\n//  Copyright © 2016 Samantha Marshall. All rights reserved.\n//\n\n#import \"MasterViewController.h\"\n#import \"DetailViewController.h\"\n\n@interface MasterViewController ()\n\n@property NSMutableArray *objects;\n@end\n\n@implementation MasterViewController\n\n- (void)viewDidLoad {\n\t[super viewDidLoad];\n\t// Do any additional setup after loading the view, typically from a nib.\n\tself.navigationItem.leftBarButtonItem = self.editButtonItem;\n\n\tUIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];\n\tself.navigationItem.rightBarButtonItem = addButton;\n\tself.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];\n}\n\n- (void)viewWillAppear:(BOOL)animated {\n\tself.clearsSelectionOnViewWillAppear = self.splitViewController.isCollapsed;\n\t[super viewWillAppear:animated];\n}\n\n- (void)didReceiveMemoryWarning {\n\t[super didReceiveMemoryWarning];\n\t// Dispose of any resources that can be recreated.\n}\n\n- (void)insertNewObject:(id)sender {\n\tif (!self.objects) {\n\t    self.objects = [[NSMutableArray alloc] init];\n\t}\n\t[self.objects insertObject:[NSDate date] atIndex:0];\n\tNSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];\n\t[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];\n}\n\n#pragma mark - Segues\n\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {\n\tif ([[segue identifier] isEqualToString:@\"showDetail\"]) {\n\t    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];\n\t    NSDate *object = self.objects[indexPath.row];\n\t    DetailViewController *controller = (DetailViewController *)[[segue destinationViewController] topViewController];\n\t    [controller setDetailItem:object];\n\t    controller.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;\n\t    controller.navigationItem.leftItemsSupplementBackButton = YES;\n\t}\n}\n\n#pragma mark - Table View\n\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {\n\treturn 1;\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {\n\treturn self.objects.count;\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {\n\tUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"Cell\" forIndexPath:indexPath];\n\n\tNSDate *object = self.objects[indexPath.row];\n\tcell.textLabel.text = [object description];\n\treturn cell;\n}\n\n- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {\n\t// Return NO if you do not want the specified item to be editable.\n\treturn YES;\n}\n\n- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {\n\tif (editingStyle == UITableViewCellEditingStyleDelete) {\n\t    [self.objects removeObjectAtIndex:indexPath.row];\n\t    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];\n\t} else if (editingStyle == UITableViewCellEditingStyleInsert) {\n\t    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.\n\t}\n}\n\n@end\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/de.lproj/LaunchScreen.strings",
    "content": "\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/de.lproj/Main.strings",
    "content": "\n/* Class = \"UILabel\"; text = \"Detail view content goes here\"; ObjectID = \"0XM-y9-sOw\"; */\n\"0XM-y9-sOw.text\" = \"Detail view content goes here\";\n\n/* Class = \"UITableViewController\"; title = \"Master\"; ObjectID = \"7bK-jq-Zjz\"; */\n\"7bK-jq-Zjz.title\" = \"Master\";\n\n/* Class = \"UILabel\"; text = \"Title\"; ObjectID = \"Arm-wq-HPj\"; */\n\"Arm-wq-HPj.text\" = \"Title\";\n\n/* Class = \"UIViewController\"; title = \"Detail\"; ObjectID = \"JEX-9P-axG\"; */\n\"JEX-9P-axG.title\" = \"Detail\";\n\n/* Class = \"UINavigationController\"; title = \"Master\"; ObjectID = \"RMx-3f-FxP\"; */\n\"RMx-3f-FxP.title\" = \"Master\";\n\n/* Class = \"UINavigationItem\"; title = \"Master\"; ObjectID = \"Zdf-7t-Un8\"; */\n\"Zdf-7t-Un8.title\" = \"Master\";\n\n/* Class = \"UINavigationItem\"; title = \"Detail\"; ObjectID = \"mOI-FS-AaM\"; */\n\"mOI-FS-AaM.title\" = \"Detail\";\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/es.lproj/LaunchScreen.strings",
    "content": "\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/es.lproj/Main.strings",
    "content": "\n/* Class = \"UILabel\"; text = \"Detail view content goes here\"; ObjectID = \"0XM-y9-sOw\"; */\n\"0XM-y9-sOw.text\" = \"Detail view content goes here\";\n\n/* Class = \"UITableViewController\"; title = \"Master\"; ObjectID = \"7bK-jq-Zjz\"; */\n\"7bK-jq-Zjz.title\" = \"Master\";\n\n/* Class = \"UILabel\"; text = \"Title\"; ObjectID = \"Arm-wq-HPj\"; */\n\"Arm-wq-HPj.text\" = \"Title\";\n\n/* Class = \"UIViewController\"; title = \"Detail\"; ObjectID = \"JEX-9P-axG\"; */\n\"JEX-9P-axG.title\" = \"Detail\";\n\n/* Class = \"UINavigationController\"; title = \"Master\"; ObjectID = \"RMx-3f-FxP\"; */\n\"RMx-3f-FxP.title\" = \"Master\";\n\n/* Class = \"UINavigationItem\"; title = \"Master\"; ObjectID = \"Zdf-7t-Un8\"; */\n\"Zdf-7t-Un8.title\" = \"Master\";\n\n/* Class = \"UINavigationItem\"; title = \"Detail\"; ObjectID = \"mOI-FS-AaM\"; */\n\"mOI-FS-AaM.title\" = \"Detail\";\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/fr.lproj/LaunchScreen.strings",
    "content": "\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/fr.lproj/Main.strings",
    "content": "\n/* Class = \"UILabel\"; text = \"Detail view content goes here\"; ObjectID = \"0XM-y9-sOw\"; */\n\"0XM-y9-sOw.text\" = \"Detail view content goes here\";\n\n/* Class = \"UITableViewController\"; title = \"Master\"; ObjectID = \"7bK-jq-Zjz\"; */\n\"7bK-jq-Zjz.title\" = \"Master\";\n\n/* Class = \"UILabel\"; text = \"Title\"; ObjectID = \"Arm-wq-HPj\"; */\n\"Arm-wq-HPj.text\" = \"Title\";\n\n/* Class = \"UIViewController\"; title = \"Detail\"; ObjectID = \"JEX-9P-axG\"; */\n\"JEX-9P-axG.title\" = \"Detail\";\n\n/* Class = \"UINavigationController\"; title = \"Master\"; ObjectID = \"RMx-3f-FxP\"; */\n\"RMx-3f-FxP.title\" = \"Master\";\n\n/* Class = \"UINavigationItem\"; title = \"Master\"; ObjectID = \"Zdf-7t-Un8\"; */\n\"Zdf-7t-Un8.title\" = \"Master\";\n\n/* Class = \"UINavigationItem\"; title = \"Detail\"; ObjectID = \"mOI-FS-AaM\"; */\n\"mOI-FS-AaM.title\" = \"Detail\";\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example/main.m",
    "content": "//\n//  main.m\n//  pylocalizer-example\n//\n//  Created by Samantha Marshall on 7/27/16.\n//  Copyright © 2016 Samantha Marshall. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[]) {\n\t@autoreleasepool {\n\t    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n\t}\n}\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t154465741D49592800243158 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 154465731D49592800243158 /* main.m */; };\n\t\t154465771D49592800243158 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 154465761D49592800243158 /* AppDelegate.m */; };\n\t\t1544657A1D49592800243158 /* MasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 154465791D49592800243158 /* MasterViewController.m */; };\n\t\t1544657D1D49592800243158 /* DetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1544657C1D49592800243158 /* DetailViewController.m */; };\n\t\t154465801D49592800243158 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1544657E1D49592800243158 /* Main.storyboard */; };\n\t\t154465821D49592800243158 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 154465811D49592800243158 /* Assets.xcassets */; };\n\t\t154465851D49592800243158 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 154465831D49592800243158 /* LaunchScreen.storyboard */; };\n\t\t154465961D495A9C00243158 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 154465981D495A9C00243158 /* Localizable.strings */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t1544656F1D49592800243158 /* pylocalizer-example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"pylocalizer-example.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t154465731D49592800243158 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t154465751D49592800243158 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t154465761D49592800243158 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t154465781D49592800243158 /* MasterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MasterViewController.h; sourceTree = \"<group>\"; };\n\t\t154465791D49592800243158 /* MasterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MasterViewController.m; sourceTree = \"<group>\"; };\n\t\t1544657B1D49592800243158 /* DetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DetailViewController.h; sourceTree = \"<group>\"; };\n\t\t1544657C1D49592800243158 /* DetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DetailViewController.m; sourceTree = \"<group>\"; };\n\t\t1544657F1D49592800243158 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t154465811D49592800243158 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t154465841D49592800243158 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t154465861D49592800243158 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t154465971D495A9C00243158 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\t154465991D495A9D00243158 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\t1544659D1D495ADE00243158 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\t1544659E1D495AE600243158 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n\t\t1544659F1D495AEB00243158 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1544656C1D49592800243158 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t154465661D49592800243158 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t154465981D495A9C00243158 /* Localizable.strings */,\n\t\t\t\t154465711D49592800243158 /* pylocalizer-example */,\n\t\t\t\t154465701D49592800243158 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t154465701D49592800243158 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1544656F1D49592800243158 /* pylocalizer-example.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t154465711D49592800243158 /* pylocalizer-example */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t154465751D49592800243158 /* AppDelegate.h */,\n\t\t\t\t154465761D49592800243158 /* AppDelegate.m */,\n\t\t\t\t154465781D49592800243158 /* MasterViewController.h */,\n\t\t\t\t154465791D49592800243158 /* MasterViewController.m */,\n\t\t\t\t1544657B1D49592800243158 /* DetailViewController.h */,\n\t\t\t\t1544657C1D49592800243158 /* DetailViewController.m */,\n\t\t\t\t1544657E1D49592800243158 /* Main.storyboard */,\n\t\t\t\t154465811D49592800243158 /* Assets.xcassets */,\n\t\t\t\t154465831D49592800243158 /* LaunchScreen.storyboard */,\n\t\t\t\t154465861D49592800243158 /* Info.plist */,\n\t\t\t\t154465721D49592800243158 /* Supporting Files */,\n\t\t\t);\n\t\t\tpath = \"pylocalizer-example\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t154465721D49592800243158 /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t154465731D49592800243158 /* main.m */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1544656E1D49592800243158 /* pylocalizer-example */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 154465891D49592800243158 /* Build configuration list for PBXNativeTarget \"pylocalizer-example\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1544656B1D49592800243158 /* Sources */,\n\t\t\t\t1544656C1D49592800243158 /* Frameworks */,\n\t\t\t\t1544656D1D49592800243158 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"pylocalizer-example\";\n\t\t\tproductName = \"pylocalizer-example\";\n\t\t\tproductReference = 1544656F1D49592800243158 /* pylocalizer-example.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t154465671D49592800243158 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0730;\n\t\t\t\tORGANIZATIONNAME = \"Samantha Marshall\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t1544656E1D49592800243158 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 1544656A1D49592800243158 /* Build configuration list for PBXProject \"pylocalizer-example\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t\tfr,\n\t\t\t\tde,\n\t\t\t\tes,\n\t\t\t);\n\t\t\tmainGroup = 154465661D49592800243158;\n\t\t\tproductRefGroup = 154465701D49592800243158 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t1544656E1D49592800243158 /* pylocalizer-example */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1544656D1D49592800243158 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t154465851D49592800243158 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t154465961D495A9C00243158 /* Localizable.strings in Resources */,\n\t\t\t\t154465821D49592800243158 /* Assets.xcassets in Resources */,\n\t\t\t\t154465801D49592800243158 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t1544656B1D49592800243158 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t154465771D49592800243158 /* AppDelegate.m in Sources */,\n\t\t\t\t1544657A1D49592800243158 /* MasterViewController.m in Sources */,\n\t\t\t\t154465741D49592800243158 /* main.m in Sources */,\n\t\t\t\t1544657D1D49592800243158 /* DetailViewController.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t1544657E1D49592800243158 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1544657F1D49592800243158 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t154465831D49592800243158 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t154465841D49592800243158 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t154465981D495A9C00243158 /* Localizable.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t154465971D495A9C00243158 /* Base */,\n\t\t\t\t154465991D495A9D00243158 /* en */,\n\t\t\t\t1544659D1D495ADE00243158 /* fr */,\n\t\t\t\t1544659E1D495AE600243158 /* de */,\n\t\t\t\t1544659F1D495AEB00243158 /* es */,\n\t\t\t);\n\t\t\tname = Localizable.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t154465871D49592800243158 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t154465881D49592800243158 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.3;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1544658A1D49592800243158 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tINFOPLIST_FILE = \"pylocalizer-example/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.pewpewthespells.pylocalizer-example\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1544658B1D49592800243158 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tINFOPLIST_FILE = \"pylocalizer-example/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.pewpewthespells.pylocalizer-example\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1544656A1D49592800243158 /* Build configuration list for PBXProject \"pylocalizer-example\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t154465871D49592800243158 /* Debug */,\n\t\t\t\t154465881D49592800243158 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t154465891D49592800243158 /* Build configuration list for PBXNativeTarget \"pylocalizer-example\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1544658A1D49592800243158 /* Debug */,\n\t\t\t\t1544658B1D49592800243158 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 154465671D49592800243158 /* Project object */;\n}\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:pylocalizer-example.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example.xcodeproj/xcuserdata/Samantha.xcuserdatad/xcschemes/pylocalizer-example.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0730\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"1544656E1D49592800243158\"\n               BuildableName = \"pylocalizer-example.app\"\n               BlueprintName = \"pylocalizer-example\"\n               ReferencedContainer = \"container:pylocalizer-example.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"1544656E1D49592800243158\"\n            BuildableName = \"pylocalizer-example.app\"\n            BlueprintName = \"pylocalizer-example\"\n            ReferencedContainer = \"container:pylocalizer-example.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"1544656E1D49592800243158\"\n            BuildableName = \"pylocalizer-example.app\"\n            BlueprintName = \"pylocalizer-example\"\n            ReferencedContainer = \"container:pylocalizer-example.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"1544656E1D49592800243158\"\n            BuildableName = \"pylocalizer-example.app\"\n            BlueprintName = \"pylocalizer-example\"\n            ReferencedContainer = \"container:pylocalizer-example.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "tests/nslocalizer-example/pylocalizer-example.xcodeproj/xcuserdata/Samantha.xcuserdatad/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>SchemeUserState</key>\n\t<dict>\n\t\t<key>pylocalizer-example.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>0</integer>\n\t\t</dict>\n\t</dict>\n\t<key>SuppressBuildableAutocreation</key>\n\t<dict>\n\t\t<key>1544656E1D49592800243158</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "tests/nslocalizer_test.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n# \n# Redistribution and use in source and binary forms, with or without modification, \n# are permitted provided that the following conditions are met:\n# \n# 1. Redistributions of source code must retain the above copyright notice, this \n# list of conditions and the following disclaimer.\n# \n# 2. Redistributions in binary form must reproduce the above copyright notice, \n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n# \n# 3. Neither the name of Samantha Marshall nor the names of its contributors may \n# be used to endorse or promote products derived from this software without \n# specific prior written permission.\n# \n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR \n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport os\nimport unittest\nfrom nslocalizer import main\n\nclass nslocalizerTestCases(unittest.TestCase):\n    \n    def test_missing_strings(self):\n        example_path = os.path.join(os.path.dirname(__file__), 'nslocalizer-example/pylocalizer-example.xcodeproj')\n        main(['--project', example_path, '--target', 'pylocalizer-example', '--find-missing'])\n        self.assertTrue(True)\n\n    def test_unused_strings(self):\n        example_path = os.path.join(os.path.dirname(__file__), 'nslocalizer-example/pylocalizer-example.xcodeproj')\n        main(['--project', example_path, '--target', 'pylocalizer-example', '--find-unused'])\n        self.assertTrue(True)\n"
  },
  {
    "path": "tests/test_runner.py",
    "content": "# Copyright (c) 2016, Samantha Marshall (http://pewpewthespells.com)\n# All rights reserved.\n#\n# https://github.com/samdmarshall/nslocalizer\n# \n# Redistribution and use in source and binary forms, with or without modification, \n# are permitted provided that the following conditions are met:\n# \n# 1. Redistributions of source code must retain the above copyright notice, this \n# list of conditions and the following disclaimer.\n# \n# 2. Redistributions in binary form must reproduce the above copyright notice, \n# this list of conditions and the following disclaimer in the documentation and/or\n# other materials provided with the distribution.\n# \n# 3. Neither the name of Samantha Marshall nor the names of its contributors may \n# be used to endorse or promote products derived from this software without \n# specific prior written permission.\n# \n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n# IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR \n# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n# OF THE POSSIBILITY OF SUCH DAMAGE.\n\nimport unittest \nfrom . import nslocalizer_test\n\nif __name__ == '__main__':\n    testsuite = unittest.TestLoader()\n    testsuite.addTest(nslocalizer_test.nslocalizerTestCases)\n    unittest.TextTestRunner(verbosity=1).run(testsuite)\n"
  },
  {
    "path": "tools/checkout_by_version.sh",
    "content": "#!/bin/bash\ncommit_hash=\"$1\"\nactual_commit=`git rev-list --all --parents | grep \". $commit_hash\" | awk '{print $1}'`\ngit checkout $actual_commit"
  },
  {
    "path": "tools/hooks/pre-commit",
    "content": "#!/bin/sh\ngit_path=`git rev-parse --show-toplevel`\npushd $git_path\n\t\ncommit_hash=`git rev-parse --short HEAD`\nremote_origin=`git ls-remote --get-url`\necho \"remote_origin = '$remote_origin'\\ncommit_hash = '$commit_hash'\" > ./nslocalizer/version_info.py\ngit add ./nslocalizer/version_info.py\n\npopd"
  },
  {
    "path": "tools/hooks-config.py",
    "content": "#!/usr/bin/env python\n\nimport sys\nimport os\nimport filecmp\nimport shutil\nimport stat\n\n# Copies the commit-msg file into the .git/hooks directory to be executed by\n# git during commits if it does not already exist or if the file has been changed. \n# Files in the .git/hooks are not tracked, so any updates to commit-msg must \n# occur in the root and be copied over.\nbase_git_hooks_path = '.git/hooks/'\nbase_tools_hooks_path = './tools/hooks/'\nhooks = [ 'pre-commit' ]\n\nif not os.path.exists(base_git_hooks_path):\n    os.mkdir(base_git_hooks_path)\n\nfor hook in hooks:\n    tools_hook_path = os.path.join(base_tools_hooks_path, hook)\n    git_hook_path = os.path.join(base_git_hooks_path, hook)\n    shutil.copy2(tools_hook_path, git_hook_path)\n    st = os.stat(git_hook_path)\n    os.chmod(git_hook_path, st.st_mode | stat.S_IEXEC)\n"
  },
  {
    "path": "tox.ini",
    "content": "[tox]\nplatform = darwin\n\nenvlist = py35\n\n[testenv]\nwhitelist_externals =\n\tcoverage\n\ndeps =\n\tcoverage\n\nsitepackages = True\n\ncommands =\n\tcoverage run --source=./nslocalizer/ setup.py test\n"
  }
]