# Path: cloudvolume/lib.py
# def jsonify(obj, **kwargs):
#   return json.dumps(obj, cls=NumpyEncoder, **kwargs)


import copy
import re
import numpy as np
from ....lib import jsonify
    return self.meta.basepath

  @property
  def cloudpath(self):
    return self.meta.cloudpath

  @property
  def layerpath(self):
    return self.meta.join(self.meta.cloudpath, self.skeleton_path)

  def fetch_info(self):
    info = self.cache.download_json(self.meta.join(self.skeleton_path, 'info'))
    if not info:
      return self.default_info()
    return info

  def refresh_info(self):
    self.info = self.fetch_info()
    return self.info

  def commit_info(self):
    if self.info is None:
      return 

    info = copy.deepcopy(self.info)
    if info.get("sharding", None) is None:
        info.pop("sharding", None)

    self.cache.upload_single(
      self.meta.join(self.skeleton_path, 'info'),

# Path: cloudvolume/lib.py
# def jsonify(obj, **kwargs):
#   return json.dumps(obj, cls=NumpyEncoder, **kwargs)


# Path: cloudvolume/datasource/precomputed/skeleton/metadata.py
import copy
import re
import numpy as np
from ....lib import jsonify

    return self.meta.basepath

  @property
  def cloudpath(self):
    return self.meta.cloudpath

  @property
  def layerpath(self):
    return self.meta.join(self.meta.cloudpath, self.skeleton_path)

  def fetch_info(self):
    info = self.cache.download_json(self.meta.join(self.skeleton_path, 'info'))
    if not info:
      return self.default_info()
    return info

  def refresh_info(self):
    self.info = self.fetch_info()
    return self.info

  def commit_info(self):
    if self.info is None:
      return 

    info = copy.deepcopy(self.info)
    if info.get("sharding", None) is None:
        info.pop("sharding", None)

    self.cache.upload_single(
      self.meta.join(self.skeleton_path, 'info'),

      jsonify(info), 