portolan 0.1.0.pre.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +202 -0
- data/lib/portolan/dataset.rb +131 -0
- data/lib/portolan/dimension/bucket.rb +37 -0
- data/lib/portolan/dimension.rb +105 -0
- data/lib/portolan/measure.rb +51 -0
- data/lib/portolan/query/aggregate.rb +165 -0
- data/lib/portolan/query/base.rb +116 -0
- data/lib/portolan/query/filter.rb +126 -0
- data/lib/portolan/query/guard.rb +38 -0
- data/lib/portolan/query/result.rb +39 -0
- data/lib/portolan/registry.rb +66 -0
- data/lib/portolan/type/base.rb +17 -0
- data/lib/portolan/type/boolean.rb +13 -0
- data/lib/portolan/type/date.rb +33 -0
- data/lib/portolan/type/date_time.rb +15 -0
- data/lib/portolan/type/decimal.rb +24 -0
- data/lib/portolan/type/enum.rb +22 -0
- data/lib/portolan/type/integer.rb +27 -0
- data/lib/portolan/type/string.rb +13 -0
- data/lib/portolan/type.rb +17 -0
- data/lib/portolan/version.rb +5 -0
- data/lib/portolan.rb +32 -0
- metadata +108 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Portolan
|
|
4
|
+
module Type
|
|
5
|
+
class Integer < Base
|
|
6
|
+
OPERATORS = %w[eq in gt lt between].freeze
|
|
7
|
+
RANGE = (-(2**63))..((2**63) - 1)
|
|
8
|
+
|
|
9
|
+
def name = 'integer'
|
|
10
|
+
def label(value, _period = nil) = value.to_i
|
|
11
|
+
|
|
12
|
+
def errors_for(value)
|
|
13
|
+
number = cast(value)
|
|
14
|
+
return ["`#{value}` is not an integer"] unless number
|
|
15
|
+
return [] if RANGE.cover?(number)
|
|
16
|
+
|
|
17
|
+
["`#{value}` is outside the integer range, #{RANGE.min} to #{RANGE.max}"]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def cast(value)
|
|
21
|
+
return value if value.is_a?(::Integer)
|
|
22
|
+
|
|
23
|
+
Kernel.Integer(value, 10, exception: false) if value.is_a?(::String)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Portolan
|
|
4
|
+
module Type
|
|
5
|
+
class String < Base
|
|
6
|
+
OPERATORS = %w[eq in].freeze
|
|
7
|
+
|
|
8
|
+
def name = 'string'
|
|
9
|
+
def errors_for(value) = value.is_a?(::String) || value.is_a?(::Numeric) ? [] : ["`#{value}` is not text"]
|
|
10
|
+
def cast(value) = value.to_s
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Portolan
|
|
4
|
+
module Type
|
|
5
|
+
CLASSES = {
|
|
6
|
+
string: String,
|
|
7
|
+
integer: Integer,
|
|
8
|
+
decimal: Decimal,
|
|
9
|
+
boolean: Boolean,
|
|
10
|
+
date: Date,
|
|
11
|
+
datetime: DateTime,
|
|
12
|
+
}.freeze
|
|
13
|
+
NAMES = CLASSES.keys.freeze
|
|
14
|
+
|
|
15
|
+
def self.for(name) = CLASSES.fetch(name).new
|
|
16
|
+
end
|
|
17
|
+
end
|
data/lib/portolan.rb
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'active_record'
|
|
4
|
+
require 'active_support'
|
|
5
|
+
require 'active_support/core_ext/enumerable'
|
|
6
|
+
require 'active_support/core_ext/object/blank'
|
|
7
|
+
require 'active_support/core_ext/time/calculations'
|
|
8
|
+
|
|
9
|
+
require_relative 'portolan/version'
|
|
10
|
+
require_relative 'portolan/type/base'
|
|
11
|
+
require_relative 'portolan/type/string'
|
|
12
|
+
require_relative 'portolan/type/enum'
|
|
13
|
+
require_relative 'portolan/type/integer'
|
|
14
|
+
require_relative 'portolan/type/decimal'
|
|
15
|
+
require_relative 'portolan/type/boolean'
|
|
16
|
+
require_relative 'portolan/type/date'
|
|
17
|
+
require_relative 'portolan/type/date_time'
|
|
18
|
+
require_relative 'portolan/type'
|
|
19
|
+
require_relative 'portolan/dimension'
|
|
20
|
+
require_relative 'portolan/dimension/bucket'
|
|
21
|
+
require_relative 'portolan/measure'
|
|
22
|
+
require_relative 'portolan/dataset'
|
|
23
|
+
require_relative 'portolan/registry'
|
|
24
|
+
require_relative 'portolan/query/filter'
|
|
25
|
+
require_relative 'portolan/query/result'
|
|
26
|
+
require_relative 'portolan/query/guard'
|
|
27
|
+
require_relative 'portolan/query/base'
|
|
28
|
+
require_relative 'portolan/query/aggregate'
|
|
29
|
+
|
|
30
|
+
module Portolan
|
|
31
|
+
def self.quoted(items) = items.map { |item| "`#{item}`" }.join(', ')
|
|
32
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: portolan
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0.pre.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- David Busse
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: activerecord
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '7.1'
|
|
19
|
+
- - "<"
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '9'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
+
requirements:
|
|
26
|
+
- - ">="
|
|
27
|
+
- !ruby/object:Gem::Version
|
|
28
|
+
version: '7.1'
|
|
29
|
+
- - "<"
|
|
30
|
+
- !ruby/object:Gem::Version
|
|
31
|
+
version: '9'
|
|
32
|
+
- !ruby/object:Gem::Dependency
|
|
33
|
+
name: activesupport
|
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
|
35
|
+
requirements:
|
|
36
|
+
- - ">="
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: '7.1'
|
|
39
|
+
- - "<"
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '9'
|
|
42
|
+
type: :runtime
|
|
43
|
+
prerelease: false
|
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
45
|
+
requirements:
|
|
46
|
+
- - ">="
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: '7.1'
|
|
49
|
+
- - "<"
|
|
50
|
+
- !ruby/object:Gem::Version
|
|
51
|
+
version: '9'
|
|
52
|
+
description: 'Portolan lets a Rails app chart the datasets it is willing to expose:
|
|
53
|
+
their dimensions, measures and worked examples. A dashboard or an LLM tool sends
|
|
54
|
+
a structured request and gets back only what the app has declared, never SQL.'
|
|
55
|
+
email:
|
|
56
|
+
- david@busse.net
|
|
57
|
+
executables: []
|
|
58
|
+
extensions: []
|
|
59
|
+
extra_rdoc_files: []
|
|
60
|
+
files:
|
|
61
|
+
- LICENSE.txt
|
|
62
|
+
- README.md
|
|
63
|
+
- lib/portolan.rb
|
|
64
|
+
- lib/portolan/dataset.rb
|
|
65
|
+
- lib/portolan/dimension.rb
|
|
66
|
+
- lib/portolan/dimension/bucket.rb
|
|
67
|
+
- lib/portolan/measure.rb
|
|
68
|
+
- lib/portolan/query/aggregate.rb
|
|
69
|
+
- lib/portolan/query/base.rb
|
|
70
|
+
- lib/portolan/query/filter.rb
|
|
71
|
+
- lib/portolan/query/guard.rb
|
|
72
|
+
- lib/portolan/query/result.rb
|
|
73
|
+
- lib/portolan/registry.rb
|
|
74
|
+
- lib/portolan/type.rb
|
|
75
|
+
- lib/portolan/type/base.rb
|
|
76
|
+
- lib/portolan/type/boolean.rb
|
|
77
|
+
- lib/portolan/type/date.rb
|
|
78
|
+
- lib/portolan/type/date_time.rb
|
|
79
|
+
- lib/portolan/type/decimal.rb
|
|
80
|
+
- lib/portolan/type/enum.rb
|
|
81
|
+
- lib/portolan/type/integer.rb
|
|
82
|
+
- lib/portolan/type/string.rb
|
|
83
|
+
- lib/portolan/version.rb
|
|
84
|
+
homepage: https://github.com/dpbus/portolan
|
|
85
|
+
licenses:
|
|
86
|
+
- MIT
|
|
87
|
+
metadata:
|
|
88
|
+
source_code_uri: https://github.com/dpbus/portolan
|
|
89
|
+
bug_tracker_uri: https://github.com/dpbus/portolan/issues
|
|
90
|
+
rubygems_mfa_required: 'true'
|
|
91
|
+
rdoc_options: []
|
|
92
|
+
require_paths:
|
|
93
|
+
- lib
|
|
94
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
95
|
+
requirements:
|
|
96
|
+
- - ">="
|
|
97
|
+
- !ruby/object:Gem::Version
|
|
98
|
+
version: '3.3'
|
|
99
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - ">="
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0'
|
|
104
|
+
requirements: []
|
|
105
|
+
rubygems_version: 3.6.9
|
|
106
|
+
specification_version: 4
|
|
107
|
+
summary: Declared, read-only datasets that reporting code and LLMs can query safely.
|
|
108
|
+
test_files: []
|