ari_fetch 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +4 -1
- data/ari_fetch.gemspec +1 -2
- data/lib/ari_fetch.rb +57 -3
- data/lib/ari_fetch/ari_read_file.rb +40 -0
- data/lib/ari_fetch/files.rb +36 -0
- data/lib/ari_fetch/vehicle.rb +37 -0
- data/lib/ari_fetch/version.rb +1 -1
- data/lib/generators/ari_fetch/ari_fetch_generator.rb +1 -1
- data/lib/generators/ari_fetch/templates/migration.rb +3 -3
- data/spec/ari_spec.rb +23 -1
- metadata +22 -4
- data/app/models/ari_file.rb +0 -5
data/Gemfile
CHANGED
data/ari_fetch.gemspec
CHANGED
@@ -17,7 +17,6 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
|
-
|
21
|
-
# gem.add_dependency "rails" , "~> 3.0.7"
|
20
|
+
gem.add_dependency "nokogiri"
|
22
21
|
|
23
22
|
end
|
data/lib/ari_fetch.rb
CHANGED
@@ -1,11 +1,65 @@
|
|
1
1
|
require "ari_fetch/version"
|
2
2
|
|
3
3
|
require "active_support/dependencies"
|
4
|
+
require "active_record"
|
5
|
+
|
6
|
+
require "net/ftp"
|
4
7
|
|
5
8
|
module AriFetch
|
6
9
|
class Engine
|
7
|
-
|
8
|
-
|
10
|
+
|
11
|
+
attr_accessor :read_files, :unread_files, :ftp_files, :ftp_url, :username,
|
12
|
+
:password, :ftp_instance, :options
|
13
|
+
|
14
|
+
def initialize(ftp_url, username, password, options = {})
|
15
|
+
@ftp_url, @username, @password, @options = ftp_url, username, password, options
|
16
|
+
end
|
17
|
+
|
18
|
+
def read_files
|
19
|
+
@read_files = AriFetch::AriReadFile.pluck(:name) rescue @read_files = AriFetch::Files.new([]).files
|
20
|
+
end
|
21
|
+
|
22
|
+
def ftp_files
|
23
|
+
@ftp_files = fetch! rescue @ftp_files = AriFetch::Files.new([]).files
|
24
|
+
end
|
25
|
+
|
26
|
+
def unread_files
|
27
|
+
@unread_files = ftp_files - read_files
|
28
|
+
end
|
29
|
+
|
30
|
+
def fetch_vehicles_from_files(how_many=1)
|
31
|
+
unread_files.first(how_many).map {|file| AriFetch::AriReadFile.create(name: file).fetch_data(ftp_instance, include_cancel?) }.flatten!
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def fetch!
|
37
|
+
login
|
38
|
+
AriFetch::Files.new(ftp_instance.list()).filter!.sort!(reverse?)
|
39
|
+
end
|
40
|
+
|
41
|
+
def login
|
42
|
+
ftp_instance.connect(ftp_url, 21)
|
43
|
+
ftp_instance.login(username, password)
|
44
|
+
ftp_instance.passive = true
|
45
|
+
ftp_instance.chdir('/')
|
46
|
+
end
|
47
|
+
|
48
|
+
def ftp_instance
|
49
|
+
@ftp_instance ||= Net::FTP.new
|
9
50
|
end
|
51
|
+
|
52
|
+
def include_cancel?
|
53
|
+
options[:cancel] || false
|
54
|
+
end
|
55
|
+
|
56
|
+
def reverse?
|
57
|
+
options[:reverse_order] || false
|
58
|
+
end
|
59
|
+
|
10
60
|
end
|
11
|
-
end
|
61
|
+
end
|
62
|
+
|
63
|
+
require "ari_fetch/ari_read_file.rb"
|
64
|
+
require "ari_fetch/files.rb"
|
65
|
+
require "ari_fetch/vehicle.rb"
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "nokogiri"
|
2
|
+
|
3
|
+
module AriFetch
|
4
|
+
class AriReadFile < ActiveRecord::Base
|
5
|
+
attr_accessible :name
|
6
|
+
|
7
|
+
attr_accessor :content, :vehicles
|
8
|
+
|
9
|
+
def fetch_data(ftp_instance, include_cancel)
|
10
|
+
ftp_instance.gettextfile(name)
|
11
|
+
@content = parse!(File.open(name, "r"))
|
12
|
+
FileUtils.rm name
|
13
|
+
filter_cancel_vehicles! unless include_cancel
|
14
|
+
result
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def parse!(xml)
|
20
|
+
Hash.from_xml(::Nokogiri.XML(xml).to_s) rescue {}
|
21
|
+
end
|
22
|
+
|
23
|
+
def vehicles_hash
|
24
|
+
content["VEHICLES"]["VEHICLE"] rescue []
|
25
|
+
end
|
26
|
+
|
27
|
+
def vehicles
|
28
|
+
@vehicles ||= vehicles_hash.map {|vehicle| AriFetch::Vehicle.new(vehicle) }
|
29
|
+
end
|
30
|
+
|
31
|
+
def filter_cancel_vehicles!
|
32
|
+
@vehicles = vehicles.select { |vehicle| vehicle.available? }
|
33
|
+
end
|
34
|
+
|
35
|
+
def result
|
36
|
+
vehicles.map { |vehicle| vehicle.result }
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module AriFetch
|
2
|
+
class Files
|
3
|
+
|
4
|
+
attr_accessor :files
|
5
|
+
|
6
|
+
def initialize(files = [])
|
7
|
+
@files = files
|
8
|
+
end
|
9
|
+
|
10
|
+
def filter!
|
11
|
+
map_to_file_name.select{ |e| !useless_files.include?(e) && e.match(/\.xml\Z/) }
|
12
|
+
self
|
13
|
+
end
|
14
|
+
|
15
|
+
# reverse implies latest date will come first
|
16
|
+
def sort!(reverse=false)
|
17
|
+
return files.sort {|f1, f2| file_date(f1) <=> file_date(f2) } unless reverse
|
18
|
+
files.reverse
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def map_to_file_name
|
24
|
+
@files = files.map { |e| e.split(/\s+/).last.to_s }
|
25
|
+
end
|
26
|
+
|
27
|
+
def useless_files
|
28
|
+
[".", ".."]
|
29
|
+
end
|
30
|
+
|
31
|
+
def file_date(file)
|
32
|
+
DateTime.strptime(file.to_s, "VehicleInformation%m_%d_%Y_%H_%M_%S_%p.xml") rescue DateTime.new
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module AriFetch
|
2
|
+
|
3
|
+
class Vehicle
|
4
|
+
|
5
|
+
attr_accessor :vehicle
|
6
|
+
|
7
|
+
def initialize(vehicle)
|
8
|
+
@vehicle = vehicle
|
9
|
+
end
|
10
|
+
|
11
|
+
def result
|
12
|
+
OpenStruct.new(vehicle_data_with_downcased_keys)
|
13
|
+
end
|
14
|
+
|
15
|
+
def available?
|
16
|
+
ari_action == "AVAILABLE"
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def vehicle_data_with_downcased_keys
|
22
|
+
downcased_hash = {}
|
23
|
+
vehicle.map{|k, v| downcased_hash.merge!({"#{k.downcase}" => v}) }
|
24
|
+
downcased_hash
|
25
|
+
end
|
26
|
+
|
27
|
+
def vin_number
|
28
|
+
vehicle["VIN"]
|
29
|
+
end
|
30
|
+
|
31
|
+
def ari_action
|
32
|
+
vehicle["ACTION"]
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/lib/ari_fetch/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
class
|
1
|
+
class CreateAriReadFiles < ActiveRecord::Migration
|
2
2
|
def self.up
|
3
|
-
create_table :
|
3
|
+
create_table :ari_read_files do |t|
|
4
4
|
t.string :name
|
5
5
|
|
6
6
|
t.timestamps
|
@@ -8,6 +8,6 @@ class CreateAriFiles < ActiveRecord::Migration
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.down
|
11
|
-
drop_table :
|
11
|
+
drop_table :ari_read_files
|
12
12
|
end
|
13
13
|
end
|
data/spec/ari_spec.rb
CHANGED
@@ -2,6 +2,28 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe AriFetch::Engine do
|
4
4
|
|
5
|
-
|
5
|
+
let!(:engine) { AriFetch::Engine.new("184.168.187.1", "arixml", "ARIuser1!") }
|
6
|
+
|
7
|
+
context "initialize ari fetch" do
|
8
|
+
subject { engine }
|
9
|
+
|
10
|
+
context "fetch files from ftp" do
|
11
|
+
let!(:ftp_files) { engine.ftp_files }
|
12
|
+
subject { ftp_files }
|
13
|
+
its(:count) { should be > 0 }
|
14
|
+
end
|
15
|
+
|
16
|
+
context "read and unread files" do
|
17
|
+
its(:read_files){ should == [] }
|
18
|
+
let!(:ftp_files) { engine.ftp_files }
|
19
|
+
its(:unread_files) { should == ftp_files }
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
context "reading files and fetching data" do
|
25
|
+
subject { engine }
|
26
|
+
its(:read_files_from_start) { should == "Array" }
|
27
|
+
end
|
6
28
|
|
7
29
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ari_fetch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-06-
|
13
|
-
dependencies:
|
12
|
+
date: 2013-06-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: nokogiri
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
14
30
|
description: ARI
|
15
31
|
email:
|
16
32
|
- vivek@devbrother.com
|
@@ -23,9 +39,11 @@ files:
|
|
23
39
|
- LICENSE.txt
|
24
40
|
- README.md
|
25
41
|
- Rakefile
|
26
|
-
- app/models/ari_file.rb
|
27
42
|
- ari_fetch.gemspec
|
28
43
|
- lib/ari_fetch.rb
|
44
|
+
- lib/ari_fetch/ari_read_file.rb
|
45
|
+
- lib/ari_fetch/files.rb
|
46
|
+
- lib/ari_fetch/vehicle.rb
|
29
47
|
- lib/ari_fetch/version.rb
|
30
48
|
- lib/generators/ari_fetch/ari_fetch_generator.rb
|
31
49
|
- lib/generators/ari_fetch/templates/migration.rb
|