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 CHANGED
@@ -2,4 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in ari_fetch.gemspec
4
4
  gemspec
5
- gem 'rspec'
5
+ gem 'rspec'
6
+
7
+ # gem "activesupport"
8
+ # gem "rails"
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
- # gem.add_dependency "activesupport" , "~> 3.0.7"
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
- def initialize(*args)
8
- # do something
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
@@ -1,3 +1,3 @@
1
1
  module AriFetch
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -17,6 +17,6 @@ class AriFetchGenerator < Rails::Generators::Base
17
17
  end
18
18
 
19
19
  def create_migration_file
20
- migration_template 'migration.rb', 'db/migrate/create_ari_files_table.rb'
20
+ migration_template 'migration.rb', 'db/migrate/create_ari_read_files.rb'
21
21
  end
22
22
  end
@@ -1,6 +1,6 @@
1
- class CreateAriFiles < ActiveRecord::Migration
1
+ class CreateAriReadFiles < ActiveRecord::Migration
2
2
  def self.up
3
- create_table :ari_files do |t|
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 :ari_files
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
- pending "write it"
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.3
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-03 00:00:00.000000000 Z
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
@@ -1,5 +0,0 @@
1
- module AriFetch
2
- class AriFile < ActiveRecord::Base
3
- attr_accessible :name
4
- end
5
- end