chalk_ruby 0.2.8 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd2402b4edf2bce128c0f86f9b81ff089bed5a2cb9564fc5c1b30d4290b2d062
4
- data.tar.gz: 38380294054c04a7743adf9b2e2080dcba1d73e9a8cb9f1c1ddca032bbb46883
3
+ metadata.gz: 5078b236fa2532b078ba26509838b574bcb72c624ac4a27eb41f7fb34b9fb617
4
+ data.tar.gz: af01a9060816db57ff9198129a8d3ac2d0c7cce683e0ea59da1f9f6ed7ead09a
5
5
  SHA512:
6
- metadata.gz: 99e17dd176aab3cbec5b2c65f1b1e44364978e5f2451f631c0b0c93832078cf73519c2a04982e3cb31ef69b93209550a9610c20326d3120ff361cdd6cedff754
7
- data.tar.gz: 0db6e82923b3aaa2ced3401d5a40988b2a98b79ababf13ec50ab228234ab08ebe7c723015f86a8a1438488c5db3627bced34a4ed3bcff5a82ed1aa23a67950a6
6
+ metadata.gz: f0f5a7f1ca26cefac916b76bf8f83b77b94ecc64344985d7d5adf6fe77aaebc61b811b6c9f5cbc3dd1cc78dc7b1fe519a3d7b9e45656294c0bc021b42cafe9cf
7
+ data.tar.gz: 910e8c846f446f44bb556f34c430d4eec7e24482ff3e13f29ad6874c635f48f5539e0502c25dfb8a9d6d48227a538beedbcd598474d6bc3c059136746f9194b6
data/Dockerfile ADDED
@@ -0,0 +1,26 @@
1
+ FROM ubuntu:22.04
2
+
3
+ ENV BUNDLER_VERSION=2.3.6 \
4
+ BUNDLE_PATH=/app/vendor/bundle
5
+
6
+ RUN apt-get update && apt-get install -y \
7
+ ca-certificates \
8
+ sudo \
9
+ wget \
10
+ lsb-release \
11
+ build-essential \
12
+ bash \
13
+ jq \
14
+ curl \
15
+ libffi-dev \
16
+ git \
17
+ libglib2.0-dev \
18
+ ruby-full
19
+
20
+ # Install Apache Arrow 18
21
+ RUN wget https://apache.jfrog.io/artifactory/arrow/ubuntu/apache-arrow-apt-source-latest-jammy.deb && \
22
+ apt-get install -y -V ./apache-arrow-apt-source-latest-jammy.deb && \
23
+ apt-get update && \
24
+ apt-get install -y -V libarrow-dev=18.* libarrow-glib-dev=18.* libparquet-dev=18.* libarrow-acero-dev=18.* gir1.2-arrow-1.0=18.*
25
+
26
+ RUN gem install bundler
data/README.md CHANGED
@@ -1,29 +1,115 @@
1
- ## ChalkRuby Ruby
1
+ # ChalkRuby - Ruby Client for Chalk
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/chalk_ruby.svg)](https://badge.fury.io/rb/chalk_ruby)
4
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
4
5
 
5
- Ruby client for Chalk!
6
+ A Ruby client library for [Chalk](https://chalk.ai/), a feature engineering platform for machine learning and data applications.
6
7
 
7
- https://rubygems.org/gems/chalk_ruby
8
+ ## Installation
8
9
 
9
- ## Getting Started
10
+ Add this line to your application's Gemfile:
10
11
 
11
- First, install ChalkRuby Ruby API Client via the [RubyGems](https://rubygems.org/) package manager:
12
+ ```ruby
13
+ gem 'chalk_ruby'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ ```bash
19
+ bundle install
20
+ ```
21
+
22
+ Or install it directly:
12
23
 
13
24
  ```bash
14
25
  gem install chalk_ruby
15
26
  ```
16
27
 
17
- Then, create a new client using your client ID and client secret:
28
+ ## Quick Start
18
29
 
19
30
  ```ruby
20
- client = ChalkRuby::Client.create('my-client-id', 'my-client-secret')
31
+ # Create a client with credentials
32
+ client = ChalkRuby::Client.create(
33
+ 'my-client-id',
34
+ 'my-client-secret',
35
+ 'my-environment-id' # Optional, can also use CHALK_ACTIVE_ENVIRONMENT env var
36
+ )
37
+
38
+ # Query features
21
39
  results = client.query(
22
40
  input: { 'user.id': 'my-user-id' },
23
- output: %w(user.id user.name user.email)
41
+ output: %w(user.id user.name user.email),
42
+ query_name: 'user_profile' # Optional: for tracking and monitoring
24
43
  )
44
+
45
+ # Access feature values
46
+ puts results['user.name']
25
47
  ```
26
48
 
49
+ ## Authentication
50
+
51
+ Authentication can be provided in multiple ways:
52
+
53
+ 1. Directly in the client constructor:
54
+ ```ruby
55
+ client = ChalkRuby::Client.create('my-client-id', 'my-client-secret')
56
+ ```
57
+
58
+ 2. Using environment variables:
59
+ ```
60
+ CHALK_CLIENT_ID=my-client-id
61
+ CHALK_CLIENT_SECRET=my-client-secret
62
+ CHALK_ACTIVE_ENVIRONMENT=my-environment # Optional
63
+ ```
64
+ ```ruby
65
+ client = ChalkRuby::Client.create
66
+ ```
67
+
68
+ ## Advanced Usage
69
+
70
+ ### Query Options
71
+
72
+ The `query` method supports several options:
73
+
74
+ ```ruby
75
+ client.query(
76
+ input: { 'user.id': 'my-user-id' },
77
+ output: %w(user.id user.name user.credit_score),
78
+ now: Time.now, # Optional: time at which to evaluate the query
79
+ staleness: { 'user.credit_score': '1d' }, # Optional: max staleness for cached features
80
+ tags: { 'environment': 'production' }, # Optional: tags for resolver selection
81
+ branch: 'my-feature-branch', # Optional: route request to a specific branch
82
+ correlation_id: 'request-123', # Optional: ID for tracing in logs
83
+ query_name: 'user_profile', # Optional: semantic name for the query
84
+ timeout: 5.0 # Optional: timeout in seconds
85
+ )
86
+ ```
87
+
88
+ ### Configuration
89
+
90
+ Create a client with custom configuration:
91
+
92
+ ```ruby
93
+ config = ChalkRuby::Config.new(
94
+ client_id: 'my-client-id',
95
+ client_secret: 'my-client-secret',
96
+ environment: 'my-environment',
97
+ query_server: 'https://custom-query-server.chalk.ai',
98
+ api_server: 'https://custom-api.chalk.ai',
99
+ additional_headers: { 'X-Custom-Header': 'value' }
100
+ )
101
+
102
+ client = ChalkRuby::Client.create_with_config(config)
103
+ ```
104
+
105
+ ## Requirements
106
+
107
+ - Ruby 2.7 or higher
108
+
109
+ ## Version
110
+
111
+ Current version: `0.2.8`
112
+
27
113
  ## License
28
114
 
29
- The Chalk Ruby API Client is an open-sourced software licensed under the [Apache 2 License](LICENSE.md).
115
+ The Chalk Ruby Client is open-sourced software licensed under the [Apache 2.0 License](LICENSE).
@@ -150,7 +150,8 @@ module ChalkRuby
150
150
  explain: nil,
151
151
  include_meta: nil,
152
152
  store_plan_stages: nil,
153
- timeout: nil
153
+ timeout: nil,
154
+ planner_options: nil
154
155
  )
155
156
  query_server_request(
156
157
  method: :post,
@@ -168,10 +169,11 @@ module ChalkRuby
168
169
  meta: meta,
169
170
  explain: explain || false,
170
171
  include_meta: include_meta || false,
171
- store_plan_stages: store_plan_stages || false
172
+ store_plan_stages: store_plan_stages || false,
173
+ planner_options: planner_options || {}
172
174
  },
173
175
  headers: get_authenticated_engine_headers(branch: branch),
174
- timeout:
176
+ timeout: timeout
175
177
  )
176
178
  end
177
179
 
@@ -146,6 +146,14 @@ module ChalkRuby
146
146
  query_service.ping(Chalk::Engine::V1::PingRequest.new(num: 1))
147
147
  end
148
148
 
149
+ def convert_to_proto_values(options_hash)
150
+ return {} if options_hash.nil?
151
+
152
+ options_hash.transform_values do |value|
153
+ convert_to_protobuf_value(value)
154
+ end
155
+ end
156
+
149
157
  def query_bulk(
150
158
  input:,
151
159
  output:,
@@ -157,7 +165,8 @@ module ChalkRuby
157
165
  timeout: nil,
158
166
  query_name: nil,
159
167
  query_name_version: nil,
160
- correlation_id: nil
168
+ correlation_id: nil,
169
+ planner_options: nil
161
170
  )
162
171
  # Convert input to feather format
163
172
  inputs_feather = to_feather(input)
@@ -167,7 +176,12 @@ module ChalkRuby
167
176
  inputs_feather: inputs_feather,
168
177
  outputs: output.map { |o| Chalk::Common::V1::OutputExpr.new(feature_fqn: o) },
169
178
  staleness: staleness || {},
170
- context: context || Chalk::Common::V1::OnlineQueryContext.new(query_name: query_name, query_name_version: query_name_version, correlation_id: correlation_id),
179
+ context: context || Chalk::Common::V1::OnlineQueryContext.new(
180
+ query_name: query_name,
181
+ query_name_version: query_name_version,
182
+ correlation_id: correlation_id,
183
+ options: convert_to_proto_values(planner_options)
184
+ ),
171
185
  response_options: response_options || Chalk::Common::V1::OnlineQueryResponseOptions.new,
172
186
  body_type: body_type || :FEATHER_BODY_TYPE_UNSPECIFIED
173
187
  )
@@ -205,13 +219,16 @@ module ChalkRuby
205
219
  explain: nil,
206
220
  include_meta: nil,
207
221
  store_plan_stages: nil,
208
- timeout: nil
222
+ timeout: nil,
223
+ planner_options: nil
209
224
  )
210
225
  formatted_inputs = input.transform_values { |value| self.convert_to_protobuf_value(value) }
211
226
 
212
227
  context = Chalk::Common::V1::OnlineQueryContext.new(
213
228
  query_name: query_name,
214
229
  query_name_version: query_name_version,
230
+ correlation_id: correlation_id,
231
+ options: planner_options || {}
215
232
  )
216
233
 
217
234
  r = Chalk::Common::V1::OnlineQueryRequest.new(
@@ -1,3 +1,3 @@
1
1
  module ChalkRuby
2
- VERSION = '0.2.8'.freeze
2
+ VERSION = '0.3.1'.freeze
3
3
  end
@@ -3,15 +3,27 @@ require 'rspec/autorun'
3
3
  require 'chalk_ruby/client'
4
4
  require 'chalk_ruby/error'
5
5
 
6
- CLIENT_ID = 'client-095f628e339a593e12a58559f5f8cd00'
7
- CLIENT_SECRET = 'secret-55601b885bcc0d558c4abede69480aaac1dba6e1679889fa1d5196ba04f7af89'
6
+ CLIENT_ID = ''
7
+ CLIENT_SECRET = ''
8
8
 
9
9
  RSpec.describe 'Online query' do
10
10
  it 'should accept valid queries' do
11
11
  client = ChalkRuby::Client.create(CLIENT_ID, CLIENT_SECRET)
12
12
  response = client.query(
13
13
  input: { 'user.id': 3454 },
14
- output: %w(user.id)
14
+ output: %w(user.id),
15
+ query_name: "no_planner_options_test",
16
+ )
17
+
18
+ print response
19
+ end
20
+ it 'should run with planner options' do
21
+ client = ChalkRuby::Client.create(CLIENT_ID, CLIENT_SECRET)
22
+ response = client.query(
23
+ input: { 'user.id': 3454 },
24
+ output: %w(user.id),
25
+ query_name: "planner_options_test",
26
+ planner_options: {'defer_non_bus_persist_operators': "1"} # test planner option
15
27
  )
16
28
 
17
29
  print response
@@ -14,8 +14,6 @@ require 'chalk_ruby/protos/chalk/engine/v1/query_server_services_pb'
14
14
  require 'arrow'
15
15
 
16
16
 
17
- CLIENT_ID = 'client-095f628e339a593e12a58559f5f8cd00'
18
- CLIENT_SECRET = 'secret-55601b885bcc0d558c4abede69480aaac1dba6e1679889fa1d5196ba04f7af89'
19
17
 
20
18
 
21
19
  RSpec.describe ChalkRuby::GrpcClient do
@@ -51,16 +49,28 @@ RSpec.describe ChalkRuby::GrpcClient do
51
49
  it 'can perform bulk queries' do
52
50
  response = client.query_bulk(
53
51
  input: { 'user.id': 1 },
54
- output: %w(user.id user.socure_score user.full_name)
52
+ output: %w(user.id user.socure_score),
53
+ planner_options: {'defer_non_bus_persist_operators': "1"}, # test planner option
54
+ query_name: "planner_options_test",
55
+
55
56
  )
56
57
 
57
58
  expect(response).not_to be_nil
58
- # The response should be a OnlineQueryBulkResponse
59
- # expect(response).to be_a(Chalk::Common::V1::OnlineQueryBulkResponse)
60
-
61
- # puts response.scalars_data
59
+ # The response should have no errors and user_id of 1
60
+ expect(response[:errors]).to be_empty
61
+ expect(response[:data][0]['user.id']).to eq(1)
62
+ end
63
+ it 'can perform bulk queries without planner options' do
64
+ response = client.query_bulk(
65
+ input: { 'user.id': 1 },
66
+ output: %w(user.id user.socure_score),
67
+ query_name: "no_planner_options_test",
68
+ )
62
69
 
63
- puts response
70
+ expect(response).not_to be_nil
71
+ # The response should have no errors and user_id of 1
72
+ expect(response[:errors]).to be_empty
73
+ expect(response[:data][0]['user.id']).to eq(1)
64
74
  end
65
75
  end
66
76
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chalk_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chalk AI, Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-03-10 00:00:00.000000000 Z
11
+ date: 2025-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -237,6 +237,7 @@ files:
237
237
  - ".gitignore"
238
238
  - ".rubocop.yml"
239
239
  - ".rubocop_todo.yml"
240
+ - Dockerfile
240
241
  - Gemfile
241
242
  - LICENSE
242
243
  - README.dev.md