wac icon indicating copy to clipboard operation
wac copied to clipboard

Wolfram|Alpha client

= 0.1 release of Wolfram|Alpha Client for ruby

This is extreme alpha code!

gem is coming soon, as are features and tests

== resources

Github for code: http://github.com/ianwhite/wac

API docs: http://ianwhite.github.com/wac/doc

== get going

make sure nokogiri and active_support are installed as gems

$ git clone git://github.com/ianwhite/wac.git $ cd wac $ irb

require 'rubygems' # or similar, to load up the deps

require 'lib/wac'

Wac.appid = "YOURAPIKEY"

grab a query result straight away

r = Wac.fetch 'pi'

  => a: MathematicalFunctionIdentity (assumptions: Clash)
    - Input: pi 
    - Decimal approximation: 3.1415926535897932384626433832795028841971693993751058209749... [More digits...]
    - Property: pi is a transcendental number 
    - Continued fraction: [3; 7, 15, 1, 292, 1, 1, 1, 2, 1, 3, 1, 14, 2, 1, 1, 2, 2, 2, 2, 1, 84, 2, 1, 1, 15, ...] [Fraction form...], [More terms...]
    - Alternative representations: pi = 180 deg  [More...]
    - Series representations: pi = 4 sum_(k=0)^infinity(-1)^k/(2 k+1) [More...]
    - Integral representations: pi = 2 integral_0^infinity1/(t^2+1) dt [More...]

requery using an assumption

r.assumptions

  => [#<Clash: a mathematical constant, a character, a movie, a word>]

r.assumptions[0][1].requery

  => q: "pi" (assuming a character)

r.assumptions[0][1].requery.fetch

  => a: Character (assumptions: Clash)
    - Input interpretation: pi  (character) 
    - Visual form:  
    - Name: Greek small letter pi 
    - Position in the Greek alphabet: 16th  letter  (10th letter from the end) 
    - Encodings: Unicode | U+03C0  (decimal: 960)
  HTML | &#960;
  Mathematica | \[Pi] [More...]
    - Standards blocks: Unicode | Greek and Coptic  (880 through 1023)  (144 characters)
  ISO 8859 | ISO 8859-7 (Greek)  (character 240) 

requery using a pod state

r[1]

  => #<Numeric: Decimal approximation: 3.1415926535897932384626433832795028841971693993751058209749... [More digits...]>

r[1].states[0].requery.fetch[1]

  => #<Recognize: Decimal approximation: 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282... [Fewer digits...], [More digits...]>

== Types

mixins are found/created that match the WA api results, and applied to the results. This means you can add your own app-specific behaviour by opening the mixins you are interested in.

For the 'pi' example above the following modules are mixed in:

the result is Wac::Result::MathematicalFunctionIdentity

r.is_a? Wac::Result::MathematicalFunctionIdentity => true

the pods are given mixins for their scanner attributes

r[0].is_a? Wac::Result::Identity => true r[1].is_a? Wac::Result::Numeric => true

the assumptions are given Assumption mixins

r.assumptions[0].is_a? Wac::Assumption::Clash => true

add your own behaviour for numerics

module Wac::Result::Numeric
  def to_f
    plaintext.to_f
  end
end

now all Numeric results can be cast to floats

== Want Images?

Most pods have an image associated with them, here's an example of how to access them:

r = Wac.fetch "Bob Dylan, Neil Young, Woody Guthrie, Kylie Minogue"

=> a: City,People
  - Input interpretation: Bob Dylan  (musician)  |  Neil Young  (musician)  |  Woody Guthrie  (musician)  |  Kylie Minogue  (singer/songwriter) 
  - Basic information:  | full name | date of birth | place of birth
    Bob Dylan | Robert Allen Zimmerman | 1941  (age: 68 years) | Duluth,Minnesota
    Neil Young | Neil Percival Young | 1945  (age: 63 years) | Toronto,Ontario
    Woody Guthrie | Woodrow Wilson Guthrie | 1912  (97 years ago) | Okemah,Oklahoma
    Kylie Minogue | Kylie Ann Minogue | 1968  (age: 41 years) | Melbourne,Victoria
     | date of death | place of death
    Woody Guthrie | 1967  (age: 55 years)
    (42 years ago) | New York [Show full dates...]
  - Timeline:  

collate all the images of these in a html string

r.map {|p| p.img}.join

=> "<img src=\"http://www1.wolframalpha.com/Calculate/MSP/MSP75197hc39c9cc059e800006b0403d7gehhf9f4?MSPStoreType=image/gif&amp;s=31\" alt=\"Bob Dylan  (musician)  |  Neil Young  (musician)  |  Woody Guthrie  (musician)  |  Kylie Minogue  (singer/songwriter)\" title=\"Bob Dylan  (musician)  |  Neil Young  (musician)  |  Woody Guthrie  (musician)  |  Kylie Minogue  (singer/songwriter)\" width=\"437\" height=\"41\"/><img src=\"http://www1.wolframalpha.com/Calculate/MSP/MSP76197hc39c9cc059e8000055d4671i712ab0g0?MSPStoreType=image/gif&amp;s=31\" alt=\" | full name | date of birth | place of birth Bob Dylan | Robert Allen Zimmerman | 1941  (age: 68 years) | Duluth,Minnesota Neil Young | Neil Percival Young | 1945  (age: 63 years) | Toronto,Ontario Woody Guthrie | Woodrow Wilson Guthrie | 1912  (97 years ago) | Okemah,Oklahoma Kylie Minogue | Kylie Ann Minogue | 1968  (age: 41 years) | Melbourne,Victoria  | date of death | place of death Woody Guthrie | 1967  (age: 55 years) (42 years ago) | New York\" title=\" | full name | date of birth | place of birth Bob Dylan | Robert Allen Zimmerman | 1941  (age: 68 years) | Duluth,Minnesota Neil Young | Neil Percival Young | 1945  (age: 63 years) | Toronto,Ontario Woody Guthrie | Woodrow Wilson Guthrie | 1912  (97 years ago) | Okemah,Oklahoma Kylie Minogue | Kylie Ann Minogue | 1968  (age: 41 years) | Melbourne,Victoria  | date of death | place of death Woody Guthrie | 1967  (age: 55 years) (42 years ago) | New York\" width=\"495\" height=\"355\"/><img src=\"http://www1.wolframalpha.com/Calculate/MSP/MSP77197hc39c9cc059e800005dhd19ib9b5g5igf?MSPStoreType=image/gif&amp;s=31\" alt=\"\" title=\"\" width=\"500\" height=\"108\"/>"

launch these images in browser windows

require 'launchy' r.each {|p| Launchy.open(p.img['src'])}

== Want HTML?

You can ask for formats in html, etc by adding options to the query or session (the session is just an options container that can issue queries).

s = Wac.new 'MYAPPID', :format => 'html' s.fetch('pi')[1].markup => "<div id="pod_0200" class="pod "><hr class="top" />

Decimal approximation:
    <li class="first">..."

== Other options

All of the official Wolfram Alpha API options are supported, on both sessions and queries. In addition, you can change the query_uri to point somewhere else.

s = Wac.new 'MYAPPID', :location => "Sheffield, UK" q = s.query "Distance to the Moon"

q.uri

=> "http://api.wolframalpha.com/v1/query?appid=beta824g5&input=Distance+to+the+moon&location=Sheffield%2C+UK"

s.query_uri = "http://preview.wolframalpha.com/api/v1/query.jsp" q = s.query "Distance to the Moon" q.uri

=> "http://preview.wolframalpha.com/api/v1/query.jsp?appid=beta824g5&input=Distance+to+the+Moon&location=Sheffield%2C+UK"

q.fetch

=> a: Astronomical,City
  - Input interpretation: Moon | distance from Earth 
  - Current result: 230407 miles 
  - Unit conversions: 370803 km  (kilometers) 
  - Comparison as distance:  ~~ 0.96 x mean Moon-Earth distance ( 3.844x10^8 m ) 
  - Corresponding quantity: Light travel time t in vacuum from t=x/c:
     | 1.2 seconds 
  - Orbital properties: current distance from Earth | 230407 mi
    1.237 light seconds
    average distance from Earth | 239200 mi
    1.284 light seconds
    largest distance from orbit center | 252100 mi
    63.61 R_(+)
    nearest distance from orbit center | 225600 mi
    56.93 R_(+)
    orbital period | 27.322 days [Show metric...], [More...]

q = s.query "distance to Manchester"

=> a: City,Internet (assumptions: SubCategory)
  - Input interpretation: distance | from Sheffield to Manchester 
  - Result: 31 miles 
  - Unit conversions: 49.89 km  (kilometers) 
  - Direct travel times: aircraft  (550 mph) | 3 minutes  20 seconds
    sound | 2 minutes  20 seconds
    light in fiber | 235 micros  (microseconds)
    light in vacuum | 165 micros  (microseconds)
    (assuming direct great-circle paths) [More...]
  - Map: