Skip to content

Commit

Permalink
用 py 文件替代原来的 json 文件作为配置文件
Browse files Browse the repository at this point in the history
  • Loading branch information
leenjewel committed Dec 2, 2015
1 parent e84a012 commit e5e952d
Show file tree
Hide file tree
Showing 5 changed files with 211 additions and 48 deletions.
98 changes: 84 additions & 14 deletions apk.builder/bin/mysdk.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@
import sys,os,argparse
try :
from pyMySDKAPKBuilder.workspace import WorkSpace
from pyMySDKAPKBuilder.importlib import import_module
from pyMySDKAPKBuilder.apkbuilder import APKBuilder
from pyMySDKWebFrontEnd.application import Application
from pyMySDKWebFrontEnd.application import ApplicationDaemon
except ImportError :
pwd = os.path.split(os.path.realpath(__file__))[0]
sys.path.append(os.path.abspath(os.path.join(pwd, os.pardir)))
from pyMySDKAPKBuilder.workspace import WorkSpace
from pyMySDKAPKBuilder.importlib import import_module
from pyMySDKAPKBuilder.apkbuilder import APKBuilder
from pyMySDKWebFrontEnd.application import Application
from pyMySDKWebFrontEnd.application import ApplicationDaemon
Expand All @@ -34,9 +36,10 @@ class MySDKCommand(argparse.ArgumentParser) :

def __init__(self) :
usage = '''
%(prog)s {build, start-server, stop-server, restart-server} [options]
%(prog)s {build, create-server, start-server, stop-server, restart-server} [options]
\t
\tbuild\tBuild project
\tcreate-server\tCreate MySDK Web frontend server
\tstart-server\tStart MySDK Web frontend server
\tstop-server\tStop MySDK Web frontend server
\trestart-server\tRestart MySDK Web frontend server
Expand All @@ -45,7 +48,7 @@ def __init__(self) :

command_help = ''
self.add_argument("command", help = command_help,
choices = ("build", "start-server", "stop-server", "restart-server"))
choices = ("build", "create-server", "start-server", "stop-server", "restart-server"))

sdk_list_help = 'SDK ID list which you want to build'
self.add_argument("--sdk", help = sdk_list_help,
Expand Down Expand Up @@ -111,6 +114,10 @@ def __init__(self) :
self.add_argument("--with-daemon", help = daemon_help,
dest = "daemon", action = "store_true", default = False)

server_path_help = 'Web fronted server path'
self.add_argument("--server-path", help = server_path_help,
dest = "server_path", metavar = "")


def parse_args(self) :
self.args = argparse.ArgumentParser.parse_args(self)
Expand All @@ -121,24 +128,67 @@ def parse_args(self) :
command_method(self.args)


def create_server(self, args) :
server_path = args.server_path
if None == server_path :
server_path = os.getcwd()
if not os.path.exists(server_path) :
os.makedirs(server_path)
print "Create MySDK server on %s" %(server_path)
init_py = open(os.path.join(server_path, "__init__.py"), "w")
init_py.write("")
init_py.close()
settings = '''
import os
pwd = os.path.split(os.path.realpath(__file__))[0]
settings = {
"debug" : True,
"sdk_search_paths" : [{{sdk_search_paths}},],
}
'''
sdk_path = args.sdk_path
if isinstance(sdk_path, list) or isinstance(sdk_path, tuple) :
sdk_search_paths = []
for sdk_dir in sdk_path :
if os.path.exists(sdk_dir) :
sdk_search_paths.append(os.path.abspath(sdk_dir))
settings = settings.replace("{{sdk_search_paths}}", '"%s"' %('","'.join(sdk_search_paths)))
else :
settings = settings.replace("{{sdk_search_paths}},", "")

settings_py_path = os.path.join(server_path, "settings.py")
settings_py = open(settings_py_path, "w")
settings_py.write(settings)
settings_py.close()
print "Now you can run\n\n\tmysdk.py start-server --server-config %s --with-port 8080\n\nto start server." %(os.path.abspath(settings_py_path))


def server_settings(self, args) :
settings = {}
if not args.server_config :
return settings
if os.path.isfile(args.server_config) :
cwd,config_file = os.path.split(os.path.abspath(args.server_config))
os.chdir(cwd)
sys.path.append(cwd)
sys.path.append(os.path.join(cwd, os.pardir))
if '.json' == args.server_config[-5:] :
import json
json_file = open(args.server_config, 'r')
settings = json.load(json_file)
json_file.close()
cwd,json_file = os.path.split(os.path.abspath(args.server_config))
os.chdir(cwd)
if '.py' == args.server_config[-3:] :
config_module = import_module("settings")
settings = config_module.settings
else :
os.chdir(args.server_config)
cwd = os.path.abspath(args.server_config)
sys.path.append(cwd)
sys.path.append(os.path.join(cwd, os.pardir))
return settings


def start_server(self, args) :
print "Start MySDK Server..."
settings = self.server_settings(args)
if args.daemon :
if args.port :
Expand All @@ -148,31 +198,46 @@ def start_server(self, args) :
port = args.port
if not port :
port = 8080
Application(settings).run(port)
sys.exit()
try :
Application(settings).run(port)
except KeyboardInterrupt :
sys.exit(0)
except Exception, e :
sys.stderr.write("Error : %s \n" %(str(e)))
os._exit(1)


def stop_server(self, args) :
print "Stop MySDK Server..."
settings = self.server_settings(args)
ApplicationDaemon(settings).stop()


def restart_server(self, args) :
print "Restart MySDK Server..."
settings = self.server_settings(args)
ApplicationDaemon(settings).restart()


def build(self, args) :
if not os.path.exists(args.work_space) :
os.makedirs(args.work_space)

work_space = os.path.abspath(args.work_space)
init_py = os.path.join(work_space, "__init__.py")
with open(init_py, "a") :
os.utime(init_py, None)
sys.path.append(work_space)

name = args.name
if None == args.name or len(args.name) == 0 :
for path, dirs, files in os.walk(args.work_space) :
if len(dirs) == 0 :
raise Exception("need project name")
name = dirs[0]
break
work_space = WorkSpace(name, args.work_space)
for path, dirs, files in os.walk(work_space) :
if os.path.samefile(path, work_space) :
if len(dirs) == 0 :
raise Exception("need project name")
name = dirs[0]
break
work_space = WorkSpace(name, work_space)

if args.apk_path :
work_space.init_apk(args.apk_path)
Expand Down Expand Up @@ -204,7 +269,12 @@ def build(self, args) :
work_space.init_keystore(args.keystore, args.storepass, args.alias, args.keypass)

apk_builder = APKBuilder(work_space)
apk_builder.build()
ret = apk_builder.build()

if ret.output_apk is not None and os.path.isfile(ret.output_apk) :
print "Output : %s" %(os.path.abspath(ret.output_apk))
else :
print "Build Failed"

work_space.save()

Expand Down
22 changes: 15 additions & 7 deletions apk.builder/pyMySDKAPKBuilder/apkbuilder.py
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,9 @@ def rebuild_apk(self, context) :
error = CommandUtil.run(*commands,
stdout = self.build_stdout,
stderr = self.build_stderr)
if error:
if not os.path.isfile(unsigned_apk_path) :
if not error:
error = "unknow error"
raise Exception("APKBuilder rebuild_apk rebuild ERROR:\n%s\n%s" %(" ".join(commands), error))
context.unsigned_apk_path = unsigned_apk_path
return context
Expand All @@ -466,9 +468,12 @@ def sign_apk(self, context, keystore, storepass, alias, keypass = None) :
error = CommandUtil.run(*commands,
stdout = self.build_stdout,
stderr = self.build_stderr)
if error:
raise Exception("APKBuilder sign_apk ERROR:\n%s\n%s" %(" ".join(commands), error))
context.signed_apk_path = signed_apk_path
if not os.path.isfile(signed_apk_path) :
if not error:
error = "unknow error"
sys.stderr.write("APKBuilder sign_apk ERROR:\n%s\n%s\n" %(" ".join(commands), error))
else :
context.signed_apk_path = signed_apk_path
return context


Expand All @@ -484,9 +489,12 @@ def align_apk(self, context) :
error = CommandUtil.run(*commands,
stdout = self.build_stdout,
stderr = self.build_stderr)
if error :
raise Exception("APKBuilder zipalign ERROR:\n%s\n%s" %(" ".join(commands), error))
context.align_apk_path = align_apk_path
if not os.path.isfile(align_apk_path) :
if not error :
error = "unknow error"
sys.stderr.write("APKBuilder zipalign ERROR:\n%s\n%s\n" %(" ".join(commands), error))
else :
context.align_apk_path = align_apk_path
return context


Expand Down
53 changes: 53 additions & 0 deletions apk.builder/pyMySDKAPKBuilder/importlib.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/usr/bin/env python
#
# Copyright 2015 leenjewel
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

import sys

def _resolve_name(name, package, level):
'''
Return the absolute name of the module to be imported.
'''
if not hasattr(package, 'rindex'):
raise ValueError('"package" not set to a string')
dot = len(package)
for x in xrange(level, 1, -1):
try:
dot = package.rindex('.', 0, dot)
except ValueError:
raise ValueError('attempted relative import beyond top-level package')
return '%s.%s' % (package[:dot], name)


def import_module(name, package=None):
'''
Import a module.
The 'package' argument is required when performing a relative import. It
specifies the package to use as the anchor point from which to resolve the
relative import to an absolute import.
'''
if name.startswith('.'):
if not package:
raise TypeError('relative imports require the "package" argument')
level = 0
for character in name:
if character != '.':
break
level += 1
name = _resolve_name(name[level:], package, level)
__import__(name)
return sys.modules[name]

60 changes: 45 additions & 15 deletions apk.builder/pyMySDKAPKBuilder/workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,10 @@
}
"""

import os
import sys,os
import json
import shutil
from importlib import import_module
from sdkconfig import SDKConfig

class WorkSpace(object) :
Expand Down Expand Up @@ -78,12 +79,14 @@ def init_work_space(self, name, root) :
if not os.path.exists(work_dir) :
os.mkdir(work_dir)
self.context["work_dir"] = work_dir
work_space_json = os.path.join(root, "workspace.json")
if os.path.isfile(work_space_json) :
self.open(work_space_json)
work_space_json = os.path.join(work_dir, "workspace.json")
if os.path.isfile(work_space_json) :
self.open(work_space_json)

work_space_py = os.path.join(root, "workspace.py")
if os.path.isfile(work_space_py) :
self.open(work_space_py)

project_py = os.path.join(work_dir, "workspace.py")
if os.path.isfile(project_py) and False == os.path.samefile(work_space_py, project_py) :
self.open(project_py)


def is_exe(self, file_path) :
Expand Down Expand Up @@ -128,7 +131,14 @@ def init_output_apk(self, output_name = None) :
if self.context.has_key("output_apk") :
output_name = self.context["output_apk"]
else :
output_name = self.name + ".output.apk"
name = None
if self.context.has_key("project_name") :
name = self.context["project_name"]
else :
name = self.name
if None == name or len(name) == 0 :
name = "noname"
output_name = name + ".output.apk"
if ".apk" != output_name[-4:] :
output_name += ".apk"
output_path, output_name = os.path.split(output_name)
Expand Down Expand Up @@ -268,12 +278,23 @@ def get_context(self) :
return self.context


def open(self, json_path) :
fp = open(json_path, "r")
out = json.load(fp, "utf-8")
for k, v in out.items() :
def open(self, py_path) :
py_dir, py_file = os.path.split(os.path.abspath(py_path))
py_dir, m1 = os.path.split(py_dir)
py_dir, m2 = os.path.split(py_dir)
module = "%s.%s" %(m2, m1)

try :
workspace_config = import_module(".workspace", module)
except ImportError :
try :
workspace_config = import_module(".workspace", m1)
except ImportError :
workspace_config = import_module("workspace")

settings = workspace_config.settings
for k, v in settings.items() :
self.context[k] = v
fp.close()


def save(self, save_path = None) :
Expand All @@ -297,10 +318,19 @@ def save(self, save_path = None) :
out["keypass"] = self.context["keypass"]

if None == save_path :
save_path = (os.path.join(self.context["work_dir"], "workspace.json"))
save_path = (os.path.join(self.context["work_dir"], "workspace.py"))

save_dir,save_file = os.path.split(os.path.abspath(save_path))
init_py = os.path.join(save_dir, "__init__.py")
with open(init_py, "a") :
os.utime(init_py, None)
settings = '''
import os
pwd = os.path.split(os.path.realpath(__file__))[0]
settings = %s
''' %(json.dumps(out, indent = 4))
fp = open(save_path, "w")
json.dump(out, fp, indent = 4)
fp.write(settings)
fp.close()


Loading

0 comments on commit e5e952d

Please sign in to comment.