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.
@@ -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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Portolan
4
+ VERSION = '0.1.0.pre.1'
5
+ 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: []