annotate rhodecode/bin/base.py @ 3833:5055dd385118 beta

api: decouple some parts from api CLI script - also change how we save config file - method should be always API method - now we use --save-config for saving api config
author Marcin Kuzminski <marcin@python-works.com>
date Thu, 09 May 2013 21:44:15 +0200
parents
children dc4644865e8b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3833
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
1 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
2 Base utils for shell scripts
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
3 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
4 import os
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
5 import sys
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
6 import random
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
7 import urllib2
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
8 import pprint
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
9
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
10 try:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
11 from rhodecode.lib.ext_json import json
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
12 except ImportError:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
13 try:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
14 import simplejson as json
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
15 except ImportError:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
16 import json
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
17
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
18 CONFIG_NAME = '.rhodecode'
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
19 FORMAT_PRETTY = 'pretty'
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
20 FORMAT_JSON = 'json'
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
21
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
22
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
23 def api_call(apikey, apihost, format, method=None, **kw):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
24 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
25 Api_call wrapper for RhodeCode
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
26
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
27 :param apikey:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
28 :param apihost:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
29 :param format: formatting, pretty means prints and pprint of json
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
30 json returns unparsed json
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
31 :param method:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
32 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
33 def _build_data(random_id):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
34 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
35 Builds API data with given random ID
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
36
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
37 :param random_id:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
38 :type random_id:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
39 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
40 return {
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
41 "id": random_id,
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
42 "api_key": apikey,
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
43 "method": method,
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
44 "args": kw
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
45 }
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
46
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
47 if not method:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
48 raise Exception('please specify method name !')
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
49 id_ = random.randrange(1, 9999)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
50 req = urllib2.Request('%s/_admin/api' % apihost,
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
51 data=json.dumps(_build_data(id_)),
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
52 headers={'content-type': 'text/plain'})
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
53 if format == FORMAT_PRETTY:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
54 sys.stdout.write('calling %s to %s \n' % (req.get_data(), apihost))
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
55 ret = urllib2.urlopen(req)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
56 raw_json = ret.read()
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
57 json_data = json.loads(raw_json)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
58 id_ret = json_data['id']
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
59 _formatted_json = pprint.pformat(json_data)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
60 if id_ret == id_:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
61 if format == FORMAT_JSON:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
62 sys.stdout.write(str(raw_json))
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
63 else:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
64 sys.stdout.write('rhodecode returned:\n%s\n' % (_formatted_json))
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
65
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
66 else:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
67 raise Exception('something went wrong. '
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
68 'ID mismatch got %s, expected %s | %s' % (
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
69 id_ret, id_, _formatted_json))
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
70
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
71
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
72 class RcConf(object):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
73 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
74 RhodeCode config for API
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
75
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
76 conf = RcConf()
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
77 conf['key']
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
78
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
79 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
80
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
81 def __init__(self, config_location=None, autoload=True, autocreate=False,
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
82 config=None):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
83 self._conf_name = CONFIG_NAME if not config_location else config_location
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
84 self._conf = {}
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
85 if autocreate:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
86 self.make_config(config)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
87 if autoload:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
88 self._conf = self.load_config()
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
89
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
90 def __getitem__(self, key):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
91 return self._conf[key]
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
92
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
93 def __nonzero__(self):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
94 if self._conf:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
95 return True
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
96 return False
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
97
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
98 def __eq__(self):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
99 return self._conf.__eq__()
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
100
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
101 def __repr__(self):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
102 return 'RcConf<%s>' % self._conf.__repr__()
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
103
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
104 def make_config(self, config):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
105 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
106 Saves given config as a JSON dump in the _conf_name location
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
107
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
108 :param config:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
109 :type config:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
110 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
111 update = False
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
112 if os.path.exists(self._conf_name):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
113 update = True
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
114 with open(self._conf_name, 'wb') as f:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
115 json.dump(config, f, indent=4)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
116
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
117 if update:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
118 sys.stdout.write('Updated config in %s\n' % self._conf_name)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
119 else:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
120 sys.stdout.write('Created new config in %s\n' % self._conf_name)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
121
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
122 def update_config(self, new_config):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
123 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
124 Reads the JSON config updates it's values with new_config and
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
125 saves it back as JSON dump
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
126
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
127 :param new_config:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
128 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
129 config = {}
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
130 try:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
131 with open(self._conf_name, 'rb') as conf:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
132 config = json.load(conf)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
133 except IOError, e:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
134 sys.stderr.write(str(e) + '\n')
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
135
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
136 config.update(new_config)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
137 self.make_config(config)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
138
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
139 def load_config(self):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
140 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
141 Loads config from file and returns loaded JSON object
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
142 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
143 try:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
144 with open(self._conf_name, 'rb') as conf:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
145 return json.load(conf)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
146 except IOError, e:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
147 #sys.stderr.write(str(e) + '\n')
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
148 pass