nom-ruby 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ ###Changelog for nom-ruby
2
+
3
+ ####0.1.{ 0 - 20 } - Initial Dev Release
4
+ - Author: Brian Norton
5
+ - Support for basic Location Fetching, and User Management
6
+
7
+ ####0.2.0 - Initial Public Release
8
+ - Author: Brian Norton
9
+ - Locations { here, search}
10
+ - Users { register, login, search }
11
+ - Seen at [rubygems/nom-ruby]() and [github/nom-ruby](https://github.com/bnorton/nom-ruby)
12
+
data/CONTRIBUTORS.md ADDED
@@ -0,0 +1 @@
1
+ Brian Norton - [github (@bnorton)](http://github.com/bnorton) - [twitter (@nort)](http://twitter.com/nort)
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source :gemcutter
2
+
3
+ # Dependencies are specified in nom-ruby.gemspec;
4
+ gemspec
data/LICENSE.md ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2012 Nom [justnom.it](http://justnom.it)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to
8
+ do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,100 @@
1
+ # nom-ruby
2
+ - The bindings for the Nom API in ruby
3
+
4
+ ### Examples of the headless API
5
+ - https://justnom.it/locations/here.json?lat=37.7969398498535&lng=-122.399559020996
6
+ - https://justnom.it/activities.json?user_nid=4eccc0fbeef0a64dcf000001
7
+ - https://justnom.it/locations/search.json?lng=-122.3898&lat=37.81273&query=king
8
+
9
+ ## Usage:
10
+ @api_handle = Nom::API.new(:key => "your developer key")
11
+ @user = @api_handle.login('user_name or email', 'password')
12
+ @locations = @api_handle.here(:lat => 33.3, :lng => -122.2)
13
+ @activities = @api_handle.activities(:user_nid => '4eccc0fbeef0a64dcf000001')
14
+ @api_handle.recommend(:text => 'I Just Nommed at ...', :user_nid => '4eccc0fbeef0a64dcf000001', :auth_token => '2af...fad3y')
15
+ @api_handle.thumb(:location_nid => "4edgc0fbadf0a64dcf110037", :user_nid => '4eccc0fbeef0a64dcf000001', :auth_token => '2af...fad3y')
16
+
17
+ ## All Success Results Take the Form:
18
+ {
19
+ "status": 1,
20
+ "message": "OK",
21
+ "results": [
22
+ {"result": 1},
23
+ {"result": 2},
24
+ ...,
25
+ {"result": "n"}
26
+ ]
27
+ }
28
+
29
+ ## All Error Results Take the Form:
30
+ {
31
+ "status": -1,
32
+ "message": "Some display-ready message about what the error was",
33
+ "results": []
34
+ }
35
+
36
+ ## User:
37
+ {
38
+ name: "Brian Norton",
39
+ city: "San Francisco",
40
+ created_at: "2011-11-23T09:46:35Z",
41
+ image_url: "https://graph.facebook.com/679816146/picture?type=large",
42
+ updated_at: "2011-12-20T07:06:57Z",
43
+ url: "http://justnom.it/users/bn",
44
+ has_joined: true,
45
+ follower_count: 16,
46
+ user_nid: "4eccc0fbeef0a64dcf000001",
47
+ screen_name: "bn"
48
+ }
49
+
50
+ ## Location:
51
+ {
52
+ name: "The Grove Cafe Yerba Buena",
53
+ location_nid: "4ec8b964eef0a679f80005be",
54
+ primary_category: "4ec8b8a7eef0a679f8000001",
55
+ secondary_category: "4ec8b8cdeef0a679f8000151",
56
+ cross_street: "Between 3rd St and Annie St",
57
+ address: "690 Mission St San Francisco, CA 94105-4014",
58
+ street: "690 Mission St",
59
+ city: "San Francisco",
60
+ state: "California"
61
+ woeid: "12797156",
62
+ rank_value: 38,
63
+ gowalla_url: null,
64
+ fsq_id: "4b7ef75cf964a520ee0c30e3",
65
+ created_at: "2011-11-20T08:25:08Z",
66
+ cost: "$$",
67
+ updated_at: "2011-12-08T17:13:23Z",
68
+ url: null,
69
+ timeofday: "lunch | dinner",
70
+ rank: "38/7821",
71
+ phone: "415-957-0558",
72
+ neighborhoods: "Financial District South",
73
+ yid: "45199920"
74
+ }
75
+
76
+ ## Recommendation:
77
+ {
78
+ created_at: "2011-12-21T07:21:19Z",
79
+ location: @location,
80
+ title: null,
81
+ token: "7LVSG",
82
+ recommendation_nid: "4ef188efeef0a603e3000002",
83
+ text: "I just Nommed @ Velvet Room justnom.it/r/7LVSG",
84
+ user: @user,
85
+ image: {
86
+ size: "600x320#",
87
+ url: "http://static.justnom.it/8e637e6585609c9df21577afc2b333dabeeb32c6.medium.png",
88
+ image_nid: "4ee56d6beef0a61a7d000003"
89
+ },
90
+ lng: -122.41,
91
+ lat: 37.7892
92
+ }
93
+
94
+ ## Thumb
95
+ {
96
+ user_nid: "4eccc137eef0a64dcf000002",
97
+ created_at: "2011-12-21T05:03:22Z",
98
+ location: @location,
99
+ value: 1
100
+ }
@@ -0,0 +1,68 @@
1
+ module Nom
2
+ class API
3
+
4
+ def here(lat, lng, options = {})
5
+ start, limit = Nom::Util.page(options)
6
+ Nom::API.handle.get('/locations/here', {
7
+ :lat => lat,
8
+ :lng => lng,
9
+ :dist => (options[:dist] || 0.5),
10
+ :start => start,
11
+ :limit => limit
12
+ })
13
+ end
14
+
15
+ def location_search(query, options = {})
16
+ start, limit = Nom::Util.page(options)
17
+ params = { :query => query }
18
+
19
+ params.merge!({
20
+ :lat => options[:lat],
21
+ :lng => options[:lng]
22
+ }) if(options[:lat].present? && options[:lng].present?)
23
+
24
+ params.merge!({
25
+ :location => options[:location]
26
+ }) if options[:location].present?
27
+
28
+ Nom::API.handle.get('/locations/search', params)
29
+ end
30
+
31
+ def register(email, password, options ={})
32
+ Nom::API.handle.post('/users/register', {
33
+ :email => email,
34
+ :password => password,
35
+ :screen_name => options[:screen_name],
36
+ :name => options[:name],
37
+ :city => options[:city]
38
+ })
39
+ end
40
+
41
+ # Any item out of email, user_nid, screen_name will work
42
+ def login(password, options ={})
43
+ Nom::API.handle.post('/users/login', {
44
+ :password => password,
45
+ :email => options[:email],
46
+ :user_nid => options[:user_nid],
47
+ :screen_name => options[:screen_name]
48
+ })
49
+ end
50
+
51
+ def user_search(query, options = {})
52
+ start, limit = Nom::Util.page(options)
53
+ Nom::API.handle.get('/locations/search', {
54
+ :query => query, # If the input value is of unknown origin
55
+ :screen_name => options[:screen_name],
56
+ :email => options[:email]
57
+ })
58
+ end
59
+
60
+ private
61
+
62
+ # keep this around for re-use
63
+ def self.handle
64
+ @handle ||= Nom::Fetcher.new # (:key => Nom::Keys.developer, :secret => Nom::Keys.secret)
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,55 @@
1
+ module Nom
2
+ class Fetcher
3
+
4
+ def post(path, body = {})
5
+ url = url_for_path(path)
6
+ go(url, Net::HTTP::Post, body)
7
+ end
8
+
9
+ def get(path, params = {})
10
+ url = url_for_path(path)
11
+ add_params(url, params)
12
+ go(url, Net::HTTP::Get)
13
+ end
14
+
15
+ private
16
+
17
+ def port
18
+ 443
19
+ end
20
+
21
+ def base_url
22
+ "https://justnom.it"
23
+ end
24
+
25
+ def start(url)
26
+ uri = URI.parse(url)
27
+ http = Net::HTTP.new(uri.host, uri.port)
28
+ http.use_ssl = true
29
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
30
+ [http, uri]
31
+ end
32
+
33
+ def go(url, type, body=nil)
34
+ http,uri = start(url)
35
+ request = type.new(uri.request_uri)
36
+ request.set_form_data(body) if(body.kind_of?(Hash) && body.present?)
37
+ JSON.parse(http.request(request).body) rescue {}
38
+ end
39
+
40
+ # always request json
41
+ def url_for_path(path)
42
+ url = "#{base_url}#{path}"
43
+ url << '.json' unless url =~ /\.json$/
44
+ end
45
+
46
+ # if any params are present
47
+ def add_params(url, params)
48
+ return unless params.kind_of? Hash
49
+ extra = (url =~ /\?/) ? "&" : "?"
50
+ url << extra
51
+ url << params.to_param unless params.blank?
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+ module Nom
2
+ class Keys
3
+ def self.developer
4
+ "42ga53s0_sample_developer_key_4etnom"
5
+ end
6
+
7
+ def self.secret
8
+ "42ga53s0_sample_secret_4etnom"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ module Nom
2
+ class Util
3
+ def self.page(options)
4
+ start = options[:start].present? ? options[:start] : 0
5
+ limit = options[:limit].present? ? options[:limit] : 15
6
+ start = 0 if start < 0
7
+ [start, limit]
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module GemNom
2
+ module VERSION
3
+ MAJOR = 0
4
+ MINOR = 2
5
+ PATCH = 0
6
+ PRE = nil
7
+ STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
8
+ end
9
+ end
data/lib/nom-ruby.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'rubygems'
2
+ require 'net/http'
3
+ require 'net/https'
4
+ require 'active_support'
5
+ require 'json'
6
+
7
+ require 'nom-ruby/fetcher'
8
+ require 'nom-ruby/keys'
9
+ require 'nom-ruby/util'
10
+
11
+ require 'nom-ruby/api'
data/nom-ruby.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/nom-ruby/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "nom-ruby"
6
+ s.version = GemNom::VERSION::STRING
7
+ s.platform = Gem::Platform::RUBY
8
+ s.author = 'Brian Norton'
9
+ s.email = ["team@justnom.it"]
10
+ s.homepage = "https://github.com/bnorton/nom-ruby"
11
+ s.summary = "Nom API ruby client"
12
+ s.description = "Ruby client for using the Nom API. Nom is the best way to find out what's best in your world."
13
+
14
+ s.required_rubygems_version = ">= 1.3.6"
15
+ s.rubyforge_project = "nom-ruby"
16
+
17
+ s.add_dependency 'json', '>= 1.4.6'
18
+
19
+ s.add_development_dependency "bundler", ">= 1.0.0"
20
+ s.add_development_dependency "gemcutter", ">= 0.6.1"
21
+ s.add_development_dependency "rspec", "~> 2.2"
22
+
23
+ s.files = `git ls-files`.split("\n") - ['.rvmrc', '.gitignore']
24
+ s.test_files = `git ls-files`.split("\n").grep(/^spec/)
25
+ s.require_paths = %w[lib]
26
+
27
+ s.extra_rdoc_files = ['README.md', 'LICENSE.md', 'CHANGELOG.md']
28
+ s.rdoc_options = ['--line-numbers', '--inline-source', '--title', 'nom-ruby', '--main', 'README.md']
29
+
30
+ end
File without changes
data/spec/user_spec.rb ADDED
File without changes
data/spec/util_spec.rb ADDED
File without changes
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nom-ruby
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
+ platform: ruby
12
+ authors:
13
+ - Brian Norton
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-12-30 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: json
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 11
29
+ segments:
30
+ - 1
31
+ - 4
32
+ - 6
33
+ version: 1.4.6
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: bundler
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 23
45
+ segments:
46
+ - 1
47
+ - 0
48
+ - 0
49
+ version: 1.0.0
50
+ type: :development
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: gemcutter
54
+ prerelease: false
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ hash: 5
61
+ segments:
62
+ - 0
63
+ - 6
64
+ - 1
65
+ version: 0.6.1
66
+ type: :development
67
+ version_requirements: *id003
68
+ - !ruby/object:Gem::Dependency
69
+ name: rspec
70
+ prerelease: false
71
+ requirement: &id004 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ hash: 7
77
+ segments:
78
+ - 2
79
+ - 2
80
+ version: "2.2"
81
+ type: :development
82
+ version_requirements: *id004
83
+ description: Ruby client for using the Nom API. Nom is the best way to find out what's best in your world.
84
+ email:
85
+ - team@justnom.it
86
+ executables: []
87
+
88
+ extensions: []
89
+
90
+ extra_rdoc_files:
91
+ - README.md
92
+ - LICENSE.md
93
+ - CHANGELOG.md
94
+ files:
95
+ - CHANGELOG.md
96
+ - CONTRIBUTORS.md
97
+ - Gemfile
98
+ - LICENSE.md
99
+ - README.md
100
+ - lib/nom-ruby.rb
101
+ - lib/nom-ruby/api.rb
102
+ - lib/nom-ruby/fetcher.rb
103
+ - lib/nom-ruby/keys.rb
104
+ - lib/nom-ruby/util.rb
105
+ - lib/nom-ruby/version.rb
106
+ - nom-ruby.gemspec
107
+ - spec/location_spec.rb
108
+ - spec/user_spec.rb
109
+ - spec/util_spec.rb
110
+ homepage: https://github.com/bnorton/nom-ruby
111
+ licenses: []
112
+
113
+ post_install_message:
114
+ rdoc_options:
115
+ - --line-numbers
116
+ - --inline-source
117
+ - --title
118
+ - nom-ruby
119
+ - --main
120
+ - README.md
121
+ require_paths:
122
+ - lib
123
+ required_ruby_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ hash: 3
129
+ segments:
130
+ - 0
131
+ version: "0"
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ none: false
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ hash: 23
138
+ segments:
139
+ - 1
140
+ - 3
141
+ - 6
142
+ version: 1.3.6
143
+ requirements: []
144
+
145
+ rubyforge_project: nom-ruby
146
+ rubygems_version: 1.8.11
147
+ signing_key:
148
+ specification_version: 3
149
+ summary: Nom API ruby client
150
+ test_files:
151
+ - spec/location_spec.rb
152
+ - spec/user_spec.rb
153
+ - spec/util_spec.rb