reso_transport 1.5.4 → 1.5.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.gitpod.yml +2 -0
- data/.rubocop.yml +33 -0
- data/Gemfile.lock +1 -1
- data/README.md +44 -8
- data/bin/console +10 -10
- data/bin/rake +29 -0
- data/lib/reso_transport/authentication/fetch_token_auth.rb +39 -16
- data/lib/reso_transport/authentication/middleware.rb +5 -4
- data/lib/reso_transport/base_metadata.rb +64 -0
- data/lib/reso_transport/client.rb +33 -17
- data/lib/reso_transport/datasystem.rb +25 -0
- data/lib/reso_transport/datasystem_parser.rb +26 -0
- data/lib/reso_transport/entity_set.rb +2 -4
- data/lib/reso_transport/entity_type.rb +11 -13
- data/lib/reso_transport/errors.rb +69 -0
- data/lib/reso_transport/metadata.rb +15 -30
- data/lib/reso_transport/metadata_cache.rb +4 -5
- data/lib/reso_transport/metadata_parser.rb +31 -22
- data/lib/reso_transport/query.rb +50 -52
- data/lib/reso_transport/resource.rb +28 -8
- data/lib/reso_transport/version.rb +1 -1
- data/lib/reso_transport.rb +22 -36
- data/reso_transport.gemspec +20 -20
- metadata +21 -14
@@ -0,0 +1,69 @@
|
|
1
|
+
module ResoTransport
|
2
|
+
class ResourceError < StandardError
|
3
|
+
attr_reader :resource
|
4
|
+
|
5
|
+
def initialize(resource)
|
6
|
+
@resource = resource
|
7
|
+
super message
|
8
|
+
end
|
9
|
+
|
10
|
+
def resource_name
|
11
|
+
return resource.name if resource.respond_to?(:name)
|
12
|
+
|
13
|
+
resource || 'unknown'
|
14
|
+
end
|
15
|
+
|
16
|
+
def message
|
17
|
+
"Request error for #{resource_name}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class EncodeError < ResourceError
|
22
|
+
def initialize(resource, property)
|
23
|
+
@property = property
|
24
|
+
super resource
|
25
|
+
end
|
26
|
+
|
27
|
+
def message
|
28
|
+
"Property #{@property} not found for #{resource_name}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class LocalizationRequired < ResourceError
|
33
|
+
def message
|
34
|
+
"Localization required for #{resource_name}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class RequestError < ResourceError
|
39
|
+
attr_reader :request, :response
|
40
|
+
|
41
|
+
def initialize(request, response, resource = nil)
|
42
|
+
@response = response.respond_to?(:to_hash) ? response.to_hash : response
|
43
|
+
@request = request
|
44
|
+
super resource
|
45
|
+
end
|
46
|
+
|
47
|
+
def message
|
48
|
+
"Received #{response[:status]} for #{resource_name}"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class NoResponse < RequestError
|
53
|
+
def message
|
54
|
+
"No response for #{resource_name}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class ResponseError < RequestError
|
59
|
+
def message
|
60
|
+
"Request succeeded for #{resource_name} with response errors"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class AccessDenied < RequestError
|
65
|
+
def message
|
66
|
+
"Access denied: #{response.reason_phrase}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -1,10 +1,12 @@
|
|
1
|
-
|
2
|
-
Metadata = Struct.new(:client) do
|
1
|
+
require_relative 'base_metadata'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module ResoTransport
|
4
|
+
class Metadata < BaseMetadata
|
5
|
+
def initialize(client)
|
6
|
+
super client
|
7
|
+
@prefix = 'md'
|
8
|
+
@classname = self.class.name
|
9
|
+
end
|
8
10
|
|
9
11
|
def entity_sets
|
10
12
|
parser.entity_sets
|
@@ -14,34 +16,17 @@ module ResoTransport
|
|
14
16
|
parser.schemas
|
15
17
|
end
|
16
18
|
|
17
|
-
def
|
18
|
-
|
19
|
+
def datasystem?
|
20
|
+
parser.datasystem?
|
19
21
|
end
|
20
22
|
|
21
|
-
def
|
22
|
-
@
|
23
|
-
end
|
24
|
-
|
25
|
-
def get_data
|
26
|
-
if client.md_file
|
27
|
-
md_cache.read || md_cache.write(raw)
|
28
|
-
else
|
29
|
-
raw
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def raw
|
34
|
-
resp = client.connection.get("$metadata") do |req|
|
23
|
+
def response
|
24
|
+
@response ||= client.connection.get('$metadata') do |req|
|
35
25
|
req.headers['Accept'] = MIME_TYPES[client.vendor.fetch(:metadata_format, :xml).to_sym]
|
26
|
+
@request = req
|
36
27
|
end
|
37
|
-
|
38
|
-
|
39
|
-
resp.body
|
40
|
-
else
|
41
|
-
puts resp.body
|
42
|
-
raise "Error getting metadata!"
|
43
|
-
end
|
28
|
+
rescue Faraday::ConnectionFailed
|
29
|
+
raise NoResponse.new(request, nil, '$metadata')
|
44
30
|
end
|
45
|
-
|
46
31
|
end
|
47
32
|
end
|
@@ -7,15 +7,14 @@ module ResoTransport
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def read
|
10
|
-
if File.exist?(name)
|
11
|
-
|
12
|
-
|
10
|
+
return nil if !File.exist?(name) || File.size(name).zero?
|
11
|
+
|
12
|
+
File.new(name)
|
13
13
|
end
|
14
14
|
|
15
15
|
def write(raw)
|
16
|
-
File.open(name,
|
16
|
+
File.open(name, 'w') { |f| f.write(raw.force_encoding('UTF-8')) } if raw.length.positive?
|
17
17
|
File.new(name)
|
18
18
|
end
|
19
|
-
|
20
19
|
end
|
21
20
|
end
|
@@ -14,12 +14,14 @@ module ResoTransport
|
|
14
14
|
@current_complex_type = nil
|
15
15
|
@current_enum_type = nil
|
16
16
|
@current_member = nil
|
17
|
+
|
18
|
+
@datasystem = nil
|
17
19
|
end
|
18
20
|
|
19
21
|
def parse(doc)
|
20
22
|
REXML::Document.parse_stream(doc, self)
|
21
23
|
finalize
|
22
|
-
|
24
|
+
self
|
23
25
|
end
|
24
26
|
|
25
27
|
def finalize
|
@@ -54,55 +56,62 @@ module ResoTransport
|
|
54
56
|
|
55
57
|
def tag_start(name, args)
|
56
58
|
case name
|
57
|
-
when
|
59
|
+
when 'Schema'
|
58
60
|
@schemas << ResoTransport::Schema.from_stream(args)
|
59
|
-
when
|
61
|
+
when 'EntitySet'
|
60
62
|
@entity_sets << ResoTransport::EntitySet.from_stream(args)
|
61
|
-
when
|
63
|
+
when 'EntityType'
|
62
64
|
@current_entity_type = ResoTransport::EntityType.from_stream(args)
|
63
|
-
when
|
65
|
+
when 'ComplexType'
|
64
66
|
@current_complex_type = ResoTransport::EntityType.from_stream(args)
|
65
|
-
when
|
67
|
+
when 'PropertyRef'
|
66
68
|
@current_entity_type.primary_key = args['Name']
|
67
|
-
when
|
68
|
-
|
69
|
-
|
70
|
-
|
69
|
+
when 'Property'
|
70
|
+
if @current_entity_type
|
71
|
+
@current_entity_type.properties << ResoTransport::Property.from_stream(args.merge(schema: @schemas.last))
|
72
|
+
end
|
73
|
+
if @current_complex_type
|
74
|
+
@current_complex_type.properties << ResoTransport::Property.from_stream(args.merge(schema: @schemas.last))
|
75
|
+
end
|
76
|
+
when 'NavigationProperty'
|
71
77
|
@current_entity_type.navigation_properties << ResoTransport::Property.from_stream(args)
|
72
|
-
when
|
78
|
+
when 'EnumType'
|
73
79
|
@current_enum_type = ResoTransport::Enum.from_stream(args.merge(schema: @schemas.last))
|
74
|
-
when
|
80
|
+
when 'Member'
|
75
81
|
@current_member = ResoTransport::Member.from_stream(args)
|
76
|
-
when
|
82
|
+
when 'Annotation'
|
77
83
|
if @current_enum_type && @current_member
|
78
84
|
@current_member.annotation = args['String']
|
79
|
-
|
80
|
-
|
81
|
-
#raise args.inspect
|
82
|
-
end
|
85
|
+
elsif @current_entity_type || @current_complex_type
|
86
|
+
# raise args.inspect
|
83
87
|
end
|
84
88
|
end
|
85
|
-
rescue => e
|
89
|
+
rescue StandardError => e
|
86
90
|
puts e.inspect
|
87
91
|
puts "Error processing Tag: #{[name, args].inspect}"
|
88
92
|
end
|
89
93
|
|
90
94
|
def tag_end(name)
|
91
95
|
case name
|
92
|
-
when
|
96
|
+
when 'EntityType'
|
93
97
|
@current_entity_type.schema = @schemas.last.namespace
|
94
98
|
@schemas.last.entity_types << @current_entity_type
|
95
|
-
when
|
99
|
+
when 'ComplexType'
|
96
100
|
@current_complex_type.schema = @schemas.last.namespace
|
97
101
|
@schemas.last.complex_types << @current_complex_type
|
98
|
-
when
|
102
|
+
when 'EnumType'
|
99
103
|
@enumerations << @current_enum_type
|
100
104
|
@current_enum_type = nil
|
101
|
-
when
|
105
|
+
when 'Member'
|
102
106
|
@current_enum_type.members << @current_member
|
103
107
|
@current_member = nil
|
104
108
|
end
|
105
109
|
end
|
106
110
|
|
111
|
+
def datasystem?
|
112
|
+
return @datasystem unless @datasystem.nil?
|
113
|
+
|
114
|
+
@datasystem = @schemas.any? { |s| s.entity_types.any? { |t| t.name == 'DataSystem' } }
|
115
|
+
end
|
107
116
|
end
|
108
117
|
end
|
data/lib/reso_transport/query.rb
CHANGED
@@ -1,23 +1,22 @@
|
|
1
1
|
module ResoTransport
|
2
2
|
Query = Struct.new(:resource) do
|
3
|
-
|
4
|
-
def all(*contexts, &block)
|
3
|
+
def all(*_contexts, &block)
|
5
4
|
new_query_context('and')
|
6
5
|
instance_eval(&block)
|
7
6
|
clear_query_context
|
8
|
-
|
7
|
+
self
|
9
8
|
end
|
10
9
|
|
11
10
|
def any(&block)
|
12
11
|
new_query_context('or')
|
13
12
|
instance_eval(&block)
|
14
13
|
clear_query_context
|
15
|
-
|
14
|
+
self
|
16
15
|
end
|
17
16
|
|
18
|
-
[
|
17
|
+
%i[eq ne gt ge lt le].each do |op|
|
19
18
|
define_method(op) do |conditions|
|
20
|
-
conditions.each_pair do |k,v|
|
19
|
+
conditions.each_pair do |k, v|
|
21
20
|
current_query_context << "#{k} #{op} #{encode_value(k, v)}"
|
22
21
|
end
|
23
22
|
return self
|
@@ -26,67 +25,70 @@ module ResoTransport
|
|
26
25
|
|
27
26
|
def limit(size)
|
28
27
|
options[:top] = size
|
29
|
-
|
28
|
+
self
|
30
29
|
end
|
31
30
|
|
32
31
|
def offset(size)
|
33
32
|
options[:skip] = size
|
34
|
-
|
33
|
+
self
|
35
34
|
end
|
36
35
|
|
37
|
-
def order(field, dir=nil)
|
38
|
-
options[:orderby] = [field, dir].join(
|
39
|
-
|
36
|
+
def order(field, dir = nil)
|
37
|
+
options[:orderby] = [field, dir].join(' ').strip
|
38
|
+
self
|
40
39
|
end
|
41
40
|
|
42
41
|
def include_count
|
43
42
|
options[:count] = true
|
44
|
-
|
43
|
+
self
|
45
44
|
end
|
46
45
|
|
47
46
|
def select(*fields)
|
48
|
-
os = options.fetch(:select,
|
49
|
-
options[:select] = (os + Array(fields)).uniq.join(
|
47
|
+
os = options.fetch(:select, '').split(',')
|
48
|
+
options[:select] = (os + Array(fields)).uniq.join(',')
|
50
49
|
|
51
|
-
|
50
|
+
self
|
52
51
|
end
|
53
52
|
|
54
53
|
def expand(*names)
|
55
|
-
ex = options.fetch(:expand,
|
56
|
-
options[:expand] = (ex + Array(names)).uniq.join(
|
54
|
+
ex = options.fetch(:expand, '').split(',')
|
55
|
+
options[:expand] = (ex + Array(names)).uniq.join(',')
|
57
56
|
|
58
|
-
|
57
|
+
self
|
59
58
|
end
|
60
59
|
|
61
60
|
def count
|
62
|
-
p compile_params
|
63
61
|
limit(1).include_count
|
64
|
-
|
65
|
-
|
66
|
-
parsed_body.fetch("@odata.count", 0)
|
62
|
+
parsed = handle_response response
|
63
|
+
parsed.fetch('@odata.count', 0)
|
67
64
|
end
|
68
65
|
|
69
66
|
def results
|
70
|
-
|
67
|
+
parsed = handle_response response
|
71
68
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
puts resp[:meta]
|
76
|
-
raise "Request Failed"
|
77
|
-
end
|
69
|
+
@next_link = parsed.fetch('@odata.nextLink')
|
70
|
+
results = Array(parsed.delete('value'))
|
71
|
+
resource.parse(results)
|
78
72
|
end
|
79
73
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
74
|
+
# Can only be accessed after results call
|
75
|
+
def next_link
|
76
|
+
@next_link
|
77
|
+
end
|
84
78
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
79
|
+
def response
|
80
|
+
resource.get(compile_params)
|
81
|
+
rescue Faraday::ConnectionFailed
|
82
|
+
raise NoResponse.new(resource.request, nil, resource)
|
83
|
+
end
|
84
|
+
|
85
|
+
def handle_response(response)
|
86
|
+
raise RequestError.new(resource.request, response, resource) unless response.success?
|
87
|
+
|
88
|
+
parsed = JSON.parse(response.body)
|
89
|
+
raise ResponseError.new(resource.request, response, resource) if parsed.key?('error')
|
90
|
+
|
91
|
+
parsed
|
90
92
|
end
|
91
93
|
|
92
94
|
def new_query_context(context)
|
@@ -110,7 +112,7 @@ module ResoTransport
|
|
110
112
|
end
|
111
113
|
|
112
114
|
def sub_queries
|
113
|
-
@sub_queries ||= Hash.new {|h,k| h[k] = { context: 'and', criteria: [] } }
|
115
|
+
@sub_queries ||= Hash.new { |h, k| h[k] = { context: 'and', criteria: [] } }
|
114
116
|
end
|
115
117
|
|
116
118
|
def compile_filters
|
@@ -120,36 +122,32 @@ module ResoTransport
|
|
120
122
|
|
121
123
|
filter_chunks = []
|
122
124
|
|
123
|
-
if global && global[:criteria]&.any?
|
124
|
-
filter_chunks << global[:criteria].join(" #{global[:context]} ")
|
125
|
-
end
|
125
|
+
filter_chunks << global[:criteria].join(" #{global[:context]} ") if global && global[:criteria]&.any?
|
126
126
|
|
127
127
|
filter_chunks << filter_groups.map do |g|
|
128
128
|
"(#{g[:criteria].join(" #{g[:context]} ")})"
|
129
|
-
end.join(
|
129
|
+
end.join(' and ')
|
130
130
|
|
131
|
-
filter_chunks.reject {|c| c ==
|
131
|
+
filter_chunks.reject { |c| c == '' }.join(' and ')
|
132
132
|
end
|
133
133
|
|
134
134
|
def compile_params
|
135
135
|
params = {}
|
136
136
|
|
137
|
-
options.each_pair do |k,v|
|
137
|
+
options.each_pair do |k, v|
|
138
138
|
params["$#{k}"] = v
|
139
139
|
end
|
140
140
|
|
141
|
-
|
142
|
-
params["$filter"] = compile_filters
|
143
|
-
end
|
141
|
+
params['$filter'] = compile_filters unless sub_queries.empty?
|
144
142
|
|
145
143
|
params
|
146
144
|
end
|
147
145
|
|
148
|
-
def encode_value(key,
|
146
|
+
def encode_value(key, val)
|
149
147
|
field = resource.property(key.to_s)
|
150
|
-
raise
|
151
|
-
field.encode(v)
|
152
|
-
end
|
148
|
+
raise EncodeError.new(resource, key) if field.nil?
|
153
149
|
|
150
|
+
field.encode(val)
|
151
|
+
end
|
154
152
|
end
|
155
153
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module ResoTransport
|
2
|
-
Resource = Struct.new(:client, :entity_set) do
|
3
|
-
|
2
|
+
Resource = Struct.new(:client, :entity_set, :localizations, :local) do
|
4
3
|
def query
|
5
4
|
Query.new(self)
|
6
5
|
end
|
@@ -10,7 +9,7 @@ module ResoTransport
|
|
10
9
|
end
|
11
10
|
|
12
11
|
def property(name)
|
13
|
-
properties.detect {|p| p.name == name }
|
12
|
+
properties.detect { |p| p.name == name }
|
14
13
|
end
|
15
14
|
|
16
15
|
def properties
|
@@ -20,13 +19,13 @@ module ResoTransport
|
|
20
19
|
def expandable
|
21
20
|
entity_type.navigation_properties
|
22
21
|
end
|
23
|
-
|
22
|
+
|
24
23
|
def entity_type
|
25
|
-
@entity_type ||= schema.entity_types.detect {|et| et.name == entity_set.entity_type }
|
24
|
+
@entity_type ||= schema.entity_types.detect { |et| et.name == entity_set.entity_type }
|
26
25
|
end
|
27
26
|
|
28
27
|
def schema
|
29
|
-
@schema ||= md.schemas.detect {|s| s.namespace == entity_set.schema }
|
28
|
+
@schema ||= md.schemas.detect { |s| s.namespace == entity_set.schema }
|
30
29
|
end
|
31
30
|
|
32
31
|
def md
|
@@ -34,15 +33,31 @@ module ResoTransport
|
|
34
33
|
end
|
35
34
|
|
36
35
|
def parse(results)
|
37
|
-
results.map {|r| entity_type.parse(r) }
|
36
|
+
results.map { |r| entity_type.parse(r) }
|
38
37
|
end
|
39
38
|
|
40
39
|
def get(params)
|
41
|
-
client.connection.get(
|
40
|
+
client.connection.get(url, params) do |req|
|
42
41
|
req.headers['Accept'] = 'application/json'
|
42
|
+
@request = req
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
def url
|
47
|
+
return local['ResourcePath'].gsub(%r{^/}, '') if local
|
48
|
+
|
49
|
+
raise LocalizationRequired, self if localizations.any? && local.nil?
|
50
|
+
|
51
|
+
return "#{name}/replication" if client.use_replication_endpoint
|
52
|
+
|
53
|
+
name
|
54
|
+
end
|
55
|
+
|
56
|
+
def localization(name)
|
57
|
+
self.local = localizations[name] if localizations.key?(name)
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
46
61
|
def to_s
|
47
62
|
%(#<ResoTransport::Resource entity_set="#{name}", schema="#{schema&.namespace}">)
|
48
63
|
end
|
@@ -51,5 +66,10 @@ module ResoTransport
|
|
51
66
|
to_s
|
52
67
|
end
|
53
68
|
|
69
|
+
def request
|
70
|
+
return @request.to_h if @request.respond_to? :to_h
|
71
|
+
|
72
|
+
{}
|
73
|
+
end
|
54
74
|
end
|
55
75
|
end
|
data/lib/reso_transport.rb
CHANGED
@@ -5,41 +5,28 @@ require 'faraday'
|
|
5
5
|
require 'json'
|
6
6
|
require 'time'
|
7
7
|
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
# def escape(str)
|
29
|
-
# str.to_s.gsub(ESCAPE_RE) do |match|
|
30
|
-
# '%' + match.unpack('H2' * match.bytesize).join('%').upcase
|
31
|
-
# end.gsub(" ","%20")
|
32
|
-
|
33
|
-
# end
|
34
|
-
# end
|
35
|
-
# end
|
36
|
-
|
37
|
-
Faraday::Utils.default_space_encoding = "%20"
|
8
|
+
require 'reso_transport/version'
|
9
|
+
require 'reso_transport/configuration'
|
10
|
+
require 'reso_transport/authentication'
|
11
|
+
require 'reso_transport/client'
|
12
|
+
require 'reso_transport/resource'
|
13
|
+
require 'reso_transport/metadata'
|
14
|
+
require 'reso_transport/metadata_cache'
|
15
|
+
require 'reso_transport/metadata_parser'
|
16
|
+
require 'reso_transport/datasystem'
|
17
|
+
require 'reso_transport/datasystem_parser'
|
18
|
+
require 'reso_transport/schema'
|
19
|
+
require 'reso_transport/entity_set'
|
20
|
+
require 'reso_transport/entity_type'
|
21
|
+
require 'reso_transport/enum'
|
22
|
+
require 'reso_transport/property'
|
23
|
+
require 'reso_transport/query'
|
24
|
+
require 'reso_transport/errors'
|
25
|
+
|
26
|
+
Faraday::Utils.default_space_encoding = '%20'
|
38
27
|
|
39
28
|
module ResoTransport
|
40
|
-
|
41
|
-
class AccessDenied < StandardError; end
|
42
|
-
ODATA_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S%Z"
|
29
|
+
ODATA_TIME_FORMAT = '%Y-%m-%dT%H:%M:%SZ'.freeze
|
43
30
|
|
44
31
|
class << self
|
45
32
|
attr_writer :configuration
|
@@ -53,8 +40,7 @@ module ResoTransport
|
|
53
40
|
yield(configuration)
|
54
41
|
end
|
55
42
|
|
56
|
-
def self.split_schema_and_class_name(
|
57
|
-
|
43
|
+
def self.split_schema_and_class_name(text)
|
44
|
+
text.to_s.partition(/(\w+)$/).first(2).map { |s| s.sub(/\.$/, '') }
|
58
45
|
end
|
59
|
-
|
60
46
|
end
|
data/reso_transport.gemspec
CHANGED
@@ -1,35 +1,35 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path("../lib", __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require 'reso_transport/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
6
|
+
spec.name = 'reso_transport'
|
8
7
|
spec.version = ResoTransport::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
8
|
+
spec.authors = ['Jon Druse']
|
9
|
+
spec.email = ['jon@wrstudios.com']
|
11
10
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
11
|
+
spec.summary = 'A utility for consuming RESO Web API connections'
|
12
|
+
spec.description = 'Supports Trestle, Spark, Bridge Interactive, MLS Grid'
|
13
|
+
spec.homepage = 'http://github.com/wrstudios/reso_transport'
|
14
|
+
spec.license = 'MIT'
|
16
15
|
|
16
|
+
spec.required_ruby_version = '>= 2.6'
|
17
17
|
|
18
18
|
# Specify which files should be added to the gem when it is released.
|
19
19
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
20
|
-
spec.files
|
20
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
21
21
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
22
22
|
end
|
23
|
-
spec.bindir =
|
23
|
+
spec.bindir = 'exe'
|
24
24
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
|
-
spec.require_paths = [
|
25
|
+
spec.require_paths = ['lib']
|
26
26
|
|
27
|
-
spec.add_dependency
|
27
|
+
spec.add_dependency 'faraday', '~> 1.0.1'
|
28
28
|
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
32
|
-
spec.add_development_dependency
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
29
|
+
spec.add_development_dependency 'bundler', '~> 2'
|
30
|
+
spec.add_development_dependency 'byebug', '~> 11'
|
31
|
+
spec.add_development_dependency 'minitest', '~> 5.0'
|
32
|
+
spec.add_development_dependency 'minitest-rg', '~> 5.0'
|
33
|
+
spec.add_development_dependency 'rake', '~> 13'
|
34
|
+
spec.add_development_dependency 'vcr', '~> 6.0'
|
35
35
|
end
|