ari_fetch 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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