stocker 1.0.9 → 1.0.11
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 +4 -4
- data/bin/stocker +3 -3
- data/lib/stocker.rb +113 -107
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 686956c7bc9f797fc08f15605611d577fc25b10f
|
4
|
+
data.tar.gz: 33982843ab23a9c96d18de1f961b5c106a2770e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f528c468255b345d6a42670949bcfe484f85bb2825223682460ff46938a792ac7c6d8c21511711443a33a1e5ed2eb8dc4bfa0aeecc7d7808e7f6f9988bc8518b
|
7
|
+
data.tar.gz: 1fb2f3187a81f17d4367bd47512a4fcbff34657963a9fbddef5864b5290857ad356cf74510f0d76f7c74058ec6634d8a0b1c627e172c89dcad758d2c9506dc48
|
data/bin/stocker
CHANGED
data/lib/stocker.rb
CHANGED
@@ -6,13 +6,14 @@ require 'thor'
|
|
6
6
|
require 'titleize'
|
7
7
|
|
8
8
|
# @author Brandon Pittman
|
9
|
+
module Stocker
|
10
|
+
class Generator < Thor
|
11
|
+
trap("SIGINT") { exit 0 }
|
9
12
|
|
10
|
-
|
11
|
-
trap("SIGINT") { exit 0 }
|
13
|
+
@@path = nil
|
12
14
|
|
13
|
-
|
15
|
+
private
|
14
16
|
|
15
|
-
no_commands do
|
16
17
|
def self.check_for_dropbox
|
17
18
|
home = Dir.home
|
18
19
|
db = "#{Dir.home}/Dropbox"
|
@@ -20,138 +21,143 @@ class Stocker < Thor
|
|
20
21
|
db_path = Pathname.new(db)
|
21
22
|
@@path = db_path || home_path
|
22
23
|
end
|
23
|
-
end
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
public
|
26
|
+
|
27
|
+
check_for_dropbox
|
28
|
+
#TODO: mv .stocker.yml .stocker.yaml if .stocker.yml exists
|
29
|
+
@@yaml = Pathname.new("#{@@path}/.stocker.yaml")
|
30
|
+
`touch #{@@yaml}`
|
31
|
+
@@stock = YAML.load(@@yaml.read)
|
32
|
+
@@stock = {} unless @@stock.class == Hash
|
33
|
+
|
34
|
+
private
|
30
35
|
|
31
|
-
no_commands do
|
32
36
|
def match_name(item)
|
33
37
|
@@stock.each_key { |key| @@item = key if key =~ /#{item}/ }
|
34
38
|
end
|
35
|
-
end
|
36
39
|
|
37
|
-
|
38
|
-
option :url, :aliases => :u, :default => 'http://amazon.com'
|
39
|
-
option :minimum, :aliases => :m, :default => 1
|
40
|
-
def new(item, total)
|
41
|
-
@@stock[item] = {'total' => total.to_i, 'min' => options[:min].to_i, 'url' => options[:url], 'checked' => Time.now}
|
42
|
-
end
|
40
|
+
public
|
43
41
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
desc "new ITEM TOTAL", "Add ITEM with TOTAL on hand to inventory."
|
43
|
+
option :url, :aliases => :u, :default => 'http://amazon.com'
|
44
|
+
option :minimum, :aliases => :m, :default => 1
|
45
|
+
def new(item, total)
|
46
|
+
@@stock[item] = {'total' => total.to_i, 'min' => options[:min].to_i, 'url' => options[:url], 'checked' => Time.now}
|
47
|
+
end
|
48
|
+
|
49
|
+
desc "delete ITEM", "Delete ITEM from inventory."
|
50
|
+
def delete(item)
|
51
|
+
match_name(item)
|
52
|
+
@@stock.delete(@@item)
|
53
|
+
end
|
49
54
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
55
|
+
desc "check", "Check for low stock items."
|
56
|
+
def check
|
57
|
+
@@stock.each do |key, value|
|
58
|
+
value["checked"] = Time.now
|
59
|
+
if value["total"] <= value["min"]
|
60
|
+
puts "You're running low on #{key}!"
|
61
|
+
buy(key)
|
62
|
+
end
|
57
63
|
end
|
58
64
|
end
|
59
|
-
end
|
60
65
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
66
|
+
desc "total ITEM TOTAL", "Set TOTAL of ITEM."
|
67
|
+
def total(item, total)
|
68
|
+
match_name(item)
|
69
|
+
@@stock[@@item]["total"] = total.to_i
|
70
|
+
time(item)
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
67
74
|
|
68
|
-
no_commands do
|
69
75
|
def time(item)
|
70
76
|
match_name(item)
|
71
77
|
@@stock[@@item]["checked"] = Time.now
|
72
78
|
end
|
73
|
-
end
|
74
79
|
|
75
|
-
no_commands do
|
76
80
|
def self.save
|
77
81
|
@@yaml.open('w') { |t| t << @@stock.to_yaml }
|
78
82
|
# @@yaml.write(@@stock.to_yaml)
|
79
83
|
end
|
80
|
-
end
|
81
84
|
|
82
|
-
|
83
|
-
def url(item, url)
|
84
|
-
match_name(item)
|
85
|
-
@@stock[@@item]["url"] = url
|
86
|
-
time(item)
|
87
|
-
end
|
85
|
+
public
|
88
86
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
desc "min ITEM MINIMUM", "Set minimum acceptable amount for ITEM."
|
96
|
-
def min(item, min)
|
97
|
-
match_name(item)
|
98
|
-
@@stock[@@item]["min"] = min.to_i
|
99
|
-
end
|
87
|
+
desc "url ITEM URL", "Set URL of ITEM."
|
88
|
+
def url(item, url)
|
89
|
+
match_name(item)
|
90
|
+
@@stock[@@item]["url"] = url
|
91
|
+
time(item)
|
92
|
+
end
|
100
93
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
value["total"] = ask("#{key.titlecase}:", *args).to_i
|
94
|
+
desc "buy ITEM", "Open link to buy ITEM"
|
95
|
+
def buy(item)
|
96
|
+
match_name(item)
|
97
|
+
`open -a Safari #{@@stock[@@item]["url"]}`
|
106
98
|
end
|
107
|
-
invoke :check
|
108
|
-
end
|
109
99
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
100
|
+
desc "min ITEM MINIMUM", "Set minimum acceptable amount for ITEM."
|
101
|
+
def min(item, min)
|
102
|
+
match_name(item)
|
103
|
+
@@stock[@@item]["min"] = min.to_i
|
104
|
+
end
|
114
105
|
|
115
|
-
|
116
|
-
|
117
|
-
List outputs a colorized list of all your inventory items.
|
118
|
-
|
119
|
-
Items that are well-stocked are green, items that are at the minimum acceptable will be yellow and out of stock items are red.
|
120
|
-
|
121
|
-
The items are smartly organized by the difference between the 'on-hand' count and the minimum acceptable amount.
|
122
|
-
|
123
|
-
example: I have 24 beers. I want to have at least 23 on hand at all times. I have 23 bags of chips, but I only need to have one at all times. The beer's difference is only one, but the chips' 22. So even though I have more beer, it will show up below chips in the list.
|
124
|
-
LONGDESC
|
125
|
-
def list
|
126
|
-
begin
|
127
|
-
@header = [[set_color("Item", :white), set_color("Total", :white)], [set_color("=================", :white), set_color("=====", :white)]]
|
128
|
-
@green = []
|
129
|
-
@yellow = []
|
130
|
-
@yellow2 = []
|
131
|
-
@green2 = []
|
132
|
-
@red = []
|
133
|
-
@red2 = []
|
106
|
+
desc "count", "Take an interactive inventory."
|
107
|
+
def count
|
134
108
|
@@stock.each do |key, value|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
109
|
+
value["checked"] = Time.now
|
110
|
+
value["total"] = ask("#{key.titlecase}:", *args).to_i
|
111
|
+
end
|
112
|
+
invoke :check
|
113
|
+
end
|
114
|
+
|
115
|
+
desc "csv", "Write entire inventory as CSV."
|
116
|
+
def csv
|
117
|
+
@@stock.each { |key, value| puts "#{key.titlecase},#{value['total']},#{value['min']},#{value['url']},#{value['checked']}" }
|
118
|
+
end
|
119
|
+
|
120
|
+
desc "list", "List all inventory items and total on hand."
|
121
|
+
long_desc <<-LONGDESC
|
122
|
+
List outputs a colorized list of all your inventory items.
|
123
|
+
|
124
|
+
Items that are well-stocked are green, items that are at the minimum acceptable will be yellow and out of stock items are red.
|
125
|
+
|
126
|
+
The items are smartly organized by the difference between the 'on-hand' count and the minimum acceptable amount.
|
127
|
+
|
128
|
+
example: I have 24 beers. I want to have at least 23 on hand at all times. I have 23 bags of chips, but I only need to have one at all times. The beer's difference is only one, but the chips' is 22. So even though I have more beer, it will show up below chips in the list.
|
129
|
+
LONGDESC
|
130
|
+
def list
|
131
|
+
begin
|
132
|
+
@header = [[set_color("Item", :white), set_color("Total", :white)], [set_color("=================", :white), set_color("=====", :white)]]
|
133
|
+
@green = []
|
134
|
+
@yellow = []
|
135
|
+
@yellow2 = []
|
136
|
+
@green2 = []
|
137
|
+
@red = []
|
138
|
+
@red2 = []
|
139
|
+
@@stock.each do |key, value|
|
140
|
+
if value['total'] > value['min']
|
141
|
+
@green += [[key.titlecase,value['total'], value['total']-value['min']]]
|
142
|
+
elsif value['total'] == value['min']
|
143
|
+
@yellow += [[key.titlecase,value['total'], value['total']-value['min']]]
|
144
|
+
else
|
145
|
+
@red += [[key.titlecase,value['total'], value['total']-value['min']]]
|
146
|
+
end
|
141
147
|
end
|
148
|
+
@green.sort_by! { |a,b,c| c }
|
149
|
+
@yellow.sort_by! { |a,b,c| c }
|
150
|
+
@red.sort_by! { |a,b,c| c }
|
151
|
+
@green.reverse!
|
152
|
+
@yellow.reverse!
|
153
|
+
@red.reverse!
|
154
|
+
@green.each { |a,b| @green2 += [[set_color(a, :green), set_color(b, :green)]] }
|
155
|
+
@yellow.each { |a,b| @yellow2 += [[set_color(a, :yellow), set_color(b, :yellow)]] }
|
156
|
+
@red.each { |a,b| @red2 += [[set_color(a, :red), set_color(b, :red)]] }
|
157
|
+
print_table(@header + @green2 + @yellow2 + @red2,{indent: 2})
|
158
|
+
rescue Exception => e
|
159
|
+
puts "Inventory empty"
|
142
160
|
end
|
143
|
-
@green.sort_by! { |a,b,c| c }
|
144
|
-
@yellow.sort_by! { |a,b,c| c }
|
145
|
-
@red.sort_by! { |a,b,c| c }
|
146
|
-
@green.reverse!
|
147
|
-
@yellow.reverse!
|
148
|
-
@red.reverse!
|
149
|
-
@green.each { |a,b| @green2 += [[set_color(a, :green), set_color(b, :green)]] }
|
150
|
-
@yellow.each { |a,b| @yellow2 += [[set_color(a, :yellow), set_color(b, :yellow)]] }
|
151
|
-
@red.each { |a,b| @red2 += [[set_color(a, :red), set_color(b, :red)]] }
|
152
|
-
print_table(@header + @green2 + @yellow2 + @red2,{indent: 2})
|
153
|
-
rescue Exception => e
|
154
|
-
puts "Inventory empty"
|
155
161
|
end
|
156
162
|
end
|
157
|
-
end
|
163
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stocker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Pittman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -47,7 +47,7 @@ extra_rdoc_files: []
|
|
47
47
|
files:
|
48
48
|
- bin/stocker
|
49
49
|
- lib/stocker.rb
|
50
|
-
homepage: http://
|
50
|
+
homepage: http://github.com/brandonpittman/stocker
|
51
51
|
licenses:
|
52
52
|
- MIT
|
53
53
|
metadata: {}
|
@@ -67,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
67
|
version: '0'
|
68
68
|
requirements: []
|
69
69
|
rubyforge_project:
|
70
|
-
rubygems_version: 2.2.
|
70
|
+
rubygems_version: 2.2.1
|
71
71
|
signing_key:
|
72
72
|
specification_version: 4
|
73
73
|
summary: stocker is a lightweight home inventory application.
|