v2_intuity 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +3 -3
  3. data/bin/console +3 -3
  4. data/lib/requirements.rb +16 -12
  5. data/lib/v2_intuity/clients/client.rb +114 -0
  6. data/lib/v2_intuity/clients/rest_api.rb +15 -0
  7. data/lib/v2_intuity/clients/stream_api.rb +12 -0
  8. data/lib/v2_intuity/endpoints/endpoint.rb +4 -0
  9. data/lib/v2_intuity/endpoints/stream.rb +7 -1
  10. data/lib/v2_intuity/endpoints/user.rb +1 -0
  11. data/lib/v2_intuity/query_filters/access_token.rb +10 -0
  12. data/lib/v2_intuity/{filters → query_filters}/asc_created_at.rb +2 -2
  13. data/lib/v2_intuity/{filters → query_filters}/asc_updated_at.rb +2 -2
  14. data/lib/v2_intuity/{filters → query_filters}/date.rb +2 -2
  15. data/lib/v2_intuity/{filters → query_filters}/dec_created_at.rb +2 -2
  16. data/lib/v2_intuity/{filters → query_filters}/dec_updated_at.rb +2 -2
  17. data/lib/v2_intuity/{filters → query_filters}/end_date.rb +2 -2
  18. data/lib/v2_intuity/query_filters/filter.rb +22 -0
  19. data/lib/v2_intuity/query_filters/format_redirect.rb +10 -0
  20. data/lib/v2_intuity/{filters → query_filters}/sort.rb +3 -3
  21. data/lib/v2_intuity/query_filters/source.rb +10 -0
  22. data/lib/v2_intuity/{filters → query_filters}/start_date.rb +2 -2
  23. data/lib/v2_intuity/resource_filters/measurement.rb +9 -0
  24. data/lib/v2_intuity/resource_filters/nutrition.rb +9 -0
  25. data/lib/v2_intuity/resource_filters/resource_filter.rb +19 -0
  26. data/lib/v2_intuity/resource_filters/sleep.rb +9 -0
  27. data/lib/v2_intuity/resource_filters/summary.rb +9 -0
  28. data/lib/v2_intuity/resource_filters/workout.rb +9 -0
  29. data/lib/v2_intuity/streams/stream.rb +36 -9
  30. data/lib/v2_intuity/users/user.rb +29 -26
  31. data/lib/v2_intuity/version.rb +1 -1
  32. data/lib/v2_intuity.rb +11 -7
  33. data/v2_intuity.gemspec +12 -13
  34. metadata +22 -15
  35. data/lib/v2_intuity/client.rb +0 -118
  36. data/lib/v2_intuity/filters/access_token.rb +0 -10
  37. data/lib/v2_intuity/filters/filter.rb +0 -22
  38. data/lib/v2_intuity/filters/format_redirect.rb +0 -10
  39. data/lib/v2_intuity/filters/resource_filters.rb +0 -20
  40. data/lib/v2_intuity/filters/source.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 13104922bec089e414562de76b22ac3d7203beaf
4
- data.tar.gz: 5aa9f094fb011b2476e7a3ef0c83f3acb52d3168
3
+ metadata.gz: b0d724b6101183d0b427d9d0dfd8d2bf28bf6301
4
+ data.tar.gz: 5cb7ee9ae865c8e62e7a39b70a65d042c371be8c
5
5
  SHA512:
6
- metadata.gz: b2997175def3a560cd3585fb49d032d34a5aa53f89a869d7bae4850eceb358f84341c41bea2606a4e31d22bb1d72071b831a139df80b9fa797f3d95b194bb137
7
- data.tar.gz: 3937dd0f96c57d44804cdb683c61f60b46740ce9c175eeb528a6ef16d6e40d5a18dcccf18db32c6b4f328049dd8dd9d11a9deb4c3e6d6ba812c9861adb682321
6
+ metadata.gz: 75561a970b89a7afa5e046570086a8a539451b4019c5adc07505d0b1574142c650f7c7949bfdcd3dea796c4ea65a5d3f886aea16edb40662cfc486af4a1c93c9
7
+ data.tar.gz: cf798fe739a306d91cfe4ffafda82e13fd3afddcf4d4134b4ebac74569c4ef962fe88f44ead865e7d5ca3efb1bdd1ddc6f758dbda2f72f8aad4a2112eb0fd9d2
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task default: :spec
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "v2_intuity"
3
+ require 'bundler/setup'
4
+ require 'v2_intuity'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +10,5 @@ require "v2_intuity"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ require 'irb'
14
14
  IRB.start(__FILE__)
data/lib/requirements.rb CHANGED
@@ -1,17 +1,21 @@
1
- require "v2_intuity/client"
2
- require "v2_intuity/request_error"
3
- require "v2_intuity/response"
4
- require "v2_intuity/request"
5
- require "v2_intuity/version"
6
- require "v2_intuity/filters/filter"
7
- require "v2_intuity/endpoints/endpoint"
8
- require "v2_intuity/filters/sort"
9
- require "v2_intuity/filters/date"
10
- require "v2_intuity/headers/header"
1
+ require 'v2_intuity/clients/client'
2
+ require 'v2_intuity/request_error'
3
+ require 'v2_intuity/response'
4
+ require 'v2_intuity/request'
5
+ require 'v2_intuity/version'
6
+ require 'v2_intuity/query_filters/filter'
7
+ require 'v2_intuity/endpoints/endpoint'
8
+ require 'v2_intuity/query_filters/sort'
9
+ require 'v2_intuity/query_filters/date'
10
+ require 'v2_intuity/headers/header'
11
+ require 'v2_intuity/resource_filters/resource_filter'
11
12
 
12
13
  ROOT = File.dirname(File.expand_path(File.dirname(__FILE__))).freeze
13
14
 
14
- Dir["#{ROOT}/lib/v2_intuity/endpoints/*.rb"].each { |file| require file unless file =~ /endpoint.rb/}
15
- Dir["#{ROOT}/lib/v2_intuity/filters/*.rb"].each { |file| require file unless file =~ /filter.rb|sort.rb|date.rb/ }
15
+ Dir["#{ROOT}/lib/v2_intuity/clients/*.rb"].each { |file| require file unless file =~ /client.rb/ }
16
+ Dir["#{ROOT}/lib/v2_intuity/endpoints/*.rb"].each { |file| require file unless file =~ /endpoint.rb/ }
17
+ Dir["#{ROOT}/lib/v2_intuity/query_filters/*.rb"].each { |file| require file unless file =~ /query_filter.rb|sort.rb|date.rb/ }
16
18
  Dir["#{ROOT}/lib/v2_intuity/headers/*.rb"].each { |file| require file unless file =~ /header.rb/ }
19
+ Dir["#{ROOT}/lib/v2_intuity/streams/*.rb"].each { |file| require file }
20
+ Dir["#{ROOT}/lib/v2_intuity/resource_filters/*.rb"].each { |file| require file unless file =~ /resource_filter.rb/ }
17
21
  Dir["#{ROOT}/lib/v2_intuity/users/*.rb"].each { |file| require file }
@@ -0,0 +1,114 @@
1
+ require 'httparty'
2
+ module V2Intuity
3
+ module Clients
4
+ class Client
5
+ attr_accessor :token, :org_id, :accept,
6
+ :content_type, :base_uri,
7
+ :httparty_client
8
+
9
+ def initialize(attributes = {})
10
+ @token = attributes[:token]
11
+ raise 'Client requires token' unless @token
12
+
13
+ @base_uri = attributes.fetch(:base_uri, nil)
14
+ @accept = attributes.fetch(:accept, 'application/json')
15
+ @content_type = attributes.fetch(:content_type, 'application/json')
16
+ end
17
+
18
+ def send_request(request)
19
+ case request.method
20
+ when V2Intuity::Request::METHODS[:get], V2Intuity::Request::METHODS[:delete]
21
+ @httparty_client.send(request.method.to_sym, request.uri, query: request.options[:query_filters], headers: request.options[:headers]) # puts re.request.last_uri.to_s
22
+
23
+ when V2Intuity::Request::METHODS[:post], V2Intuity::Request::METHODS[:put]
24
+ @httparty_client.send(request.method.to_sym, request.uri, query: request.options[:query_filters],
25
+ body: request.options[:body].to_json,
26
+ headers: request.options[:headers])
27
+ end
28
+ end
29
+
30
+ def build_and_send_request(endpoint, options = {})
31
+ @request = build_request(endpoint, options)
32
+ send_request_generate_response(@request)
33
+ end
34
+
35
+ def build_request(endpoint, options = {})
36
+ http_party_options = {}
37
+ @query_filters = {}
38
+ @headers = {}
39
+
40
+ method = options[:method].to_s.nil? ? V2Intuity::Request::METHODS[:get] : options[:method]
41
+ id = options[:id].to_s.nil? ? nil : options[:id]
42
+
43
+ query_filters, headers = combine_query_filters_and_headers(options)
44
+
45
+ http_party_options[:query_filters] = query_filters
46
+ http_party_options[:headers] = headers
47
+ http_party_options[:body] = options[:body] unless method == V2Intuity::Request::METHODS[:get]
48
+
49
+ uri = endpoint.uri(org_id: org_id, id: id, base_uri: base_uri)
50
+
51
+ V2Intuity::Request.new(method: method, uri: uri, options: http_party_options)
52
+ end
53
+
54
+ def send_request_generate_response(request)
55
+ response = V2Intuity::Response.new(request: request)
56
+
57
+ self.httparty_client ||= HTTParty
58
+
59
+ response.define_response_and_json(send_request(request))
60
+
61
+ return response if response.response.success?
62
+
63
+ error = build_error(response)
64
+
65
+ response.add_errors(error)
66
+
67
+ response
68
+
69
+ rescue StandardError => e
70
+ response.add_errors(RequestError.new(code: 400, message: e.message))
71
+
72
+ response
73
+ end
74
+
75
+ private
76
+
77
+ def build_error(response)
78
+ json = response.g_json
79
+ if json
80
+ V2Intuity::RequestError.new(code: response.code, message: response.message, description: json['message'])
81
+ else
82
+ V2Intuity::RequestError.new(code: response.code, message: response.message)
83
+ end
84
+ end
85
+
86
+ def default_query_filters
87
+ [V2Intuity::QueryFilters::AccessToken.new(value: @token)]
88
+ end
89
+
90
+ def default_headers
91
+ [V2Intuity::Headers::Accept.new(value: @accept), V2Intuity::Headers::ContentType.new(value: @content_type)]
92
+ end
93
+
94
+ def combine_query_filters_and_headers(options)
95
+ total_query_filters = {}
96
+ total_headers = {}
97
+ filter_array = options[:query_filters].is_a?(Array) ? options[:query_filters] : []
98
+ header_array = options[:headers].is_a?(Array) ? options[:headers] : []
99
+
100
+ unique_query_filters = (default_query_filters + filter_array)
101
+ unique_query_filters.each do |filter|
102
+ total_query_filters.merge!(filter.to_hash)
103
+ end
104
+
105
+ unique_headers = (default_headers + header_array)
106
+ unique_headers.each do |header|
107
+ total_headers.merge!(header.to_hash)
108
+ end
109
+
110
+ [total_query_filters, total_headers]
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,15 @@
1
+ module V2Intuity
2
+ module Clients
3
+ class RestApi < Client
4
+ def initialize(options = {})
5
+ super
6
+ @base_uri = options[:rest_uri]
7
+
8
+ raise 'RestApi Client requires rest_uri' unless @base_uri
9
+
10
+ @org_id = options[:org_id]
11
+ raise 'Client requires org_id' unless @org_id
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ module V2Intuity
2
+ module Clients
3
+ class StreamApi < Client
4
+ def initialize(options = {})
5
+ super
6
+ @base_uri = options[:stream_uri]
7
+
8
+ raise 'Stream Api Client requires stream_uri' unless @base_uri
9
+ end
10
+ end
11
+ end
12
+ end
@@ -25,9 +25,13 @@ module V2Intuity
25
25
  end
26
26
 
27
27
  def uri_options(options = {})
28
+ puts "whatt the hell"
28
29
  @base_uri ||= options[:base_uri]
29
30
  @org_id ||= options[:org_id]
30
31
  @id ||= options[:id]
32
+
33
+ raise 'org_id is needed' unless @org_id
34
+ raise 'base_uri is needed' unless @base_uri
31
35
  end
32
36
 
33
37
  def sign_with
@@ -2,6 +2,9 @@ module V2Intuity
2
2
  module Endpoints
3
3
  class Stream < Endpoint
4
4
  def initialize(options = {})
5
+ super
6
+ @org_id = nil
7
+ @path = nil
5
8
  @base_uri = options[:stream_uri]
6
9
  @endpoint = Endpoint::ENDPOINTS[:streams]
7
10
  end
@@ -16,8 +19,11 @@ module V2Intuity
16
19
  end
17
20
 
18
21
  def uri_options(options = {})
19
- @base_uri ||= options[:stream_uri]
22
+
23
+ @base_uri ||= options[:base_uri]
20
24
  @id ||= options[:id]
25
+
26
+ raise 'base_uri is needed' unless @base_uri
21
27
  end
22
28
  end
23
29
  end
@@ -3,6 +3,7 @@ module V2Intuity
3
3
  class User < Endpoint
4
4
  def initialize(options = {})
5
5
  super
6
+
6
7
  @endpoint = Endpoint::ENDPOINTS[:users]
7
8
  end
8
9
 
@@ -0,0 +1,10 @@
1
+ module V2Intuity
2
+ module QueryFilters
3
+ class AccessToken < QueryFilter
4
+ def initialize(options = {})
5
+ super
6
+ @name = QueryFilter::QUERY_FILTERS[:access_token]
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,9 +1,9 @@
1
1
  module V2Intuity
2
- module Filters
2
+ module QueryFilters
3
3
  class AscCreatedAt < Sort
4
4
  def initialize(options = {})
5
5
  super
6
- @value = Filter::Sort::SORT[:asc_created_at]
6
+ @value = QueryFilter::Sort::SORT[:asc_created_at]
7
7
  end
8
8
  end
9
9
  end
@@ -1,9 +1,9 @@
1
1
  module V2Intuity
2
- module Filters
2
+ module QueryFilters
3
3
  class AscUpdatedAt < Sort
4
4
  def initialize(options = {})
5
5
  super
6
- @value = Filter::Sort::SORT[:asc_updated_at]
6
+ @value = QueryFilter::Sort::SORT[:asc_updated_at]
7
7
  end
8
8
  end
9
9
  end
@@ -1,6 +1,6 @@
1
1
  module V2Intuity
2
- module Filters
3
- class Date < Filter
2
+ module QueryFilters
3
+ class Date < QueryFilter
4
4
  def initialize(options = {})
5
5
  super
6
6
  @value = DateTime.iso8601(options[:value])
@@ -1,9 +1,9 @@
1
1
  module V2Intuity
2
- module Filters
2
+ module QueryFilters
3
3
  class DecCreatedAt < Sort
4
4
  def initialize(options = {})
5
5
  super
6
- @value = Filter::Sort::SORT[:dec_created_at]
6
+ @value = QueryFilter::Sort::SORT[:dec_created_at]
7
7
  end
8
8
  end
9
9
  end
@@ -1,9 +1,9 @@
1
1
  module V2Intuity
2
- module Filters
2
+ module QueryFilters
3
3
  class DecUpdatedAt < Sort
4
4
  def initialize(options = {})
5
5
  super
6
- @value = Filter::Sort::SORT[:dec_updated_at]
6
+ @value = QueryFilter::Sort::SORT[:dec_updated_at]
7
7
  end
8
8
  end
9
9
  end
@@ -1,9 +1,9 @@
1
1
  module V2Intuity
2
- module Filters
2
+ module QueryFilters
3
3
  class EndDate < Date
4
4
  def initialize(options = {})
5
5
  super
6
- @name = Filter::FIRTERS[:end_date_filter]
6
+ @name = QueryFilter::FIRTERS[:end_date_filter]
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,22 @@
1
+ module V2Intuity
2
+ module QueryFilters
3
+ class QueryFilter
4
+ attr_accessor :name, :value
5
+
6
+ QUERY_FILTERS = { access_token: 'token', source: 'source',
7
+ start_filter: 'start_date_filter',
8
+ end_filter: 'end_date_filter',
9
+ format_redirect: 'format',
10
+ sort: 'sort' }.freeze
11
+
12
+ def initialize(options = {})
13
+ @name = options[:name]
14
+ @value = options[:value]
15
+ end
16
+
17
+ def to_hash
18
+ { @name.to_sym => @value }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,10 @@
1
+ module V2Intuity
2
+ module QueryFilters
3
+ class FormatRedirect < QueryFilter
4
+ def initialize(options = {})
5
+ super
6
+ @name = QueryFilter::QUERY_FILTERS[:format_redirect]
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,12 +1,12 @@
1
1
  module V2Intuity
2
- module Filters
3
- class Sort < Filter
2
+ module QueryFilters
3
+ class Sort < QueryFilter
4
4
  SORT = { dec_updated_at: '-updated_at', asc_updated_at: 'updated_at',
5
5
  dec_created_at: '-created_at', asc_created_at: 'created_at' }.freeze
6
6
 
7
7
  def initialize(options = {})
8
8
  super
9
- @name = Filter::FILTERS[:sort]
9
+ @name = QueryFilter::QUERY_FILTERS[:sort]
10
10
  end
11
11
  end
12
12
  end
@@ -0,0 +1,10 @@
1
+ module V2Intuity
2
+ module QueryFilters
3
+ class Source < QueryFilter
4
+ def initialize(options = {})
5
+ super
6
+ @name = QueryFilter::QUERY_FILTERS[:source]
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,9 +1,9 @@
1
1
  module V2Intuity
2
- module Filters
2
+ module QueryFilters
3
3
  class StartDate < Date
4
4
  def initialize(options = {})
5
5
  super
6
- @name = Filter::FIRTERS[:start_date_filter]
6
+ @name = QueryFilter::FIRTERS[:start_date_filter]
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,9 @@
1
+ module V2Intuity
2
+ module ResourceFilters
3
+ class Measurement < ResourceFilter
4
+ def initialize(_options = {})
5
+ @name = ResourceFilter::FILTERS[:measurement]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module V2Intuity
2
+ module ResourceFilters
3
+ class Nutrition < ResourceFilter
4
+ def initialize(_options = {})
5
+ @name = ResourceFilter::FILTERS[:nutrition]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,19 @@
1
+ module V2Intuity
2
+ module ResourceFilters # Stream resource query_filters that indicate what kind of data to be returned by stream. These are added to the body of the POST create stream endpoint
3
+ class ResourceFilter
4
+ attr_accessor :name
5
+
6
+ FILTERS = { measurement: 'measurement', nutrition: 'nutrition',
7
+ sleep: 'sleep', summaries: 'summaries',
8
+ workout: 'workout' }.freeze
9
+
10
+ def initialize(options = {})
11
+ @name = options.fetch(options[:name], nil)
12
+
13
+ raise 'unsupported filter' unless @name.nil? && FILTERS.key?(@name.to_sym)
14
+ end
15
+
16
+ attr_reader :name
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ module V2Intuity
2
+ module ResourceFilters
3
+ class Sleep < ResourceFilter
4
+ def initialize(_options = {})
5
+ @name = ResourceFilter::FILTERS[:sleep]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module V2Intuity
2
+ module ResourceFilters
3
+ class Summary < ResourceFilter
4
+ def initialize(_options = {})
5
+ @name = ResourceFilter::FILTERS[:summaries]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module V2Intuity
2
+ module ResourceFilters
3
+ class Workout < ResourceFilter
4
+ def initialize(_options = {})
5
+ @name = ResourceFilter::FILTERS[:workout]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -5,39 +5,66 @@ module V2Intuity
5
5
 
6
6
  def initialize(options = {})
7
7
  @name = options[:name]
8
- @start_date = options.fetch(:start_date, Time.now.strftime('%Y-%d-%m'))
9
- filters = options.fetch(:resource_filters, [])
10
- @resource_filters = filters.is_a?(Array) ? filters : []
8
+ @start_date = options.fetch(:start_date, Time.now.strftime('%Y-%m-%d'))
9
+
10
+ @resource_filters = format_resource_filters(options.fetch(:resource_filters, nil))
11
11
  @stream_id = options[:stream_id]
12
12
  end
13
13
 
14
- def send_request(method, client = V2Intuity::Client.new)
14
+ def send_request(method, client)
15
+ return 'StreamApi client is requied' unless client.class == V2Intuity::Clients::StreamApi
16
+
15
17
  endpoint, options = build_options(method)
16
18
  client.build_and_send_request(endpoint, options)
17
19
  end
18
20
 
19
- def build_options(method, filters = [])
21
+ private
22
+
23
+ def build_options(method, query_filters = [])
20
24
  case method
21
25
  when V2Intuity::Request::METHODS[:delete]
22
- raise 'stream id is needed' unless @stream_id
26
+ raise 'stream id is needed' unless stream_id
23
27
  options = { method: method, id: stream_id }
28
+
24
29
  when V2Intuity::Request::METHODS[:get]
25
30
  options = { method: method, id: stream_id }.compact # id can be blank when getting all streams
31
+
26
32
  when V2Intuity::Request::METHODS[:post]
33
+ raise 'name is required' unless name
27
34
  body = { name: name, start_date: start_date,
28
- resource_filters: resource_filters } # supported resource_filters include measurement, nutrition, sleep, workout
35
+ resource_filters: resource_filters }.compact # supported resource_query_filters include measurement, nutrition, sleep, workout
29
36
  options = { method: method, body: body.compact }
37
+
30
38
  when V2Intuity::Request::METHODS[:put]
31
- raise 'stream id is needed' unless @stream_id
39
+ raise 'stream id is needed' unless stream_id
32
40
  body = { name: name }
33
41
  options = { method: method, body: body.compact, id: stream_id }
42
+
34
43
  else
35
44
  raise 'incorrect method verb'
45
+
36
46
  end
37
- options[:filters] = filters if !filters.to_s.nil?
47
+ options[:query_filters] = query_filters unless query_filters.to_s.nil?
38
48
 
39
49
  [V2Intuity::Endpoints::Stream.new, options]
40
50
  end
51
+
52
+ def format_resource_filters(filters)
53
+ return nil unless filters
54
+
55
+ filters = filters.is_a?(Array) ? filters : [filters]
56
+
57
+ filters.each do |filter|
58
+ filter_class = filter.class
59
+ next if filter_class < V2Intuity::ResourceFilters::ResourceFilter || filter_class == V2Intuity::ResourceFilters::ResourceFilter
60
+ raise 'unsupported filter'
61
+ end
62
+
63
+ filter_array = []
64
+ filters.each { |filter| filter_array << filter.name }
65
+
66
+ filter_array.uniq
67
+ end
41
68
  end
42
69
  end
43
70
  end
@@ -11,31 +11,11 @@ module V2Intuity
11
11
  @country_code = options.fetch(:country_code, nil)
12
12
  end
13
13
 
14
- def send_request(method)
14
+ def send_request(method, client)
15
15
  endpoint, options = build_options(method)
16
16
  client.build_and_send_request(endpoint, options)
17
17
  end
18
18
 
19
- def build_options(method, filters = [])
20
- raise 'uid is required' unless uid
21
-
22
- case method
23
- when V2Intuity::Request::METHODS[:delete], V2Intuity::Request::METHODS[:get]
24
- options = { method: method, id: uid }
25
- when V2Intuity::Request::METHODS[:post]
26
- body = { id: uid, location: { timezone: time_zone, country_code: country_code }.compact }
27
- options = { method: method, body: body.compact }
28
- when V2Intuity::Request::METHODS[:put]
29
- body = { location: { timezone: time_zone, country_code: country_code }.compact }
30
- options = { method: method, body: body.compact, id: uid }
31
- else
32
- raise 'incorrect method verb'
33
- end
34
- options[:filters] = filters unless filters.to_s.nil?
35
-
36
- [V2Intuity::Endpoints::User.new, options]
37
- end
38
-
39
19
  # method refreshes marketplace user token.
40
20
  def refresh_marketplace(client)
41
21
  raise 'uid is required' unless uid
@@ -55,17 +35,40 @@ module V2Intuity
55
35
  client.build_and_send_request(endpoint, options)
56
36
  end
57
37
 
38
+ private
39
+
58
40
  def build_options_marketplace(token, format_redirect, redirect_uri) # marketplace user defined token
59
- filters = []
60
- filters << V2Intuity::Filters::AccessToken.new(value: token)
61
- filters << V2Intuity::Filters::FormatRedirect.new(value: format_redirect)
41
+ query_filters = []
42
+ query_filters << V2Intuity::QueryFilters::AccessToken.new(value: token)
43
+ query_filters << V2Intuity::QueryFilters::FormatRedirect.new(value: format_redirect)
62
44
 
63
- options = { filters: filters, method: V2Intuity::Request::METHODS[:get] }
45
+ options = { query_filters: query_filters, method: V2Intuity::Request::METHODS[:get] }
64
46
  endpoint = V2Intuity::Endpoints::Marketplace.new
65
- endpoint.define_redirect_uri(redirect_uri)
47
+ endpoint.define_redirect_uri(redirect_uri) ## overrides client's base_uri
66
48
 
67
49
  [endpoint, options]
68
50
  end
51
+
52
+
53
+ def build_options(method, query_filters = [])
54
+ raise 'uid is required' unless uid
55
+
56
+ case method
57
+ when V2Intuity::Request::METHODS[:delete], V2Intuity::Request::METHODS[:get]
58
+ options = { method: method, id: uid }
59
+ when V2Intuity::Request::METHODS[:post]
60
+ body = { uid: uid, location: { timezone: time_zone, country_code: country_code }.compact }
61
+ options = { method: method, body: body.compact }
62
+ when V2Intuity::Request::METHODS[:put]
63
+ body = { location: { timezone: time_zone, country_code: country_code }.compact }
64
+ options = { method: method, body: body.compact, id: uid }
65
+ else
66
+ raise 'incorrect method verb'
67
+ end
68
+ options[:query_filters] = query_filters unless query_filters.to_s.nil?
69
+
70
+ [V2Intuity::Endpoints::User.new, options]
71
+ end
69
72
  end
70
73
  end
71
74
  end
@@ -1,3 +1,3 @@
1
1
  module V2Intuity
2
- VERSION = '1.0.0'.freeze
2
+ VERSION = '1.0.1'.freeze
3
3
  end
data/lib/v2_intuity.rb CHANGED
@@ -1,13 +1,17 @@
1
1
  require 'requirements'
2
2
 
3
3
  module V2Intuity
4
- class << self
5
- attr_accessor :base_uri, :token,
6
- :stream_uri, :org_id
4
+ include V2Intuity::Clients
5
+ include V2Intuity::Users
6
+ include V2Intuity::Streams
7
7
 
8
- def configure
9
- yield self
10
- true
11
- end
8
+ class << self
9
+ attr_accessor :rest_uri, :token,
10
+ :stream_uri, :org_id
11
+
12
+ def configure
13
+ yield self
14
+ true
12
15
  end
16
+ end
13
17
  end
data/v2_intuity.gemspec CHANGED
@@ -4,26 +4,25 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'v2_intuity/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "v2_intuity"
7
+ spec.name = 'v2_intuity'
8
8
  spec.version = V2Intuity::VERSION
9
- spec.authors = ["rruiz858"]
10
- spec.email = ["rruiz@ncsu.edu"]
9
+ spec.authors = ['rruiz858']
10
+ spec.email = ['rruiz@ncsu.edu']
11
11
 
12
- spec.summary = "V2Intuity is a ruby wrapper to connecting to the new V2Intuity platform"
12
+ spec.summary = 'V2Intuity is a ruby wrapper to connecting to the new V2Intuity platform'
13
13
  spec.description = "Wrapper allows one to manage V2Intuity's Rest API and even create/update/delete Streams. This is a work in progess and will not work, use other validic gem"
14
- spec.homepage = ""
15
- spec.license = "MIT"
16
-
14
+ spec.homepage = ''
15
+ spec.license = 'MIT'
17
16
 
18
17
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
18
  f.match(%r{^(test|spec|features)/})
20
19
  end
21
- spec.bindir = "exe"
20
+ spec.bindir = 'exe'
22
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
- spec.require_paths = ["lib"]
22
+ spec.require_paths = ['lib']
24
23
 
25
- spec.add_development_dependency "bundler", "~> 1.14"
26
- spec.add_development_dependency "rake", "~> 10.0"
27
- spec.add_development_dependency "rspec", "~> 3.0"
28
- spec.add_dependency "httparty", "~> 0.14.0"
24
+ spec.add_development_dependency 'bundler', '~> 1.14'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec', '~> 3.0'
27
+ spec.add_dependency 'httparty', '~> 0.14.0'
29
28
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: v2_intuity
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - rruiz858
@@ -86,7 +86,9 @@ files:
86
86
  - bin/setup
87
87
  - lib/requirements.rb
88
88
  - lib/v2_intuity.rb
89
- - lib/v2_intuity/client.rb
89
+ - lib/v2_intuity/clients/client.rb
90
+ - lib/v2_intuity/clients/rest_api.rb
91
+ - lib/v2_intuity/clients/stream_api.rb
90
92
  - lib/v2_intuity/endpoints/endpoint.rb
91
93
  - lib/v2_intuity/endpoints/marketplace.rb
92
94
  - lib/v2_intuity/endpoints/measurement.rb
@@ -96,24 +98,29 @@ files:
96
98
  - lib/v2_intuity/endpoints/summary.rb
97
99
  - lib/v2_intuity/endpoints/user.rb
98
100
  - lib/v2_intuity/endpoints/workout.rb
99
- - lib/v2_intuity/filters/access_token.rb
100
- - lib/v2_intuity/filters/asc_created_at.rb
101
- - lib/v2_intuity/filters/asc_updated_at.rb
102
- - lib/v2_intuity/filters/date.rb
103
- - lib/v2_intuity/filters/dec_created_at.rb
104
- - lib/v2_intuity/filters/dec_updated_at.rb
105
- - lib/v2_intuity/filters/end_date.rb
106
- - lib/v2_intuity/filters/filter.rb
107
- - lib/v2_intuity/filters/format_redirect.rb
108
- - lib/v2_intuity/filters/resource_filters.rb
109
- - lib/v2_intuity/filters/sort.rb
110
- - lib/v2_intuity/filters/source.rb
111
- - lib/v2_intuity/filters/start_date.rb
112
101
  - lib/v2_intuity/headers/accept.rb
113
102
  - lib/v2_intuity/headers/content_type.rb
114
103
  - lib/v2_intuity/headers/header.rb
104
+ - lib/v2_intuity/query_filters/access_token.rb
105
+ - lib/v2_intuity/query_filters/asc_created_at.rb
106
+ - lib/v2_intuity/query_filters/asc_updated_at.rb
107
+ - lib/v2_intuity/query_filters/date.rb
108
+ - lib/v2_intuity/query_filters/dec_created_at.rb
109
+ - lib/v2_intuity/query_filters/dec_updated_at.rb
110
+ - lib/v2_intuity/query_filters/end_date.rb
111
+ - lib/v2_intuity/query_filters/filter.rb
112
+ - lib/v2_intuity/query_filters/format_redirect.rb
113
+ - lib/v2_intuity/query_filters/sort.rb
114
+ - lib/v2_intuity/query_filters/source.rb
115
+ - lib/v2_intuity/query_filters/start_date.rb
115
116
  - lib/v2_intuity/request.rb
116
117
  - lib/v2_intuity/request_error.rb
118
+ - lib/v2_intuity/resource_filters/measurement.rb
119
+ - lib/v2_intuity/resource_filters/nutrition.rb
120
+ - lib/v2_intuity/resource_filters/resource_filter.rb
121
+ - lib/v2_intuity/resource_filters/sleep.rb
122
+ - lib/v2_intuity/resource_filters/summary.rb
123
+ - lib/v2_intuity/resource_filters/workout.rb
117
124
  - lib/v2_intuity/response.rb
118
125
  - lib/v2_intuity/streams/stream.rb
119
126
  - lib/v2_intuity/users/user.rb
@@ -1,118 +0,0 @@
1
- require 'httparty'
2
- module V2Intuity
3
- class Client
4
- attr_accessor :token, :org_id, :accept,
5
- :content_type, :base_uri,
6
- :httparty_client
7
-
8
- def initialize(attributes = {})
9
- required_fields(attributes)
10
- @accept = attributes.fetch(:accept, 'application/json')
11
- @content_type = attributes.fetch(:content_type, 'application/json')
12
- end
13
-
14
- def send_request(request)
15
- case request.method
16
- when V2Intuity::Request::METHODS[:get], V2Intuity::Request::METHODS[:delete]
17
- @httparty_client.send(request.method.to_sym, request.uri, query: request.options[:filters], headers: request.options[:headers]) # puts re.request.last_uri.to_s
18
-
19
- when V2Intuity::Request::METHODS[:post], V2Intuity::Request::METHODS[:put]
20
- @httparty_client.send(request.method.to_sym, request.uri, query: request.options[:filters],
21
- body: request.options[:body].to_json,
22
- headers: request.options[:headers])
23
- end
24
- end
25
-
26
- def build_and_send_request(endpoint, options = {})
27
- @request = build_request(endpoint, options)
28
- send_request_generate_response(@request)
29
- end
30
-
31
- def build_request(endpoint, options = {})
32
- http_party_options = {}
33
- @filters = {}
34
- @headers = {}
35
-
36
- method = options[:method].to_s.nil? ? V2Intuity::Request::METHODS[:get] : options[:method]
37
- id = options[:id].to_s.nil? ? nil : options[:id]
38
-
39
- filters, headers = combine_filters_and_headers(options)
40
-
41
- http_party_options[:filters] = filters
42
- http_party_options[:headers] = headers
43
- http_party_options[:body] = options[:body] unless method == V2Intuity::Request::METHODS[:get]
44
- uri = endpoint.uri(org_id: org_id, id: id, base_uri: base_uri)
45
-
46
- V2Intuity::Request.new(method: method, uri: uri, options: http_party_options)
47
- end
48
-
49
- def send_request_generate_response(request)
50
- response = V2Intuity::Response.new(request: request)
51
-
52
- self.httparty_client ||= HTTParty
53
- response.define_response_and_json(send_request(request))
54
-
55
- return response if response.response.success?
56
-
57
- error = build_error(response)
58
-
59
- response.add_errors(error)
60
-
61
- response
62
-
63
- rescue StandardError => e
64
- response.add_errors(RequestError.new(code: 400, message: e.message))
65
-
66
- response
67
- end
68
-
69
- private
70
-
71
- def build_error(response)
72
- json = response.json
73
- if json
74
- V2Intuity::RequestError.new(code: response.code, message: response.message, description: json['message'])
75
- else
76
- V2Intuity::RequestError.new(code: response.code, message: response.message)
77
- end
78
- end
79
-
80
- def required_fields(attributes)
81
- @token = attributes[:token]
82
- raise 'Client requires token' unless @token
83
-
84
- @org_id = attributes[:org_id]
85
- raise 'Client requires org_id' unless @org_id
86
-
87
- @base_uri = attributes[:base_uri]
88
- raise 'Client requires base_uri' unless @base_uri
89
- end
90
-
91
- def default_filters
92
- [V2Intuity::Filters::AccessToken.new(value: @token)]
93
- end
94
-
95
- def default_headers
96
- [V2Intuity::Headers::Accept.new(value: @accept), V2Intuity::Headers::ContentType.new(value: @content_type)]
97
- end
98
-
99
- def combine_filters_and_headers(options)
100
- total_filters = {}
101
- total_headers = {}
102
- filter_array = options[:filters].is_a?(Array) ? options[:filters] : []
103
- header_array = options[:headers].is_a?(Array) ? options[:headers] : []
104
-
105
- unique_filters = (default_filters + filter_array)
106
- unique_filters.each do |filter|
107
- total_filters.merge!(filter.to_hash)
108
- end
109
-
110
- unique_headers = (default_headers + header_array)
111
- unique_headers.each do |header|
112
- total_headers.merge!(header.to_hash)
113
- end
114
-
115
- [total_filters, total_headers]
116
- end
117
- end
118
- end
@@ -1,10 +0,0 @@
1
- module V2Intuity
2
- module Filters
3
- class AccessToken < Filter
4
- def initialize(options = {})
5
- super
6
- @name = Filter::FILTERS[:access_token]
7
- end
8
- end
9
- end
10
- end
@@ -1,22 +0,0 @@
1
- module V2Intuity
2
- module Filters
3
- class Filter
4
- attr_accessor :name, :value
5
-
6
- FILTERS = { access_token: 'token', source: 'source',
7
- start_filter: 'start_date_filter',
8
- end_filter: 'end_date_filter',
9
- format_redirect: 'format',
10
- sort: 'sort' }.freeze
11
-
12
- def initialize(options = {})
13
- @name = options[:name]
14
- @value = options[:value]
15
- end
16
-
17
- def to_hash
18
- { @name.to_sym => @value }
19
- end
20
- end
21
- end
22
- end
@@ -1,10 +0,0 @@
1
- module V2Intuity
2
- module Filters
3
- class FormatRedirect < Filter
4
- def initialize(options = {})
5
- super
6
- @name = Filter::FILTERS[:format_redirect]
7
- end
8
- end
9
- end
10
- end
@@ -1,20 +0,0 @@
1
- module V2Intuity
2
- module Filters
3
- class ResourceFilter # Strean resource filters that indicate what kind of data to be returned by stream
4
- attr_accessor :name, :value
5
-
6
- FILTERS = { measurement: 'measurement', nutrition: 'nutrition',
7
- sleep: 'sleep', summaries: 'summaries',
8
- workout: 'workout' }.freeze
9
-
10
- def initialize(options = {})
11
- @name = options[:name]
12
- @value = options[:value]
13
- end
14
-
15
- def to_hash
16
- { @name.to_sym => @value }
17
- end
18
- end
19
- end
20
- end
@@ -1,10 +0,0 @@
1
- module V2Intuity
2
- module Filters
3
- class Source < Filter
4
- def initialize(options = {})
5
- super
6
- @name = Filter::FILTERS[:source]
7
- end
8
- end
9
- end
10
- end