flexmls_api 0.6.5 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/History.txt +12 -1
  2. data/VERSION +1 -1
  3. data/lib/flexmls_api.rb +13 -11
  4. data/lib/flexmls_api/authentication/api_auth.rb +5 -3
  5. data/lib/flexmls_api/authentication/oauth2.rb +23 -17
  6. data/lib/flexmls_api/authentication/oauth2_impl/password_provider.rb +25 -0
  7. data/lib/flexmls_api/cli.rb +51 -25
  8. data/lib/flexmls_api/cli/oauth2.rb +1 -30
  9. data/lib/flexmls_api/cli/setup.rb +4 -1
  10. data/lib/flexmls_api/client.rb +1 -1
  11. data/lib/flexmls_api/configuration.rb +10 -0
  12. data/lib/flexmls_api/configuration/yaml.rb +81 -0
  13. data/lib/flexmls_api/faraday.rb +12 -2
  14. data/lib/flexmls_api/models.rb +25 -23
  15. data/lib/flexmls_api/models/constraint.rb +16 -0
  16. data/lib/flexmls_api/models/listing.rb +45 -2
  17. data/lib/flexmls_api/models/photo.rb +57 -2
  18. data/lib/flexmls_api/models/subresource.rb +5 -2
  19. data/lib/flexmls_api/multi_client.rb +21 -6
  20. data/lib/flexmls_api/paginate.rb +18 -1
  21. data/lib/flexmls_api/request.rb +1 -71
  22. data/lib/flexmls_api/response.rb +69 -0
  23. data/spec/fixtures/{contacts.json → contacts/contacts.json} +0 -0
  24. data/spec/fixtures/{contact_my.json → contacts/my.json} +0 -0
  25. data/spec/fixtures/{contact_new.json → contacts/new.json} +0 -0
  26. data/spec/fixtures/{contact_new_empty.json → contacts/new_empty.json} +0 -0
  27. data/spec/fixtures/{contact_new_notify.json → contacts/new_notify.json} +0 -0
  28. data/spec/fixtures/{contacts_post.json → contacts/post.json} +0 -0
  29. data/spec/fixtures/{contact_tags.json → contacts/tags.json} +0 -0
  30. data/spec/fixtures/{listing_cart_add_listing.json → listing_carts/add_listing.json} +0 -0
  31. data/spec/fixtures/{listing_cart_add_listing_post.json → listing_carts/add_listing_post.json} +0 -0
  32. data/spec/fixtures/{listing_cart_empty.json → listing_carts/empty.json} +0 -0
  33. data/spec/fixtures/{listing_cart.json → listing_carts/listing_cart.json} +0 -0
  34. data/spec/fixtures/{listing_cart_new.json → listing_carts/new.json} +0 -0
  35. data/spec/fixtures/{listing_cart_post.json → listing_carts/post.json} +0 -0
  36. data/spec/fixtures/{listing_cart_remove_listing.json → listing_carts/remove_listing.json} +0 -0
  37. data/spec/fixtures/listings/constraints.json +18 -0
  38. data/spec/fixtures/listings/constraints_with_pagination.json +24 -0
  39. data/spec/fixtures/{listing_document_index.json → listings/document_index.json} +0 -0
  40. data/spec/fixtures/{listing_no_subresources.json → listings/no_subresources.json} +0 -0
  41. data/spec/fixtures/{open_houses.json → listings/open_houses.json} +0 -0
  42. data/spec/fixtures/{listing_photos_index.json → listings/photos/index.json} +0 -0
  43. data/spec/fixtures/listings/photos/new.json +12 -0
  44. data/spec/fixtures/listings/photos/post.json +20 -0
  45. data/spec/fixtures/listings/put.json +5 -0
  46. data/spec/fixtures/{saved_search.json → listings/saved_search.json} +0 -0
  47. data/spec/fixtures/{shared_listing_new.json → listings/shared_listing_new.json} +0 -0
  48. data/spec/fixtures/{shared_listing_post.json → listings/shared_listing_post.json} +0 -0
  49. data/spec/fixtures/{tour_of_homes.json → listings/tour_of_homes.json} +0 -0
  50. data/spec/fixtures/{listing_videos_index.json → listings/videos_index.json} +0 -0
  51. data/spec/fixtures/{listing_virtual_tours_index.json → listings/virtual_tours_index.json} +0 -0
  52. data/spec/fixtures/{listing_with_documents.json → listings/with_documents.json} +0 -0
  53. data/spec/fixtures/listings/with_permissions.json +44 -0
  54. data/spec/fixtures/{listing_with_photos.json → listings/with_photos.json} +0 -0
  55. data/spec/fixtures/{listing_with_supplement.json → listings/with_supplement.json} +0 -0
  56. data/spec/fixtures/{listing_with_videos.json → listings/with_videos.json} +0 -0
  57. data/spec/fixtures/{listing_with_vtour.json → listings/with_vtour.json} +0 -0
  58. data/spec/fixtures/logo_fbs.png +0 -0
  59. data/spec/fixtures/{add_note.json → notes/add.json} +0 -0
  60. data/spec/fixtures/{agent_shared_note.json → notes/agent_shared.json} +0 -0
  61. data/spec/fixtures/{agent_shared_note_empty.json → notes/agent_shared_empty.json} +0 -0
  62. data/spec/fixtures/{note_new.json → notes/new.json} +0 -0
  63. data/spec/fixtures/{standardfields_city.json → standardfields/city.json} +0 -0
  64. data/spec/fixtures/{standardfields_nearby.json → standardfields/nearby.json} +0 -0
  65. data/spec/fixtures/{standardfields.json → standardfields/standardfields.json} +0 -0
  66. data/spec/fixtures/{standardfields_stateorprovince.json → standardfields/stateorprovince.json} +0 -0
  67. data/spec/mock_helper.rb +5 -3
  68. data/spec/unit/flexmls_api/authentication/api_auth_spec.rb +11 -2
  69. data/spec/unit/flexmls_api/authentication/base_auth_spec.rb +10 -0
  70. data/spec/unit/flexmls_api/authentication/oauth2_spec.rb +3 -3
  71. data/spec/unit/flexmls_api/configuration/yaml_spec.rb +70 -0
  72. data/spec/unit/flexmls_api/models/constraint_spec.rb +19 -0
  73. data/spec/unit/flexmls_api/models/contact_spec.rb +8 -8
  74. data/spec/unit/flexmls_api/models/document_spec.rb +1 -1
  75. data/spec/unit/flexmls_api/models/listing_cart_spec.rb +15 -15
  76. data/spec/unit/flexmls_api/models/listing_spec.rb +78 -13
  77. data/spec/unit/flexmls_api/models/note_spec.rb +4 -4
  78. data/spec/unit/flexmls_api/models/open_house_spec.rb +1 -1
  79. data/spec/unit/flexmls_api/models/photo_spec.rb +73 -40
  80. data/spec/unit/flexmls_api/models/saved_search_spec.rb +3 -3
  81. data/spec/unit/flexmls_api/models/shared_listing_spec.rb +1 -1
  82. data/spec/unit/flexmls_api/models/standard_fields_spec.rb +4 -7
  83. data/spec/unit/flexmls_api/models/tour_of_home_spec.rb +1 -1
  84. data/spec/unit/flexmls_api/models/video_spec.rb +1 -1
  85. data/spec/unit/flexmls_api/models/virtual_tour_spec.rb +1 -1
  86. data/spec/unit/flexmls_api/multi_client_spec.rb +9 -1
  87. data/spec/unit/flexmls_api/paginate_spec.rb +1 -1
  88. data/spec/unit/flexmls_api/request_spec.rb +2 -2
  89. metadata +182 -152
@@ -1,3 +1,14 @@
1
+ == v0.7.0 2011-10-03
2
+ * Major changes to results object returned from the client (and models). Results are no longer allowed to be nil, and Array is decorated with non result response information.
3
+ * Finished listing photo uploads
4
+ * ListPrice save operation for listings
5
+ * Listing contraints processing
6
+ == v0.6.7 2011-09-02
7
+ * YAML key management
8
+ == v0.6.6 2011-08-30
9
+ * Added methods for returning street, region, and full address for a listing
10
+ == v0.6.5 2011-08-02
11
+ * Fixed some recursive gemspec issues from jewler by removing jeweler and going with some of our own custom rake tasks.
1
12
  == v0.6.4 2011-08-02
2
13
  * added public method for the listing carts service specified
3
14
  * added spec for portal listing cart method
@@ -121,4 +132,4 @@
121
132
  == v0.1.1 2010-12-23
122
133
  * IDX link and market stat models.
123
134
  == v0.1.0 2010-12-13
124
- * Initial usable release with request interface and models
135
+ * Initial usable release with request interface and models
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.5
1
+ 0.7.0
@@ -1,24 +1,25 @@
1
- # Flexmlsapi
2
1
  require 'rubygems'
3
2
  require 'curb'
4
3
  require 'json'
5
4
  require 'logger'
6
5
 
7
- require File.expand_path('../flexmls_api/version', __FILE__)
8
- require File.expand_path('../flexmls_api/configuration', __FILE__)
9
- require File.expand_path('../flexmls_api/multi_client', __FILE__)
10
- require File.expand_path('../flexmls_api/authentication', __FILE__)
11
- require File.expand_path('../flexmls_api/paginate', __FILE__)
12
- require File.expand_path('../flexmls_api/request', __FILE__)
13
- require File.expand_path('../flexmls_api/client', __FILE__)
14
- require File.expand_path('../flexmls_api/faraday', __FILE__)
15
- require File.expand_path('../flexmls_api/primary_array', __FILE__)
16
- require File.expand_path('../flexmls_api/models', __FILE__)
6
+ require 'flexmls_api/version'
7
+ require 'flexmls_api/configuration'
8
+ require 'flexmls_api/multi_client'
9
+ require 'flexmls_api/authentication'
10
+ require 'flexmls_api/response'
11
+ require 'flexmls_api/paginate'
12
+ require 'flexmls_api/request'
13
+ require 'flexmls_api/client'
14
+ require 'flexmls_api/faraday'
15
+ require 'flexmls_api/primary_array'
16
+ require 'flexmls_api/models'
17
17
 
18
18
  module FlexmlsApi
19
19
  extend Configuration
20
20
  extend MultiClient
21
21
 
22
+ #:nocov:
22
23
  def self.logger
23
24
  if @logger.nil?
24
25
  @logger = Logger.new(STDOUT)
@@ -26,6 +27,7 @@ module FlexmlsApi
26
27
  end
27
28
  @logger
28
29
  end
30
+ #:nocov:
29
31
 
30
32
  def self.client(opts={})
31
33
  Thread.current[:flexmls_api_client] ||= FlexmlsApi::Client.new(opts)
@@ -12,7 +12,7 @@ module FlexmlsApi
12
12
  class ApiAuth < BaseAuth
13
13
 
14
14
  def initialize(client)
15
- @client = client
15
+ super(client)
16
16
  end
17
17
 
18
18
  def authenticate
@@ -55,14 +55,16 @@ module FlexmlsApi
55
55
 
56
56
  # Sign a request with request data.
57
57
  def sign_token(path, params = {}, post_data="")
58
- sign("#{@client.api_secret}ApiKey#{@client.api_key}ServicePath#{path}#{build_param_string(params)}#{post_data}")
58
+ token_string = "#{@client.api_secret}ApiKey#{@client.api_key}ServicePath#{path}#{build_param_string(params)}#{post_data}"
59
+ signed = sign(token_string)
60
+ signed
59
61
  end
60
62
 
61
63
  # Perform an HTTP request (no data)
62
64
  def request(method, path, body, options)
63
65
  escaped_path = URI.escape(path)
64
66
  request_opts = {
65
- "AuthToken" => @session.auth_token
67
+ :AuthToken => @session.auth_token
66
68
  }
67
69
  unless @client.api_user.nil?
68
70
  request_opts.merge!(:ApiUser => "#{@client.api_user}")
@@ -5,14 +5,6 @@ module FlexmlsApi
5
5
 
6
6
  module Authentication
7
7
 
8
- module OAuth2Impl
9
- require 'flexmls_api/authentication/oauth2_impl/middleware'
10
- require 'flexmls_api/authentication/oauth2_impl/grant_type_base'
11
- require 'flexmls_api/authentication/oauth2_impl/grant_type_refresh'
12
- require 'flexmls_api/authentication/oauth2_impl/grant_type_code'
13
- require 'flexmls_api/authentication/oauth2_impl/grant_type_password'
14
- end
15
-
16
8
  #=OAuth2 Authentication
17
9
  # Auth implementation to the API using the OAuth2 service endpoint. Current adheres to the 10
18
10
  # draft of the OAuth2 specification. With OAuth2, the application supplies credentials for the
@@ -30,7 +22,7 @@ module FlexmlsApi
30
22
  class OAuth2 < BaseAuth
31
23
 
32
24
  def initialize(client)
33
- @client = client
25
+ super(client)
34
26
  @provider = client.oauth2_provider
35
27
  end
36
28
 
@@ -120,18 +112,23 @@ module FlexmlsApi
120
112
  # @client_id - OAuth2 provided application identifier
121
113
  # @client_secret - OAuth2 provided password for the client id
122
114
  class BaseOAuth2Provider
123
-
124
- attr_accessor :authorization_uri, :access_uri, :grant_type, :client_id, :client_secret
125
-
115
+ attr_accessor *Configuration::OAUTH2_KEYS
126
116
  # Requirements for authorization_code grant type
127
- attr_accessor :code, :redirect_uri
128
- # Requirements for password grant type
129
- attr_accessor :username, :password
117
+ attr_accessor :code
118
+ attr_accessor :grant_type
119
+
120
+ def initialize(opts={})
121
+ Configuration::OAUTH2_KEYS.each do |key|
122
+ send("#{key}=", opts[key]) if opts.include? key
123
+ end
124
+ @grant_type = :authorization_code
125
+ end
130
126
 
131
127
  def grant_type
132
- :authorization_code
128
+ # backwards compatibility check
129
+ @grant_type.nil? ? :authorization_code : @grant_type
133
130
  end
134
-
131
+
135
132
  # Application using the client must handle user redirect for user authentication. For
136
133
  # command line applications, this method is called prior to initial client requests so that
137
134
  # the process can notify the user to go to the url and retrieve the access_code for the app.
@@ -166,6 +163,15 @@ module FlexmlsApi
166
163
 
167
164
  end
168
165
 
166
+ module OAuth2Impl
167
+ require 'flexmls_api/authentication/oauth2_impl/middleware'
168
+ require 'flexmls_api/authentication/oauth2_impl/grant_type_base'
169
+ require 'flexmls_api/authentication/oauth2_impl/grant_type_refresh'
170
+ require 'flexmls_api/authentication/oauth2_impl/grant_type_code'
171
+ require 'flexmls_api/authentication/oauth2_impl/grant_type_password'
172
+ require 'flexmls_api/authentication/oauth2_impl/password_provider'
173
+ end
174
+
169
175
  end
170
176
 
171
177
  end
@@ -0,0 +1,25 @@
1
+
2
+ module FlexmlsApi
3
+ module Authentication
4
+ module OAuth2Impl
5
+ class PasswordProvider < FlexmlsApi::Authentication::BaseOAuth2Provider
6
+ def initialize(credentials)
7
+ super(credentials)
8
+ @grant_type = :password
9
+ end
10
+
11
+ def load_session()
12
+ @session
13
+ end
14
+
15
+ def save_session(session)
16
+ @session = session
17
+ end
18
+
19
+ def destroy_session
20
+ @session = nil
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,5 +1,15 @@
1
1
  require 'optparse'
2
2
 
3
+ if ENV["FLEXMLS_API_CONSOLE"].nil?
4
+ require 'flexmls_api'
5
+ else
6
+ puts "Enabling console mode for local gem"
7
+ Bundler.require(:default, "development") if defined?(Bundler)
8
+ path = File.expand_path(File.dirname(__FILE__) + "/../../../lib/")
9
+ $LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
10
+ require path + '/flexmls_api'
11
+ end
12
+
3
13
  module FlexmlsApi
4
14
  module CLI
5
15
  class ConsoleCLI
@@ -16,7 +26,7 @@ module FlexmlsApi
16
26
  :api_secret => "API_SECRET",
17
27
  :api_user => "API_USER",
18
28
  # OTHER
19
- :verbose => "VERBOSE",
29
+ :debug=> "DEBUG",
20
30
  :console => "FLEXMLS_API_CONSOLE" # not a public option, meant to distinguish bin/flexmls_api and script/console
21
31
  }
22
32
 
@@ -38,7 +48,7 @@ module FlexmlsApi
38
48
 
39
49
  private
40
50
  def self.setup_options(stdout,arguments)
41
- options = {
51
+ env_options = {
42
52
  :oauth2 => false,
43
53
  :endpoint => ENV[OPTIONS_ENV[:endpoint]],
44
54
  # OAUTH2 Options
@@ -53,9 +63,11 @@ module FlexmlsApi
53
63
  :api_user => ENV[OPTIONS_ENV[:api_user]],
54
64
  :console => ENV[OPTIONS_ENV[:console]]
55
65
  }
56
-
66
+ cli_options = {}
67
+ file_options = {}
57
68
  parser = OptionParser.new do |opts|
58
69
  opts.banner = <<-BANNER.gsub(/^ /,'')
70
+ #{version}
59
71
  FlexmlsApi Client Console - http://www.flexmls.com/developers/api/
60
72
 
61
73
  Usage: #{File.basename($0)} [options]
@@ -68,47 +80,51 @@ module FlexmlsApi
68
80
  opts.on("-o","--oauth2",
69
81
  "Run the API using OAuth2 credentials. The client defaults to using the flexmls API authentication mode for access. ",
70
82
  "See http://www.flexmls.com/developers/api/api-services/authentication/ for more information on authentication types.",
71
- "Default: false") { |arg| options[:oauth2] = arg }
72
- opts.on("-e","--endpoint",
83
+ "Default: false") { |arg| cli_options[:oauth2] = arg }
84
+ opts.on("-e","--endpoint ENDPOINT",
73
85
  "URI of the API.",
74
- "Default: ENV['#{OPTIONS_ENV[:endpoint]}']") { |arg| options[:endpoint] = arg }
86
+ "Default: ENV['#{OPTIONS_ENV[:endpoint]}']") { |arg| cli_options[:endpoint] = arg }
75
87
 
76
88
  # OAUTH2
77
- opts.on("--client_id",
89
+ opts.on("--client_id CLIENT_ID",
78
90
  "OAuth2 client id",
79
- "Default: ENV['#{OPTIONS_ENV[:client_id]}']") { |arg| options[:client_id] = arg }
80
- opts.on("--client_secret",
91
+ "Default: ENV['#{OPTIONS_ENV[:client_id]}']") { |arg| cli_options[:client_id] = arg }
92
+ opts.on("--client_secret CLIENT_SECRET",
81
93
  "OAuth2 client secret",
82
- "Default: ENV['#{OPTIONS_ENV[:client_secret]}']") { |arg| options[:client_secret] = arg }
83
- opts.on("-u","--username",
94
+ "Default: ENV['#{OPTIONS_ENV[:client_secret]}']") { |arg| cli_options[:client_secret] = arg }
95
+ opts.on("-u","--username USERNAME",
84
96
  "OAuth2 username",
85
- "Default: ENV['#{OPTIONS_ENV[:username]}']") { |arg| options[:username] = arg }
86
- opts.on("-p","--password",
97
+ "Default: ENV['#{OPTIONS_ENV[:username]}']") { |arg| cli_options[:username] = arg }
98
+ opts.on("-p","--password PASSWORD",
87
99
  "OAuth2 password",
88
- "Default: ENV['#{OPTIONS_ENV[:password]}']") { |arg| options[:password] = arg }
89
- opts.on("--access_uri",
100
+ "Default: ENV['#{OPTIONS_ENV[:password]}']") { |arg| cli_options[:password] = arg }
101
+ opts.on("--access_uri ACCESS_URI",
90
102
  "OAuth2 path for granting access to the application",
91
- "Default: ENV['#{OPTIONS_ENV[:access_uri]}']") { |arg| options[:access_uri] = arg }
103
+ "Default: ENV['#{OPTIONS_ENV[:access_uri]}']") { |arg| cli_options[:access_uri] = arg }
92
104
 
93
105
  # API AUTH
94
- opts.on("--api_key",
106
+ opts.on("--api_key API_KEY",
95
107
  "Authentication key for running the api using the default api authentication",
96
- "Default: ENV['#{OPTIONS_ENV[:api_key]}']") { |arg| options[:api_key] = arg }
97
- opts.on("--api_secret",
108
+ "Default: ENV['#{OPTIONS_ENV[:api_key]}']") { |arg| cli_options[:api_key] = arg }
109
+ opts.on("--api_secret API_SECRET",
98
110
  "API secret for the api key",
99
- "Default: ENV['#{OPTIONS_ENV[:api_secret]}']") { |arg| options[:api_secret] = arg }
100
- opts.on("--api_user",
111
+ "Default: ENV['#{OPTIONS_ENV[:api_secret]}']") { |arg| cli_options[:api_secret] = arg }
112
+ opts.on("--api_user API_USER",
101
113
  "ID of the flexmls user to run the client as.",
102
- "Default: ENV['#{OPTIONS_ENV[:api_user]}']") { |arg| options[:api_user] = arg }
114
+ "Default: ENV['#{OPTIONS_ENV[:api_user]}']") { |arg| cli_options[:api_user] = arg }
103
115
 
104
- opts.on("-v", "--verbose",
105
- "Show detailed request logging information.") { |arg| options[:verbose] = arg }
116
+ opts.on("-f", "--file FILE",
117
+ "Load configuration for yaml file.") { |arg| file_options = parse_file_options(arg) }
118
+ opts.on("-d", "--debug",
119
+ "Show detailed request logging information.") { |arg| cli_options[:debug] = arg }
120
+ opts.on("-v", "--version",
121
+ "Show client version.") { stdout.puts version; exit }
106
122
  opts.on("-h", "--help",
107
123
  "Show this help message.") { stdout.puts opts; exit }
108
124
  opts.parse!(arguments)
109
125
 
110
126
  end
111
-
127
+ options = env_options.merge(file_options.merge(cli_options))
112
128
  return options
113
129
  end
114
130
 
@@ -127,6 +143,16 @@ module FlexmlsApi
127
143
  end
128
144
  run_env
129
145
  end
146
+
147
+ private
148
+ def self.parse_file_options(file)
149
+ yaml = FlexmlsApi::Configuration::YamlConfig.new(file)
150
+ return {:oauth2 => yaml.oauth2}.merge(yaml.client_keys.merge(yaml.oauth2_keys))
151
+ end
152
+
153
+ def self.version
154
+ "flexmlsApi v#{FlexmlsApi::VERSION}"
155
+ end
130
156
  end
131
157
  end
132
158
  end
@@ -1,36 +1,7 @@
1
1
  require File.dirname(__FILE__) + "/../cli/setup"
2
2
 
3
- class CLIOAuth2Provider < FlexmlsApi::Authentication::BaseOAuth2Provider
4
- def initialize(credentials)
5
- @authorization_uri = credentials[:authorization_uri]
6
- @access_uri = credentials[:access_uri]
7
- @redirect_uri = credentials[:redirect_uri]
8
- @client_id = credentials[:client_id]
9
- @client_secret = credentials[:client_secret]
10
- @username = credentials[:username]
11
- @password = credentials[:password]
12
- @session = nil
13
- end
14
-
15
- def grant_type
16
- :password
17
- end
18
-
19
- def load_session()
20
- @session
21
- end
22
-
23
- def save_session(session)
24
- @session = session
25
- end
26
-
27
- def destroy_session
28
- @session = nil
29
- end
30
- end
31
-
32
3
  FlexmlsApi.configure do |config|
33
- config.oauth2_provider = CLIOAuth2Provider.new(
4
+ config.oauth2_provider = FlexmlsApi::Authentication::OAuth2Impl::PasswordProvider.new(
34
5
  :authorization_uri=> ENV["AUTH_URI"],
35
6
  :access_uri => ENV["ACCESS_URI"],
36
7
  :username=> ENV["USERNAME"],
@@ -1,5 +1,8 @@
1
1
  require "rubygems"
2
2
  require 'pp'
3
+ require 'irb/ext/save-history'
4
+ IRB.conf[:SAVE_HISTORY] = 1000
5
+ IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.flexmls-api-history"
3
6
 
4
7
  if ENV["FLEXMLS_API_CONSOLE"].nil?
5
8
  require 'flexmls_api'
@@ -29,7 +32,7 @@ module FlexmlsApi
29
32
  def self.logger
30
33
  if @logger.nil?
31
34
  @logger = Logger.new(STDOUT)
32
- @logger.level = ENV["VERBOSE"].nil? ? Logger::WARN : Logger::DEBUG
35
+ @logger.level = ENV["DEBUG"].nil? ? Logger::WARN : Logger::DEBUG
33
36
  end
34
37
  @logger
35
38
  end
@@ -21,6 +21,6 @@ module FlexmlsApi
21
21
  # Instanciate the authenication class passed in.
22
22
  @authenticator = authentication_mode.send("new", self)
23
23
  end
24
-
24
+
25
25
  end
26
26
  end
@@ -1,7 +1,17 @@
1
+
1
2
  module FlexmlsApi
2
3
  module Configuration
4
+
3
5
  # valid configuration options
4
6
  VALID_OPTION_KEYS = [:api_key, :api_secret, :api_user, :endpoint, :user_agent, :version, :ssl, :oauth2_provider, :authentication_mode].freeze
7
+ OAUTH2_KEYS = [:authorization_uri, :access_uri, :client_id, :client_secret,
8
+ # Requirements for authorization_code grant type
9
+ :redirect_uri,
10
+ # Requirements for password grant type
11
+ :username, :password
12
+ ]
13
+
14
+ require File.expand_path('../configuration/yaml', __FILE__)
5
15
 
6
16
  DEFAULT_API_KEY = nil
7
17
  DEFAULT_API_SECRET = nil
@@ -0,0 +1,81 @@
1
+ require 'erb'
2
+ module FlexmlsApi
3
+ module Configuration
4
+ class YamlConfig
5
+ KEY_CONFIGURATIONS = VALID_OPTION_KEYS + [:oauth2] + OAUTH2_KEYS
6
+
7
+ attr_accessor *KEY_CONFIGURATIONS
8
+ attr_reader :client_keys, :oauth2_keys
9
+
10
+ def initialize(filename=nil)
11
+ @client_keys = {}
12
+ @oauth2_keys = {}
13
+ @oauth2 = false
14
+ load_file(filename) unless filename.nil?()
15
+ end
16
+ def load_file(file)
17
+ @client_keys = {}
18
+ @oauth2_keys = {}
19
+ @file = file
20
+ @name = File.basename(file, ".yml")
21
+ config = YAML.load(ERB.new(File.read(file)).result)[api_env]
22
+ config.each do |key,val|
23
+ sym = key.to_sym
24
+ if KEY_CONFIGURATIONS.include? sym
25
+ self.send("#{sym}=", val)
26
+ if VALID_OPTION_KEYS.include?(sym)
27
+ @client_keys[sym] = val
28
+ elsif OAUTH2_KEYS.include?(sym)
29
+ @oauth2_keys[sym] = val
30
+ end
31
+ end
32
+ end
33
+ rescue => e
34
+ FlexmlsApi.logger().error("Unable to load config file #{file}[#{api_env}]")
35
+ raise e
36
+ end
37
+
38
+ def oauth2?
39
+ return oauth2 == true
40
+ end
41
+
42
+ def name
43
+ @name
44
+ end
45
+ def api_env
46
+ current_env = "development"
47
+ if env.include?("FLEXMLS_API_ENV")
48
+ current_env = env["FLEXMLS_API_ENV"]
49
+ elsif env.include?("RAILS_ENV")
50
+ current_env = env["RAILS_ENV"]
51
+ end
52
+ return current_env
53
+ end
54
+
55
+ # Used to specify the root of where to look for flexmlsApi config files
56
+ def self.config_path
57
+ "config/flexmls_api"
58
+ end
59
+
60
+ def self.config_keys()
61
+ files = Dir["#{config_path}/*.yml"]
62
+ files.map {|f| File.basename(f,".yml") }
63
+ end
64
+
65
+ def self.exists?(name)
66
+ File.exists? "#{config_path}/#{name}.yml"
67
+ end
68
+
69
+ def self.build(name)
70
+ yaml = YamlConfig.new("#{config_path}/#{name}.yml")
71
+ end
72
+
73
+ protected
74
+ def env
75
+ ENV
76
+ end
77
+
78
+ end
79
+ end
80
+ end
81
+