Class: Oso::Polar::Polar
- Inherits:
 - 
      Object
      
        
- Object
 - Oso::Polar::Polar
 
 
- Defined in:
 - lib/oso/polar/polar.rb
 
Overview
Create and manage an instance of the Polar runtime.
Direct Known Subclasses
Instance Attribute Summary collapse
- #host ⇒ Host readonly
 
Instance Method Summary collapse
- 
  
    
      #clear_rules  ⇒ self 
    
    
  
  
  
  
  
  
  
  
  
    
Clear all rules and rule sources from the current Polar instance.
 - #ffi ⇒ Object
 - 
  
    
      #initialize  ⇒ Polar 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    
A new instance of Polar.
 - 
  
    
      #load_file(filename)  ⇒ self 
    
    
  
  
  
  
  
  
  deprecated
  
  
    Deprecated. 
#load_file has been deprecated in favor of #load_files as of the 0.20 release. Please see changelog for migration instructions: docs.osohq.com/project/changelogs/2021-09-15.html
 - 
  
    
      #load_files(filenames = [])  ⇒ self 
    
    
  
  
  
  
  
  
  
  
  
    
Load Polar policy files.
 - 
  
    
      #load_str(str, filename: nil)  ⇒ self 
    
    
  
  
  
  
  
  
  
  
  
    
Load a Polar string into the KB.
 - #name_to_class(class_name) ⇒ Object
 - 
  
    
      #query(query, host: self.host.dup, bindings: {})  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Query for a Polar predicate or string.
 - 
  
    
      #query_rule(name, *args, accept_expression: false, bindings: {})  ⇒ Enumerator 
    
    
  
  
  
  
  
  
  
  
  
    
Query for a rule.
 - 
  
    
      #query_rule_once(name, *args)  ⇒ Boolean 
    
    
  
  
  
  
  
  
  
  
  
    
Query for a rule, returning true if it has any results.
 - 
  
    
      #register_class(cls, name: nil, fields: nil, combine_query: nil, build_query: nil, exec_query: nil)  ⇒ self 
    
    
  
  
  
  
  
  
  
  
  
    
Register a Ruby class with Polar.
 - 
  
    
      #register_constant(value, name:)  ⇒ self 
    
    
  
  
  
  
  
  
  
  
  
    
Register a Ruby object with Polar.
 - 
  
    
      #repl(files = [])  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    
Start a REPL session.
 
Constructor Details
#initialize ⇒ Polar
Returns a new instance of Polar.
      66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81  | 
    
      # File 'lib/oso/polar/polar.rb', line 66 def initialize @ffi_polar = FFI::Polar.create @host = Host.new(ffi_polar) @ffi_polar. = @host.method(:enrich_message) # Register global constants. register_constant nil, name: 'nil' # Register built-in classes. register_class PolarBoolean, name: 'Boolean' register_class Integer register_class Float register_class Array, name: 'List' register_class Hash, name: 'Dictionary' register_class String end  | 
  
Instance Attribute Details
Instance Method Details
#clear_rules ⇒ self
Clear all rules and rule sources from the current Polar instance
      94 95 96 97  | 
    
      # File 'lib/oso/polar/polar.rb', line 94 def clear_rules ffi_polar.clear_rules self end  | 
  
#ffi ⇒ Object
      83 84 85  | 
    
      # File 'lib/oso/polar/polar.rb', line 83 def ffi @ffi_polar end  | 
  
#load_file(filename) ⇒ self
#load_file has been deprecated in favor of #load_files as of the 0.20 release. Please see changelog for migration instructions: docs.osohq.com/project/changelogs/2021-09-15.html
Load a Polar policy file.
      130 131 132 133 134 135 136 137  | 
    
      # File 'lib/oso/polar/polar.rb', line 130 def load_file(filename) warn <<~WARNING `Oso#load_file` has been deprecated in favor of `Oso#load_files` as of the 0.20 release. Please see changelog for migration instructions: https://docs.osohq.com/project/changelogs/2021-09-15.html WARNING load_files([filename]) end  | 
  
#load_files(filenames = []) ⇒ self
Load Polar policy files.
      108 109 110 111 112 113 114  | 
    
      # File 'lib/oso/polar/polar.rb', line 108 def load_files(filenames = []) return if filenames.empty? sources = filenames.map { |f| filename_to_source f } load_sources(sources) self end  | 
  
#load_str(str, filename: nil) ⇒ self
Load a Polar string into the KB.
      147 148 149 150 151 152  | 
    
      # File 'lib/oso/polar/polar.rb', line 147 def load_str(str, filename: nil) raise NullByteInPolarFileError if str.chomp("\0").include?("\0") load_sources([Source.new(str, filename: filename)]) self end  | 
  
#name_to_class(class_name) ⇒ Object
      87 88 89  | 
    
      # File 'lib/oso/polar/polar.rb', line 87 def name_to_class(class_name) host.types[class_name].klass.get end  | 
  
#query(query) ⇒ Enumerator #query(query) ⇒ Enumerator
Query for a Polar predicate or string.
      164 165 166 167 168 169 170 171 172 173 174  | 
    
      # File 'lib/oso/polar/polar.rb', line 164 def query(query, host: self.host.dup, bindings: {}) case query when String ffi_query = ffi_polar.new_query_from_str(query) when Predicate ffi_query = ffi_polar.new_query_from_term(host.to_polar(query)) else raise InvalidQueryTypeError end Query.new(ffi_query, host: host, bindings: bindings) end  | 
  
#query_rule(name, *args, accept_expression: false, bindings: {}) ⇒ Enumerator
Query for a rule.
      182 183 184 185 186  | 
    
      # File 'lib/oso/polar/polar.rb', line 182 def query_rule(name, *args, accept_expression: false, bindings: {}) host = self.host.dup host.accept_expression = accept_expression query(Predicate.new(name, args: args), host: host, bindings: bindings) end  | 
  
#query_rule_once(name, *args) ⇒ Boolean
Query for a rule, returning true if it has any results.
      194 195 196  | 
    
      # File 'lib/oso/polar/polar.rb', line 194 def query_rule_once(name, *args) query_rule(name, *args).any? end  | 
  
#register_class(cls, name: nil, fields: nil, combine_query: nil, build_query: nil, exec_query: nil) ⇒ self
Register a Ruby class with Polar.
under a previously-registered name.
      210 211 212 213 214 215 216 217 218 219 220 221  | 
    
      # File 'lib/oso/polar/polar.rb', line 210 def register_class(cls, name: nil, fields: nil, combine_query: nil, build_query: nil, exec_query: nil) # rubocop:disable Metrics/ParameterLists name = host.cache_class( cls, name: name || cls.name, fields: fields, build_query: build_query || maybe_mtd(cls, :build_query), combine_query: combine_query || maybe_mtd(cls, :combine_query), exec_query: exec_query || maybe_mtd(cls, :exec_query) ) register_constant(cls, name: name) host.register_mros end  | 
  
#register_constant(value, name:) ⇒ self
Register a Ruby object with Polar.
      229 230 231 232  | 
    
      # File 'lib/oso/polar/polar.rb', line 229 def register_constant(value, name:) ffi_polar.register_constant(host.to_polar(value), name: name) self end  | 
  
#repl(files = []) ⇒ Object
Start a REPL session.
      238 239 240 241 242 243 244 245 246 247  | 
    
      # File 'lib/oso/polar/polar.rb', line 238 def repl(files = []) load_files(files) prompt = "#{FG_BLUE}query>#{RESET} " # Try loading the readline module from the Ruby stdlib. If we get a # LoadError, fall back to the standard REPL with no readline support. require 'readline' repl_readline(prompt) rescue LoadError repl_standard(prompt) end  |