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 +4 -4
- data/Dockerfile +26 -0
- data/README.md +95 -9
- data/lib/chalk_ruby/client.rb +5 -3
- data/lib/chalk_ruby/grpc_client.rb +20 -3
- data/lib/chalk_ruby/version.rb +1 -1
- data/test/chalk_ruby/integration/client_test.rb +15 -3
- data/test/chalk_ruby/integration/grpc_client_test.rb +18 -8
- metadata +3 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 5078b236fa2532b078ba26509838b574bcb72c624ac4a27eb41f7fb34b9fb617
         | 
| 4 | 
            +
              data.tar.gz: af01a9060816db57ff9198129a8d3ac2d0c7cce683e0ea59da1f9f6ed7ead09a
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 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 | 
            -
             | 
| 1 | 
            +
            # ChalkRuby - Ruby Client for Chalk
         | 
| 2 2 |  | 
| 3 3 | 
             
            [](https://badge.fury.io/rb/chalk_ruby)
         | 
| 4 | 
            +
            [](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 | 
            -
             | 
| 8 | 
            +
            ## Installation
         | 
| 8 9 |  | 
| 9 | 
            -
             | 
| 10 | 
            +
            Add this line to your application's Gemfile:
         | 
| 10 11 |  | 
| 11 | 
            -
             | 
| 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 | 
            -
             | 
| 28 | 
            +
            ## Quick Start
         | 
| 18 29 |  | 
| 19 30 | 
             
            ```ruby
         | 
| 20 | 
            -
             | 
| 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  | 
| 115 | 
            +
            The Chalk Ruby Client is open-sourced software licensed under the [Apache 2.0 License](LICENSE).
         | 
    
        data/lib/chalk_ruby/client.rb
    CHANGED
    
    | @@ -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( | 
| 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(
         | 
    
        data/lib/chalk_ruby/version.rb
    CHANGED
    
    
| @@ -3,15 +3,27 @@ require 'rspec/autorun' | |
| 3 3 | 
             
            require 'chalk_ruby/client'
         | 
| 4 4 | 
             
            require 'chalk_ruby/error'
         | 
| 5 5 |  | 
| 6 | 
            -
            CLIENT_ID     = ' | 
| 7 | 
            -
            CLIENT_SECRET = ' | 
| 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 | 
| 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  | 
| 59 | 
            -
                   | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 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 | 
            -
                   | 
| 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. | 
| 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- | 
| 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
         |