jensen 0.2.3
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.
- checksums.yaml +7 -0
- data/bin/convert_csv.rb +21 -0
- data/lib/jensen.rb +144 -0
- data/lib/jensen/version.rb +3 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dfff673a9b75f33e3a4f694cfd5a1ef698534d3f
|
4
|
+
data.tar.gz: 34e05d08839c72002228e97faf95b2fb60dbe571
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9855e78005c276e740f3827c3f7e4912da61ef849eadbef83622a877c9527b542d56392c1ec2c650a69df7d6b995597d392d0adab399314663f096bdbc5d0535
|
7
|
+
data.tar.gz: 126dd7792777bbfd1d90e9a715281831025409c9229e5ccd8ca06a3d052eeac39ecbf93cd7c9b0a947786ac54d9bd74490858fbc046194f1e9c114d86f4f6d28
|
data/bin/convert_csv.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'csv'
|
4
|
+
require 'json'
|
5
|
+
require_relative '../lib/jensen.rb'
|
6
|
+
|
7
|
+
file = ARGF.file
|
8
|
+
|
9
|
+
# Get file path, Convert filepath -> CSV::Table
|
10
|
+
table = CSV.parse(file, headers: true, row_sep: :auto)
|
11
|
+
|
12
|
+
# CSV::Table -> Array of Jensen::Products
|
13
|
+
# There needs to be a way to weed out products with no stock.
|
14
|
+
products = table.map do |row|
|
15
|
+
Jensen::Product.new(row)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Jenson::Products -> JSON text
|
19
|
+
json = products.map!(&:to_message).to_json
|
20
|
+
|
21
|
+
print json
|
data/lib/jensen.rb
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'flowlink_data'
|
2
|
+
require 'active_support/inflector'
|
3
|
+
|
4
|
+
module Jensen
|
5
|
+
class Product < Flowlink::Product
|
6
|
+
class ProductError < StandardError; end
|
7
|
+
class NoPriceError < ProductError; end
|
8
|
+
|
9
|
+
def initialize(product)
|
10
|
+
@product = product.to_hash
|
11
|
+
end
|
12
|
+
|
13
|
+
def id
|
14
|
+
@product['upc'].to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def name
|
18
|
+
@product['title'].to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
def sku
|
22
|
+
@product['sku'].to_s
|
23
|
+
end
|
24
|
+
|
25
|
+
def description
|
26
|
+
@product['description'].to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def price
|
30
|
+
map, msrp = @product['map'], @product['msrp']
|
31
|
+
|
32
|
+
# TODO: optional block to set price
|
33
|
+
price = nil
|
34
|
+
price = map unless map.to_f.zero? # assigns if map isn't: 0, 0.0, '', nil
|
35
|
+
price ||= msrp unless msrp.to_f.zero?
|
36
|
+
raise(NoPriceError) if price.nil?
|
37
|
+
|
38
|
+
price.to_f
|
39
|
+
end
|
40
|
+
|
41
|
+
def cost_price
|
42
|
+
@product['cost'].to_f
|
43
|
+
end
|
44
|
+
|
45
|
+
def permalink
|
46
|
+
name.parameterize
|
47
|
+
end
|
48
|
+
|
49
|
+
def meta_description
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
|
53
|
+
def meta_keywords
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def shipping_category
|
58
|
+
'default'
|
59
|
+
end
|
60
|
+
|
61
|
+
def brand
|
62
|
+
@product['brand']
|
63
|
+
end
|
64
|
+
|
65
|
+
def taxons
|
66
|
+
@product['category'].split('&&').map { |group| group.split('|') }
|
67
|
+
end
|
68
|
+
|
69
|
+
def options
|
70
|
+
# There are no Jensen options, so just return empty array
|
71
|
+
[]
|
72
|
+
end
|
73
|
+
|
74
|
+
def properties
|
75
|
+
# return attributes merged with misc_properties, or if no attributes,
|
76
|
+
# just misc properties
|
77
|
+
if attributes.nil?
|
78
|
+
misc_properties
|
79
|
+
else
|
80
|
+
# Because of the format of CSV input, attributes can contain keys with
|
81
|
+
# empty or nil names. These need to be filtered out.
|
82
|
+
# Normally I would break out anything that handles input formatting out
|
83
|
+
# into something else, but this is a small piece that I don't think
|
84
|
+
# will interfere with anything else. If it grows any bigger, or starts
|
85
|
+
# showing bugs, it would be a good idea to put this elsewhere -CDL
|
86
|
+
attributes.reject { |(k, _)| k.nil? || k.empty? }
|
87
|
+
.merge(misc_properties)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def images
|
92
|
+
image_fields = @product.select { |(k, _)| k =~ /\Aimage_.+/ }
|
93
|
+
group_by_index(image_fields)
|
94
|
+
.map { |g| Hash[g.map { |k, v| [rename_image_key(k), v] }] }
|
95
|
+
.reject { |image| image['title'].nil? || image['title'].empty? } # Should be? #to_f#zero?
|
96
|
+
.reject { |image| image['url'].nil? || image['url'].empty? }
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def rename_image_key(image_key)
|
102
|
+
lookup = { 'reference' => 'url', 'name' => 'title' }
|
103
|
+
lookup[image_key.match(/image_(\w+)_\d+/).captures[0]]
|
104
|
+
end
|
105
|
+
|
106
|
+
def group_by_index(fields)
|
107
|
+
# returns an array of hashes
|
108
|
+
fields.group_by { |k, _| /(\d+)\z/.match(k).captures[0] }
|
109
|
+
.values.map { |group| Hash[group] }
|
110
|
+
end
|
111
|
+
|
112
|
+
def attributes
|
113
|
+
# Return attribute fields from product, formated as a proper hash
|
114
|
+
# Ugly. Works for now though
|
115
|
+
attributes = @product.select { |k, _| k =~ /attribute_.+/ }
|
116
|
+
attributes = group_by_index(attributes).map do |attribute|
|
117
|
+
name = attribute.detect { |k, _| k.include? 'name' }[1]
|
118
|
+
value = attribute.detect { |k, _| k.include? 'value' }[1]
|
119
|
+
{ name => value }
|
120
|
+
end.reduce(&:merge) # Array of hashes -> Hash
|
121
|
+
end
|
122
|
+
|
123
|
+
def misc_properties
|
124
|
+
prop_list = %w(condition height length width dimension_units dsco_create_date
|
125
|
+
dsco_item_id dsco_last_quantity_update_date dsco_last_update_date
|
126
|
+
dsco_product_id dsco_supplier_id dsco_supplier_name weight
|
127
|
+
weight_units min_purchase_quantity status quantity_available
|
128
|
+
quantity_on_order mpn)
|
129
|
+
# List -> Hash -> Hash
|
130
|
+
@product.select do |k, _|
|
131
|
+
prop_list.include?(k)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def available_on
|
136
|
+
Date.today.iso8601 # could use #to_s, but format is explicit this way.
|
137
|
+
end
|
138
|
+
|
139
|
+
def variants
|
140
|
+
# The Jensen product data doesn't have any sort of variants field.
|
141
|
+
[]
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jensen
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Cooper LeBrun
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-04-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: flowlink_data
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4'
|
41
|
+
description: 'Feed hashable product objects into Jensen::Product.new, get Flowlink
|
42
|
+
product hashes with #to_message.'
|
43
|
+
email:
|
44
|
+
- cooperlebrun@gmail.com
|
45
|
+
executables:
|
46
|
+
- convert_csv.rb
|
47
|
+
extensions: []
|
48
|
+
extra_rdoc_files: []
|
49
|
+
files:
|
50
|
+
- bin/convert_csv.rb
|
51
|
+
- lib/jensen.rb
|
52
|
+
- lib/jensen/version.rb
|
53
|
+
homepage: https://github.com/aokpower/jensen
|
54
|
+
licenses:
|
55
|
+
- MIT
|
56
|
+
metadata: {}
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options: []
|
59
|
+
require_paths:
|
60
|
+
- lib
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '0'
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
requirements: []
|
72
|
+
rubyforge_project:
|
73
|
+
rubygems_version: 2.5.1
|
74
|
+
signing_key:
|
75
|
+
specification_version: 4
|
76
|
+
summary: Get flowlink data from Jensen info.
|
77
|
+
test_files: []
|
78
|
+
has_rdoc:
|