nom-ruby 0.2.0

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/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