1+ # requires installation of urllib2_file from https://github.com/seisen/urllib2_file/#readme
2+
3+ import urllib2_file
4+ import urllib2 , urlparse , os .path , time , json
5+
6+ class Refine :
7+ def __init__ (self , server = 'http://127.0.0.1:3333' ):
8+ self .server = server [0 ,- 1 ] if server .endswith ('/' ) else server
9+
10+ def new_project (self , file_path , options = None ):
11+ file_name = os .path .split (file_path )[- 1 ]
12+ project_name = options ['project_name' ] if options != None and 'project_name' in options else file_name
13+ data = {
14+ 'project-file' : {
15+ 'fd' : open (file_path ),
16+ 'filename' : file_name
17+ },
18+ 'project-name' : project_name
19+ }
20+
21+ response = urllib2 .urlopen (self .server + '/command/core/create-project-from-upload' , data )
22+ response .read ()
23+ url_params = urlparse .parse_qs (urlparse .urlparse (response .geturl ()).query )
24+ if 'project' in url_params :
25+ id = url_params ['project' ][0 ]
26+ return RefineProject (self .server , id , project_name )
27+
28+ # TODO: better error reporting
29+ return None
30+
31+ class RefineProject :
32+ def __init__ (self , server , id , project_name ):
33+ self .server = server
34+ self .id = id
35+ self .project_name = project_name
36+
37+ def wait_until_idle (self , polling_delay = 0.5 ):
38+ while True :
39+ response = urllib2 .urlopen (self .server + '/command/core/get-processes?project=' + self .id )
40+ response_json = json .loads (response .read ())
41+ if 'processes' in response_json and len (response_json ['processes' ]) > 0 :
42+ time .sleep (polling_delay )
43+ else :
44+ return
45+
46+ def apply_operations (self , file_path , wait = True ):
47+ fd = open (file_path )
48+ operations_json = fd .read ()
49+
50+ data = {
51+ 'operations' : operations_json
52+ }
53+ response = urllib2 .urlopen (self .server + '/command/core/apply-operations?project=' + self .id , data )
54+ response_json = json .loads (response .read ())
55+ if response_json ['code' ] == 'error' :
56+ raise Exception (response_json ['message' ])
57+ elif response_json ['code' ] == 'pending' :
58+ if wait :
59+ self .wait_until_idle ()
60+ return 'ok'
61+
62+ return response_json ['code' ] # can be 'ok' or 'pending'
63+
64+ def export_rows (self , format = 'tsv' ):
65+ data = {
66+ 'engine' : '{"facets":[],"mode":"row-based"}' ,
67+ 'project' : self .id ,
68+ 'format' : format
69+ }
70+ response = urllib2 .urlopen (self .server + '/command/core/export-rows/' + self .project_name + '.' + format , data )
71+ return response .read ()
72+
73+ def delete_project (self ):
74+ data = {
75+ 'project' : self .id
76+ }
77+ response = urllib2 .urlopen (self .server + '/command/core/delete-project' , data )
78+ response_json = json .loads (response .read ())
79+ return 'code' in response_json and response_json ['code' ] == 'ok'
0 commit comments