def dump(doc, source): """ Use json.dump for back-ward compatibility, since cjson doesn't provide this method. The dump method works on file-descriptor objects. """ if MODULE == 'json': return json.dump(doc, source) elif MODULE == 'cjson': stj = cjson.encode(doc) return source.write(stj) elif MODULE == 'yajl': return yajl.dump(doc, source) else: raise Exception("JSON module %s is not supported" % MODULE)
def Run(self, cmd_val): arg_r = args.Reader(cmd_val.argv, spids=cmd_val.arg_spids) arg_r.Next() # skip 'json' action, action_spid = arg_r.Peek2() if action is None: raise error.Usage(_JSON_ACTION_ERROR) arg_r.Next() if action == 'write': arg, _ = JSON_WRITE_SPEC.Parse(arg_r) # GetVar() of each name and print it. for var_name in arg_r.Rest(): if var_name.startswith(':'): var_name = var_name[1:] val = self.mem.GetVar(var_name) with tagswitch(val) as case: if case(value_e.Undef): # TODO: blame the right span_id self.errfmt.Print("no variable named %r is defined", var_name) return 1 elif case(value_e.Str): obj = val.s elif case(value_e.MaybeStrArray): obj = val.strs elif case(value_e.AssocArray): obj = val.d elif case(value_e.Obj): obj = val.obj else: raise AssertionError(val) if arg.pretty: indent = arg.indent extra_newline = False else: # How yajl works: if indent is -1, then everything is on one line. indent = -1 extra_newline = True j = yajl.dump(obj, sys.stdout, indent=indent) if extra_newline: sys.stdout.write('\n') # TODO: Accept a block. They aren't hooked up yet. if cmd_val.block: # TODO: flatten value.{Str,Obj} into a flat dict? namespace = self.cmd_ev.EvalBlock(cmd_val.block) print(yajl.dump(namespace)) elif action == 'read': arg, _ = JSON_READ_SPEC.Parse(arg_r) # TODO: # Respect -validate=F var_name, name_spid = arg_r.ReadRequired2("expected variable name") if var_name.startswith(':'): var_name = var_name[1:] if not match.IsValidVarName(var_name): raise error.Usage('got invalid variable name %r' % var_name, span_id=name_spid) try: # Use a global _STDIN, because we get EBADF on a redirect if we use a # local. A Py_DECREF closes the file, which we don't want, because the # redirect is responsible for freeing it. # # https://github.com/oilshell/oil/issues/675 # # TODO: write a better binding like yajl.readfd() # # It should use streaming like here: # https://lloyd.github.io/yajl/ obj = yajl.load(_STDIN) except ValueError as e: self.errfmt.Print('json read: %s', e, span_id=action_spid) return 1 self.mem.SetVar(sh_lhs_expr.Name(var_name), value.Obj(obj), scope_e.LocalOnly) else: raise error.Usage(_JSON_ACTION_ERROR, span_id=action_spid) return 0
def write_cache(cache, cache_file): logger.debug("Writing cache: {}".format(cache_file)) with codecs.open(cache_file, 'w', 'utf-8') as f: json.dump(cache, f)
def __call__(self, cmd_val): arg_r = args.Reader(cmd_val.argv, spids=cmd_val.arg_spids) arg_r.Next() # skip 'json' action, action_spid = arg_r.Peek2() if action is None: raise args.UsageError(_JSON_ACTION_ERROR) arg_r.Next() if action == 'write': arg, _ = JSON_WRITE_SPEC.Parse(arg_r) # GetVar() of each name and print it. for var_name in arg_r.Rest(): if var_name.startswith(':'): var_name = var_name[1:] val = self.mem.GetVar(var_name) with tagswitch(val) as case: if case(value_e.Undef): # TODO: blame the right span_id self.errfmt.Print("no variable named %r is defined", var_name) return 1 elif case(value_e.Str): obj = val.s elif case(value_e.MaybeStrArray): obj = val.strs elif case(value_e.AssocArray): obj = val.d elif case(value_e.Obj): obj = val.obj else: raise AssertionError(val) if arg.pretty: indent = arg.indent extra_newline = False else: # How yajl works: if indent is -1, then everything is on one line. indent = -1 extra_newline = True j = yajl.dump(obj, sys.stdout, indent=indent) if extra_newline: sys.stdout.write('\n') # TODO: Accept a block. They aren't hooked up yet. if cmd_val.block: # TODO: flatten value.{Str,Obj} into a flat dict? namespace = self.ex.EvalBlock(cmd_val.block) print(yajl.dump(namespace)) elif action == 'read': arg, _ = JSON_READ_SPEC.Parse(arg_r) # TODO: # Respect -validate=F var_name, name_spid = arg_r.ReadRequired2("expected variable name") if var_name.startswith(':'): var_name = var_name[1:] if not match.IsValidVarName(var_name): raise args.UsageError('got invalid variable name %r' % var_name, span_id=name_spid) # Have to use this over sys.stdin because of redirects # TODO: change binding to yajl.readfd() ? stdin = posix_.fdopen(0) try: obj = yajl.load(stdin) except ValueError as e: self.errfmt.Print('json read: %s', e, span_id=action_spid) return 1 self.mem.SetVar(sh_lhs_expr.Name(var_name), value.Obj(obj), (), scope_e.LocalOnly) else: raise args.UsageError(_JSON_ACTION_ERROR, span_id=action_spid) return 0
def test_blocking_encode(self): obj = {'foo' : ['one', 'two', ['three', 'four']]} stream = StringIO() buffer = yajl.dump(obj, stream) self.assertEquals(stream.getvalue(), '{"foo":["one","two",["three","four"]]}')
def test_none_indent(self): ''' None `indent` should not result in pretty printing ''' rc = yajl.dump({'foo' : 'bar'}, self.stream, indent=None) self.assertEquals(self.stream.getvalue(), '{"foo":"bar"}')
def test_indent_zero(self): rc = yajl.dump({'foo' : 'bar'}, self.stream, indent=0) expected = '{\n"foo": "bar"\n}\n' self.assertEquals(self.stream.getvalue(), expected)
properties = {} properties["relatedItems"] = relatedItems properties.update(catalog) tmp = itemData.cssselect("div#feature_groups tr") for tmpchild in tmp: try: tt = map(lambda x: x.text_content(),tmpchild.cssselect("td")) except: tt = [] if len(tt)==2: properties[re.sub("[\$\.]","",tt[0].strip().strip(':'))] = tt[1].strip().strip(':') # print relatedItems uid = itemData.cssselect("div#catalog-title h1")[0].text_content() print k fp = open('links.json', 'w') json.dump(links, fp) fp.close() # print properties # print properties # print liobj.properties # print listItem # print map(lambda x: etree.tostring(x),itemData.cssselect("div#feature_groups tr")) # etree.tostring # break #ListItem.CreateNew(quantity=5, _rangeList=None, parentListItemRef=None, rootListItemRef=None, parentPath=None, childLists=None, linkedLists, name, description, images, uid, discreteFactor, isContinuous, isUnique, unitPrice, unitFakePrice, isUserAuth, boGroupUid, selectionType, selectionMinMax, viewSpan, isNeeded, expandForEach, isEndPoint, ownerUser, uiRenderRef, searchTags, isSearchNode, indexToItemMap, discountConditions, afterCartConditions, listItemHeadRef, isApprovalNeeded, properties, commonUserTextInput, commonUserFileInput, commonUserSelectInput, commonUserRadioInput, userTextInput, userFileInput, userSelectInput, userRadioInput, group_Type, isTime, save) # break
tmp = itemData.cssselect("div#feature_groups tr") for tmpchild in tmp: try: tt = map(lambda x: x.text_content(), tmpchild.cssselect("td")) except: tt = [] if len(tt) == 2: properties[re.sub( "[\$\.]", "", tt[0].strip().strip(':'))] = tt[1].strip().strip(':') # print relatedItems uid = itemData.cssselect("div#catalog-title h1")[0].text_content() print k fp = open('links.json', 'w') json.dump(links, fp) fp.close() # print properties # print properties # print liobj.properties # print listItem # print map(lambda x: etree.tostring(x),itemData.cssselect("div#feature_groups tr")) # etree.tostring # break #ListItem.CreateNew(quantity=5, _rangeList=None, parentListItemRef=None, rootListItemRef=None, parentPath=None, childLists=None, linkedLists, name, description, images, uid, discreteFactor, isContinuous, isUnique, unitPrice, unitFakePrice, isUserAuth, boGroupUid, selectionType, selectionMinMax, viewSpan, isNeeded, expandForEach, isEndPoint, ownerUser, uiRenderRef, searchTags, isSearchNode, indexToItemMap, discountConditions, afterCartConditions, listItemHeadRef, isApprovalNeeded, properties, commonUserTextInput, commonUserFileInput, commonUserSelectInput, commonUserRadioInput, userTextInput, userFileInput, userSelectInput, userRadioInput, group_Type, isTime, save) # break