docs: function compatibilityNumericRamp (datasource, column, args) {
    // jshint maxcomplexity:9
    if (args.length < 2) {
      return Promise.reject(
        new TurboCartoError('invalid number of arguments')
      );
    }
  
    var min = +args[0];
    var max = +args[1];
  
    var numBuckets;
    var filters = null;
    var method;
  
    if (Number.isFinite(args[2])) {
      numBuckets = args[2];
  
      if (isResult(args[3])) {
        filters = args[3];
        method = null;
        if (filters.getLength() !== numBuckets) {
          return Promise.reject(
            new TurboCartoError(
              'invalid ramp length, got ' + filters.getLength() + ' values, expected ' + numBuckets
            )
          );
        }
      } else {
        filters = null;
        method = args[3];
      }
    } else if (isResult(args[2])) {
      filters = args[2];
      numBuckets = filters.getLength();
      method = null;
    } else {
      filters = null;
      numBuckets = 5;
      method = args[2];
    }
  
    var values = new ValuesResult([min, max], numBuckets, linearBuckets, Number.POSITIVE_INFINITY);
  
    if (filters === null) {
      // normalize method
      method = (method || 'quantiles').toLowerCase();
      return getRamp(datasource, column, numBuckets, method).then(compatibilityCreateRampFn(values));
    }
  
    filters = filters.is(FiltersResult) ? filters : new FiltersResult(filters.get(), 'max');
    return Promise.resolve(filters).then(compatibilityCreateRampFn(values));
  }