annotate rhodecode/bin/base.py @ 3840:dc4644865e8b beta

Implemented simple gist functionality ref #530. - creation of public/private gists with given lifetime - rhodecode-gist CLI for quick gist creation
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 11 May 2013 20:24:02 +0200
parents 5055dd385118
children 5a7d52cf084d
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 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
39 return {
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
40 "id": random_id,
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
41 "api_key": apikey,
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
42 "method": method,
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
43 "args": kw
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
44 }
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 if not method:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
47 raise Exception('please specify method name !')
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
48 id_ = random.randrange(1, 9999)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
49 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
50 data=json.dumps(_build_data(id_)),
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
51 headers={'content-type': 'text/plain'})
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
52 if format == FORMAT_PRETTY:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
53 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
54 ret = urllib2.urlopen(req)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
55 raw_json = ret.read()
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
56 json_data = json.loads(raw_json)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
57 id_ret = json_data['id']
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
58 _formatted_json = pprint.pformat(json_data)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
59 if id_ret == id_:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
60 if format == FORMAT_JSON:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
61 sys.stdout.write(str(raw_json))
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
62 else:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
63 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
64
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
65 else:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
66 raise Exception('something went wrong. '
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
67 '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
68 id_ret, id_, _formatted_json))
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
69
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 class RcConf(object):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
72 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
73 RhodeCode config for API
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
74
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
75 conf = RcConf()
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
76 conf['key']
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
77
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 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
81 config=None):
3840
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3833
diff changeset
82 HOME = os.getenv('HOME', os.getenv('USERPROFILE')) or ''
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3833
diff changeset
83 HOME_CONF = os.path.abspath(os.path.join(HOME, CONFIG_NAME))
dc4644865e8b Implemented simple gist functionality ref #530.
Marcin Kuzminski <marcin@python-works.com>
parents: 3833
diff changeset
84 self._conf_name = HOME_CONF if not config_location else config_location
3833
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
85 self._conf = {}
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
86 if autocreate:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
87 self.make_config(config)
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
88 if autoload:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
89 self._conf = self.load_config()
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
90
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
91 def __getitem__(self, key):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
92 return self._conf[key]
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
93
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
94 def __nonzero__(self):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
95 if self._conf:
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
96 return True
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
97 return False
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
98
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
99 def __eq__(self):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
100 return self._conf.__eq__()
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
101
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
102 def __repr__(self):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
103 return 'RcConf<%s>' % self._conf.__repr__()
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
104
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
105 def make_config(self, config):
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
106 """
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
107 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
108
5055dd385118 api: decouple some parts from api CLI script
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
109 :param 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