tec_doc 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.
Files changed (65) hide show
  1. data/LICENSE +20 -0
  2. data/README.md +29 -0
  3. data/bin/tec_doc +51 -0
  4. data/lib/tec_doc.rb +28 -0
  5. data/lib/tec_doc/article.rb +317 -0
  6. data/lib/tec_doc/article_attribute.rb +17 -0
  7. data/lib/tec_doc/article_document.rb +49 -0
  8. data/lib/tec_doc/article_oe_number.rb +11 -0
  9. data/lib/tec_doc/article_thumbnail.rb +18 -0
  10. data/lib/tec_doc/assembly_group.rb +77 -0
  11. data/lib/tec_doc/brand.rb +18 -0
  12. data/lib/tec_doc/client.rb +84 -0
  13. data/lib/tec_doc/date_parser.rb +14 -0
  14. data/lib/tec_doc/error.rb +4 -0
  15. data/lib/tec_doc/fuel_type.rb +0 -0
  16. data/lib/tec_doc/generic_article.rb +47 -0
  17. data/lib/tec_doc/language.rb +22 -0
  18. data/lib/tec_doc/vehicle.rb +121 -0
  19. data/lib/tec_doc/vehicle_manufacturer.rb +46 -0
  20. data/lib/tec_doc/vehicle_model.rb +46 -0
  21. data/lib/tec_doc/version.rb +3 -0
  22. data/spec/cassettes/article_all.yml +88 -0
  23. data/spec/cassettes/article_all_with_details.yml +84 -0
  24. data/spec/cassettes/article_details.yml +68 -0
  25. data/spec/cassettes/article_details_for_trade_number.yml +56 -0
  26. data/spec/cassettes/article_document_all.yml +49 -0
  27. data/spec/cassettes/article_document_content.yml +763 -0
  28. data/spec/cassettes/article_information.yml +55 -0
  29. data/spec/cassettes/article_linked_manufacturers.yml +45 -0
  30. data/spec/cassettes/article_linked_vehicle_ids.yml +45 -0
  31. data/spec/cassettes/article_linked_vehicles.yml +372 -0
  32. data/spec/cassettes/article_linked_vehicles_with_details.yml +430 -0
  33. data/spec/cassettes/article_search.yml +62 -0
  34. data/spec/cassettes/article_search_for_linked_manufacturers.yml +47 -0
  35. data/spec/cassettes/article_thumbnail_all.yml +45 -0
  36. data/spec/cassettes/article_thumbnail_content.yml +399 -0
  37. data/spec/cassettes/article_trade_number.yml +46 -0
  38. data/spec/cassettes/article_with_a_lot_linked_vehicles.yml +60 -0
  39. data/spec/cassettes/assembly_group_all.yml +90 -0
  40. data/spec/cassettes/assembly_group_children.yml +55 -0
  41. data/spec/cassettes/brand_all.yml +81 -0
  42. data/spec/cassettes/generic_article_all.yml +46 -0
  43. data/spec/cassettes/language_all.yml +48 -0
  44. data/spec/cassettes/linked_targets_by_manufacturers.yml +2584 -0
  45. data/spec/cassettes/status_401.yml +38 -0
  46. data/spec/cassettes/vehicle_all.yml +79 -0
  47. data/spec/cassettes/vehicle_assembly_groups.yml +83 -0
  48. data/spec/cassettes/vehicle_child_assembly_groups.yml +49 -0
  49. data/spec/cassettes/vehicle_find_by_id.yml +50 -0
  50. data/spec/cassettes/vehicle_manufacturer_all.yml +52 -0
  51. data/spec/cassettes/vehicle_model_all.yml +119 -0
  52. data/spec/spec_helper.rb +28 -0
  53. data/spec/tec_doc/article_document_spec.rb +34 -0
  54. data/spec/tec_doc/article_spec.rb +185 -0
  55. data/spec/tec_doc/article_thumbnail_spec.rb +34 -0
  56. data/spec/tec_doc/assembly_group_spec.rb +48 -0
  57. data/spec/tec_doc/brand_spec.rb +22 -0
  58. data/spec/tec_doc/client_spec.rb +11 -0
  59. data/spec/tec_doc/date_parser_spec.rb +17 -0
  60. data/spec/tec_doc/generic_article_spec.rb +30 -0
  61. data/spec/tec_doc/language_spec.rb +22 -0
  62. data/spec/tec_doc/vehicle_manufacturer_spec.rb +43 -0
  63. data/spec/tec_doc/vehicle_model_spec.rb +35 -0
  64. data/spec/tec_doc/vehicle_spec.rb +80 -0
  65. metadata +426 -0
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 MAK IT
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Ruby client for TecDoc
2
+
3
+ ## Usage
4
+
5
+ ```ruby
6
+ gem 'tec_doc', :git => 'git@github.com:mak-it/tec_doc.git'
7
+ ```
8
+
9
+ ```ruby
10
+ require "tec_doc"
11
+ I18n.locale = "lv"
12
+ TecDoc.client = TecDoc::Client.new(:provider => 330, :country => "lv")
13
+ ```
14
+
15
+ ## Shell
16
+
17
+ ```bash
18
+ $ tec_doc -h
19
+ $ tec_doc -p 100 -c lv -l lv
20
+ ```
21
+
22
+ ## Documentation
23
+
24
+ ```ruby
25
+ yardoc && open doc/index.html
26
+ ```
27
+
28
+ The official TecDoc Web Service documentation
29
+ can be found [here](http://webservicepilot.tecdoc.net/pegasus-2-0).
data/bin/tec_doc ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.dirname(__FILE__) + '/../lib'
4
+
5
+ require "rubygems"
6
+ require "tec_doc"
7
+ require "optparse"
8
+ require "irb"
9
+
10
+ I18n.locale = "en"
11
+ TecDoc.client = TecDoc::Client.new
12
+ Savon.logger.level = Logger::INFO
13
+ HTTPI.logger.level = Logger::INFO
14
+
15
+ parser = OptionParser.new do |opts|
16
+
17
+ opts.banner = "Usage: tec_doc -p <provider id> -c <country code> [-l <language code>] [-m <mode>] [-v]"
18
+
19
+ opts.on("-p", "--provider <provider id>", "TecDoc provider ID") do |provider|
20
+ TecDoc.client.provider = provider
21
+ end
22
+
23
+ opts.on("-c", "--country <country code>", "Country code according to ISO 3166") do |country|
24
+ TecDoc.client.country = country
25
+ end
26
+
27
+ opts.on("-l", "--lang <language code>", "Language code according to ISO 639") do |lang|
28
+ I18n.locale = lang
29
+ end
30
+
31
+ opts.on("-m", "--mode <test|live>", "Mode ('live' by default)") do |mode|
32
+ TecDoc.client.mode = mode.to_sym
33
+ end
34
+
35
+ opts.on("-v", "--verbose", "") do |verbose|
36
+ Savon.logger.level = Logger::DEBUG
37
+ HTTPI.logger.level = Logger::DEBUG
38
+ end
39
+
40
+ end
41
+
42
+ parser.parse!
43
+
44
+ unless TecDoc.client.provider && TecDoc.client.country
45
+ puts parser
46
+ exit 1
47
+ end
48
+
49
+ puts "TecDoc shell v#{TecDoc::VERSION} [provider:#{TecDoc.client.provider} country:#{TecDoc.client.country} lang:#{I18n.locale} mode: #{TecDoc.client.mode}]"
50
+ ARGV.clear # otherwise all script parameters get passed to IRB
51
+ IRB.start
data/lib/tec_doc.rb ADDED
@@ -0,0 +1,28 @@
1
+ require "i18n"
2
+ require "savon"
3
+
4
+ require "tec_doc/version"
5
+
6
+ module TecDoc
7
+ extend self
8
+
9
+ autoload :Client, "tec_doc/client"
10
+ autoload :Error, "tec_doc/error"
11
+
12
+ autoload :Article, "tec_doc/article"
13
+ autoload :ArticleDocument, "tec_doc/article_document"
14
+ autoload :ArticleThumbnail, "tec_doc/article_thumbnail"
15
+ autoload :ArticleOENumber, "tec_doc/article_oe_number"
16
+ autoload :ArticleAttribute, "tec_doc/article_attribute"
17
+ autoload :AssemblyGroup, "tec_doc/assembly_group"
18
+ autoload :Brand, "tec_doc/brand"
19
+ autoload :GenericArticle, "tec_doc/generic_article"
20
+ autoload :Language, "tec_doc/language"
21
+ autoload :VehicleManufacturer, "tec_doc/vehicle_manufacturer"
22
+ autoload :VehicleModel, "tec_doc/vehicle_model"
23
+ autoload :Vehicle, "tec_doc/vehicle"
24
+
25
+ autoload :DateParser, "tec_doc/date_parser"
26
+
27
+ attr_accessor :client
28
+ end
@@ -0,0 +1,317 @@
1
+ module TecDoc
2
+ class Article
3
+ attr_accessor :id, :name, :number, :search_number, :brand_name, :brand_number,
4
+ :generic_article_id, :number_type, :state, :packing_unit
5
+
6
+ attr_accessor :scope
7
+
8
+ # Find article by all number types and brand number and generic article id.
9
+ #
10
+ # @option options [String] :article_number Article number will be converted within the search process to a simplified article number
11
+ # @option options [Integer] :brand_no result of brand selection (optional)
12
+ # @option options [String] :country country code according to ISO 3166
13
+ # @option options [Integer] :generic_article_id result of generic article selection (optional)
14
+ # @option options [String] :lang language code according to ISO 639
15
+ # @option options [String] :number_type Number type (0: Article number, 1: OE number, 2: Trade number, 3: Comparable number, 4: Replacement number, 5: Replaced number, 6: EAN number, 10: Any number)
16
+ # @option options [TrueClass, FalseClass] :search_exact Search mode (true: exact search, false: similar search)
17
+ # @option options [Integer] :sort_type Sort mode (1: Brand, 2: Product group)
18
+ # @return [Array<TecDoc::Article>] list of articles
19
+ def self.search(options = {})
20
+ options = {
21
+ :country => TecDoc.client.country,
22
+ :lang => I18n.locale.to_s,
23
+ :number_type => 10,
24
+ :search_exact => 1,
25
+ :sort_type => 1
26
+ }.merge(options)
27
+ TecDoc.client.request(:get_article_direct_search_all_numbers2, options).map do |attributes|
28
+ new(attributes, options)
29
+ end
30
+ end
31
+
32
+ # All articles by linked vehicle and brand number, generic article and assembly group
33
+ #
34
+ # @option options [String] :lang
35
+ # @option options [String] :country
36
+ # @option options [String] :linking_target_type
37
+ # @option options [Integer] :linking_target_id
38
+ # @option options [LongList] :brand_id
39
+ # @option options [LongList] :generic_article_id
40
+ # @option options [Long] :article_assembly_group_node_id
41
+ # @return [Array<TecDoc::Article>] list of articles
42
+ def self.all(options)
43
+ options = {
44
+ :lang => I18n.locale.to_s,
45
+ :country => TecDoc.client.country
46
+ }.merge(options)
47
+ TecDoc.client.request(:get_article_ids3, options).map do |attributes|
48
+ new(attributes, options)
49
+ end
50
+ end
51
+
52
+
53
+ # All requested articles detail information
54
+ #
55
+ # @option options [String] :lang
56
+ # @option options [String] :country
57
+ # @option options [Array] :ids
58
+ # @option options [Boolean] :attributs
59
+ # @option options [Boolean] :ean_numbers
60
+ # @option options [Boolean] :info
61
+ # @option options [Boolean] :oe_numbers
62
+ # @option options [Boolean] :usage_numbers
63
+ # @return [Array<TecDoc::Article>] list of articles
64
+ def self.all_with_details(options)
65
+ options = {
66
+ :lang => I18n.locale.to_s,
67
+ :country => TecDoc.client.country,
68
+ :attributs => true,
69
+ :ean_numbers => true,
70
+ :info => true,
71
+ :oe_numbers => true,
72
+ :usage_numbers => true,
73
+ :article_id => { :array => { :ids => options.delete(:ids) } }
74
+ }.merge(options)
75
+
76
+ TecDoc.client.request(:get_direct_articles_by_ids2, options).map do |attributes|
77
+ new(attributes, options)
78
+ end
79
+ end
80
+
81
+ def initialize(attributes = {}, scope = {})
82
+ article_data = (attributes[:direct_article] || attributes)
83
+
84
+ @id = article_data[:article_id].to_i
85
+ @name = article_data[:article_name].to_s
86
+ @number = article_data[:article_no].to_s
87
+ @brand_name = article_data[:brand_name].to_s
88
+ @brand_number = article_data[:brand_no].to_i
89
+ @generic_article_id = article_data[:generic_article_id].to_i
90
+ @number_type = article_data[:number_type].to_i
91
+ @search_number = article_data[:article_search_no].to_s
92
+ @state = article_data[:article_state_name]
93
+ @scope = scope
94
+
95
+ @ean_number = attributes[:ean_number].to_a.map(&:values).flatten.first
96
+ @trade_number = attributes[:usage_numbers].to_a.map(&:values).flatten.first
97
+
98
+ if attributes[:article_attributes]
99
+ @attributes = attributes[:article_attributes].map do |attrs|
100
+ ArticleAttribute.new(attrs)
101
+ end
102
+ end
103
+
104
+ if attributes[:oen_numbers]
105
+ @oe_numbers = attributes[:oen_numbers].map do |attrs|
106
+ ArticleOENumber.new(attrs)
107
+ end
108
+ end
109
+ end
110
+
111
+ def state
112
+ @state ||= (article_details[:direct_article] || {})[:article_state_name]
113
+ end
114
+
115
+ def packing_unit
116
+ @packing_unit ||= (article_details[:direct_article] || {})[:packing_unit]
117
+ end
118
+
119
+ def brand
120
+ unless defined?(@brand)
121
+ @brand = Brand.new
122
+ @brand.number = brand_number
123
+ @brand.name = brand_name
124
+ end
125
+ @brand
126
+ end
127
+
128
+ def documents
129
+ @documents ||= ArticleDocument.all({
130
+ :lang => scope[:lang],
131
+ :country => scope[:country],
132
+ :article_id => id
133
+ })
134
+ end
135
+
136
+ def thumbnails
137
+ @thumbnails ||= ArticleThumbnail.all(:article_id => id)
138
+ end
139
+
140
+ def attributes
141
+ @attributes ||= article_details[:article_attributes].map do |attrs|
142
+ ArticleAttribute.new(attrs)
143
+ end
144
+ end
145
+
146
+ def ean_number
147
+ @ean_number ||= article_details[:ean_number].map(&:values).flatten.first
148
+ end
149
+
150
+ def oe_numbers
151
+ @oe_numbers ||= article_details[:oen_numbers].map do |attrs|
152
+ ArticleOENumber.new(attrs)
153
+ end
154
+ end
155
+
156
+ def trade_numbers
157
+ @trade_numbers ||= article_details[:usage_numbers].map(&:values).flatten.join(", ")
158
+ end
159
+
160
+ def information
161
+ @information ||= direct_article_data_en[:article_info]
162
+ end
163
+
164
+ def linked_manufacturers
165
+ unless @linked_manufacturers
166
+ response = TecDoc.client.request(:get_article_linked_all_linking_target_manufacturer, {
167
+ :country => scope[:country],
168
+ :linking_target_type => "C",
169
+ :article_id => id
170
+ })
171
+
172
+ @linked_manufacturers = response.map do |attrs|
173
+ VehicleManufacturer.new(attrs)
174
+ end
175
+ end
176
+ @linked_manufacturers
177
+ end
178
+
179
+ # Array with all linked target vehicles with article link id
180
+ # If request entity is too large, we have to request linked targets by manufacturers
181
+ def linked_targets
182
+ unless @linked_targets
183
+ options = {
184
+ :lang => scope[:lang],
185
+ :country => scope[:country],
186
+ :linking_target_type => "C",
187
+ :linking_target_id => -1,
188
+ :article_id => id
189
+ }
190
+ begin
191
+ @linked_targets = TecDoc.client.request(:get_article_linked_all_linking_target_2, options)
192
+ rescue
193
+ @linked_targets = linked_manufacturers.inject([]) do |result, manufacturer|
194
+ options[:linking_target_manu_id] = manufacturer.id
195
+ result += TecDoc.client.request(:get_article_linked_all_linking_target_2, options)
196
+ end
197
+ end
198
+ end
199
+ @linked_targets
200
+ end
201
+
202
+ def linked_vehicle_ids
203
+ @linked_vehicle_ids ||= linked_targets.map{ |attrs| attrs[:linking_target_id].to_i }.uniq
204
+ end
205
+
206
+ def linked_vehicles(options = {})
207
+ unless @linked_vehicles
208
+ batch_list = linked_vehicle_ids.each_slice(25).to_a
209
+
210
+ # Response from all batches
211
+ response = batch_list.inject([]) do |result, long_list|
212
+ result += TecDoc.client.request(:get_vehicle_by_ids_2,
213
+ {:car_ids => {
214
+ :array => {:ids => long_list}
215
+ },
216
+ :lang => scope[:lang],
217
+ :country => scope[:country],
218
+ :country_user_setting => scope[:country],
219
+ :countries_car_selection => scope[:country],
220
+ :motor_codes => true,
221
+ :axles => false,
222
+ :cabs => false,
223
+ :secondary_types => false,
224
+ :vehicle_details2 => true,
225
+ :vehicle_terms => false,
226
+ :wheelbases => false
227
+ })
228
+ result
229
+ end
230
+
231
+ @linked_vehicles = response.map do |attrs|
232
+ details = (attrs[:vehicle_details2] || {})
233
+ vehicle = Vehicle.new
234
+ vehicle.id = attrs[:car_id].to_i
235
+ vehicle.name = "#{details[:manu_name]} - #{details[:model_name]} - #{details[:type_name]}"
236
+ vehicle.power_hp_from = details[:power_hp].to_i
237
+ vehicle.power_kw_from = details[:power_kw].to_i
238
+ vehicle.cylinder_capacity = details[:cylinder_capacity_ccm].to_i
239
+ vehicle.date_of_construction_from = DateParser.new(details[:year_of_construction_from]).to_date
240
+ vehicle.date_of_construction_to = DateParser.new(details[:year_of_construction_to]).to_date
241
+ vehicle.motor_codes = attrs[:motor_codes].map { |mc| mc[:motor_code] }
242
+ vehicle
243
+ end
244
+ end
245
+ @linked_vehicles
246
+ end
247
+
248
+ # Linked vehicles for article with car specific attributes
249
+ def linked_vehicles_with_details(options = {})
250
+ unless @linked_vehicles_with_details
251
+ links = linked_targets.map do |link|
252
+ new_link = link.dup
253
+ new_link.delete(:linking_target_type)
254
+ new_link
255
+ end
256
+ batch_list = links.each_slice(25).to_a
257
+
258
+ # Response from all batches
259
+ response = batch_list.inject([]) do |result, long_list|
260
+ result += TecDoc.client.request(:get_article_linked_all_linking_targets_by_ids_2, {
261
+ :linked_article_pairs => { :array => {:pairs => long_list} },
262
+ :lang => scope[:lang],
263
+ :country => scope[:country],
264
+ :linking_target_type => "C",
265
+ :immediate_attributs => true,
266
+ :article_id => id
267
+ })
268
+ result
269
+ end
270
+
271
+ @linked_vehicles_with_details = response.map do |attrs|
272
+ details = (attrs[:linked_vehicles].to_a[0] || {})
273
+ vehicle = Vehicle.new
274
+ vehicle.id = details[:car_id].to_i
275
+ vehicle.name = "#{details[:manu_desc]} - #{details[:model_desc]} - #{details[:car_desc]}"
276
+ vehicle.manu_id = details[:manu_id].to_i
277
+ vehicle.mod_id = details[:model_id].to_i
278
+ vehicle.power_hp_from = details[:power_hp_from].to_i
279
+ vehicle.power_kw_from = details[:power_kw_from].to_i
280
+ vehicle.power_hp_to = details[:power_hp_to].to_i
281
+ vehicle.power_kw_to = details[:power_kw_to].to_i
282
+ vehicle.cylinder_capacity = details[:cylinder_capacity].to_i
283
+ vehicle.date_of_construction_from = DateParser.new(details[:year_of_construction_from]).to_date
284
+ vehicle.date_of_construction_to = DateParser.new(details[:year_of_construction_to]).to_date
285
+ vehicle.attributes = attrs[:linked_article_immediate_attributs].to_a
286
+ vehicle.article_link_id = attrs[:article_link_id].to_i
287
+ vehicle
288
+ end
289
+ end
290
+ @linked_vehicles_with_details
291
+ end
292
+
293
+ private
294
+
295
+ def article_details
296
+ @article_details ||= TecDoc.client.request(:get_direct_articles_by_ids2, {
297
+ :lang => scope[:lang],
298
+ :country => scope[:country],
299
+ :article_id => { :array => { :ids => [id] } },
300
+ :attributs => true,
301
+ :ean_numbers => true,
302
+ :oe_numbers => true,
303
+ :usage_numbers => true
304
+ })[0]
305
+ end
306
+
307
+ # Direct article to get all detail info
308
+ def direct_article_data_en
309
+ @direct_article_data_en ||= TecDoc.client.request(:get_direct_articles_by_ids2, {
310
+ :lang => "en",
311
+ :country => TecDoc.client.country,
312
+ :info => true,
313
+ :article_id => { :array => { :ids => [id] } }
314
+ })[0]
315
+ end
316
+ end
317
+ end