wolfram-alpha 0.1 → 0.2
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.
- data/library/wolfram-alpha.rb +10 -4
- data/library/wolfram-alpha/client.rb +44 -4
- data/library/wolfram-alpha/pod.rb +8 -0
- data/library/wolfram-alpha/response.rb +36 -1
- data/library/wolfram-alpha/subpod.rb +12 -0
- metadata +37 -43
data/library/wolfram-alpha.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
require 'cgi'
|
3
4
|
require 'open-uri'
|
4
5
|
require 'nokogiri'
|
5
6
|
|
@@ -8,10 +9,15 @@ require 'wolfram-alpha/client'
|
|
8
9
|
require 'wolfram-alpha/subpod'
|
9
10
|
require 'wolfram-alpha/response'
|
10
11
|
|
12
|
+
# Wolfram|Alpha introduces a fundamentally new way to get knowledge and answers—
|
13
|
+
# not by searching the web, but by doing dynamic computations based on a vast collection of
|
14
|
+
# built-in data, algorithms, and methods.
|
15
|
+
#
|
16
|
+
# @author Mikkel Kroman
|
11
17
|
module WolframAlpha
|
12
|
-
|
18
|
+
# The current version of the WolframAlpha library.
|
19
|
+
Version = "0.2"
|
13
20
|
|
14
|
-
|
15
|
-
|
16
|
-
end
|
21
|
+
# The API request-uri.
|
22
|
+
RequestURI = "http://api.wolframalpha.com/v2/query?input=%s&appid=%s"
|
17
23
|
end
|
@@ -1,15 +1,36 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module WolframAlpha
|
4
|
+
# Front object for communicating with the Wolfram|Alpha API.
|
4
5
|
class Client
|
5
|
-
|
6
|
+
# The Wolfram|Alpha API developer key, which is set upon initialization.
|
7
|
+
attr_accessor :application_key
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
+
# The default options for a new client, it is merged with the options
|
10
|
+
# set upon initialization.
|
11
|
+
DefaultOptions = {
|
12
|
+
timeout: 1
|
13
|
+
}
|
14
|
+
|
15
|
+
# Initialize a new client to communicate with the Wolfram|Alpha API.
|
16
|
+
#
|
17
|
+
# @param [String] application_key The developers API-key that can be easily
|
18
|
+
# obtained from http://products.wolframalpha.com/api/
|
19
|
+
# @param [Hash] options A set of options that may be put in the request.
|
20
|
+
#
|
21
|
+
# @see DefaultOptions
|
22
|
+
def initialize application_key = nil, options = {}
|
23
|
+
@options = DefaultOptions.merge options
|
24
|
+
@application_key = application_key
|
9
25
|
end
|
10
26
|
|
27
|
+
# Compute the value of user input, and return a new response.
|
28
|
+
#
|
29
|
+
# @param [String] query The users input query.
|
30
|
+
#
|
31
|
+
# @return [Response] The parsed response object.
|
11
32
|
def compute query
|
12
|
-
document = Nokogiri::XML open
|
33
|
+
document = Nokogiri::XML open request_url(query)
|
13
34
|
|
14
35
|
if document.root.name == "queryresult"
|
15
36
|
Response.new document
|
@@ -17,5 +38,24 @@ module WolframAlpha
|
|
17
38
|
raise "Invalid response"
|
18
39
|
end
|
19
40
|
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
# Mash together the request url, this is where the request-uri is modified
|
45
|
+
# according to the client options.
|
46
|
+
#
|
47
|
+
# @param [String] query The users input query.
|
48
|
+
#
|
49
|
+
# @return [String] The complete, formatted uri.
|
50
|
+
def request_url query = nil
|
51
|
+
escaped_query = CGI.escape query
|
52
|
+
formatted_url = WolframAlpha::RequestURI % [escaped_query, @application_key]
|
53
|
+
|
54
|
+
if @options[:timeout]
|
55
|
+
formatted_url << "&timeout=#{@options[:timeout]}"
|
56
|
+
end
|
57
|
+
|
58
|
+
return formatted_url
|
59
|
+
end
|
20
60
|
end
|
21
61
|
end
|
@@ -1,9 +1,17 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module WolframAlpha
|
4
|
+
# A wrapper for the pod element.
|
4
5
|
class Pod
|
6
|
+
# @return [Array] an array of sub-pods in this pod.
|
5
7
|
attr_reader :subpods
|
6
8
|
|
9
|
+
# Access an attribute on the pod element.
|
10
|
+
def [] attribute
|
11
|
+
@element[attribute]
|
12
|
+
end
|
13
|
+
|
14
|
+
# Construct a new pod with an assigned element, then extract all subpods from it.
|
7
15
|
def initialize element
|
8
16
|
@element = element
|
9
17
|
|
@@ -1,13 +1,48 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module WolframAlpha
|
4
|
+
# This is a response object that wraps the response data in a
|
5
|
+
# easily managable object.
|
6
|
+
#
|
7
|
+
# @see #input_as_text
|
8
|
+
# @see #result_as_text
|
4
9
|
class Response
|
5
10
|
attr_reader :pods
|
6
11
|
|
12
|
+
# Construct a new response for a +document+.
|
7
13
|
def initialize document = nil
|
8
14
|
@document = document
|
9
15
|
|
10
|
-
@pods = @document.xpath("//pod").map {
|
16
|
+
@pods = @document.xpath("//pod").map {|element| Pod.new element }
|
17
|
+
end
|
18
|
+
|
19
|
+
# Return the pod containing the subpods which is of type +input+.
|
20
|
+
def input
|
21
|
+
find_pod_with_id "Input"
|
22
|
+
end
|
23
|
+
|
24
|
+
# Map and join the input interpreted pod's subpods as a printable string.
|
25
|
+
def input_as_text
|
26
|
+
input.subpods.map(&:text).join ', '
|
27
|
+
end
|
28
|
+
|
29
|
+
# Return the pod containing the subpods which is of type +result+.
|
30
|
+
def result
|
31
|
+
find_pod_with_id "Result"
|
32
|
+
end
|
33
|
+
|
34
|
+
# Map and join the result pod's subpods as a printable string.
|
35
|
+
def result_as_text
|
36
|
+
result.subpods.map(&:text).join ', '
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# Find a pod of which id is +id+.
|
42
|
+
def find_pod_with_id id
|
43
|
+
@pods.find do |pod|
|
44
|
+
pod["id"] == id
|
45
|
+
end
|
11
46
|
end
|
12
47
|
end
|
13
48
|
end
|
@@ -1,11 +1,23 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module WolframAlpha
|
4
|
+
# A subpod is a container for a type of output, such as plain text,
|
5
|
+
# numbers, images, etc.
|
4
6
|
class Subpod
|
7
|
+
# This is the pod that this subpod belongs to.
|
8
|
+
attr_accessor :pod
|
9
|
+
|
10
|
+
# Construct a new subpod.
|
5
11
|
def initialize pod, element
|
6
12
|
@pod, @element = pod, element
|
7
13
|
end
|
8
14
|
|
15
|
+
# Access an attribute on the subpod element.
|
16
|
+
def [] key
|
17
|
+
return @element[key]
|
18
|
+
end
|
19
|
+
|
20
|
+
# Get the contents of plaintext as plain text.
|
9
21
|
def text
|
10
22
|
@element.xpath("plaintext").text
|
11
23
|
end
|
metadata
CHANGED
@@ -1,69 +1,63 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: wolfram-alpha
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 1
|
8
|
-
version: "0.1"
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
|
+
prerelease:
|
9
6
|
platform: ruby
|
10
|
-
authors:
|
7
|
+
authors:
|
11
8
|
- Mikkel Kroman
|
12
9
|
autorequire:
|
13
|
-
bindir:
|
10
|
+
bindir: bin
|
14
11
|
cert_chain: []
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
date: 2012-03-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: nokogiri
|
16
|
+
requirement: &22778340 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *22778340
|
20
25
|
description:
|
21
26
|
email: mk@maero.dk
|
22
27
|
executables: []
|
23
|
-
|
24
28
|
extensions: []
|
25
|
-
|
26
29
|
extra_rdoc_files: []
|
27
|
-
|
28
|
-
|
30
|
+
files:
|
31
|
+
- library/wolfram-alpha.rb
|
29
32
|
- library/wolfram-alpha/client.rb
|
30
|
-
- library/wolfram-alpha/response.rb
|
31
33
|
- library/wolfram-alpha/pod.rb
|
34
|
+
- library/wolfram-alpha/response.rb
|
32
35
|
- library/wolfram-alpha/subpod.rb
|
33
|
-
- library/wolfram-alpha.rb
|
34
|
-
has_rdoc: true
|
35
36
|
homepage:
|
36
37
|
licenses: []
|
37
|
-
|
38
38
|
post_install_message:
|
39
39
|
rdoc_options: []
|
40
|
-
|
41
|
-
require_paths:
|
40
|
+
require_paths:
|
42
41
|
- library
|
43
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
43
|
none: false
|
45
|
-
requirements:
|
46
|
-
- -
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
segments:
|
49
|
-
- 1
|
50
|
-
- 9
|
51
|
-
- 1
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
52
47
|
version: 1.9.1
|
53
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
49
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
- 0
|
60
|
-
version: "0"
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
61
54
|
requirements: []
|
62
|
-
|
63
55
|
rubyforge_project:
|
64
|
-
rubygems_version: 1.
|
56
|
+
rubygems_version: 1.8.11
|
65
57
|
signing_key:
|
66
58
|
specification_version: 3
|
67
|
-
summary: Wolfram|Alpha
|
59
|
+
summary: Wolfram|Alpha introduces a fundamentally new way to get knowledge and answers
|
60
|
+
— not by searching the web, but by doing dynamic computations based on a vast collection
|
61
|
+
of built-in data, algorithms, and methods.
|
68
62
|
test_files: []
|
69
|
-
|
63
|
+
has_rdoc:
|