idata 0.1.29 → 0.1.30
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/iload +2 -2
- data/full.sh +580 -0
- data/lib/idata/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 13ad27d50840b035ef83001024e8845ded2952cb
|
|
4
|
+
data.tar.gz: 84385db902e4ea8a32b550530087235bd3381a1f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1859b4bb2dbf3ed6de6f592e7f9a61bbaefeaef2afcaed3ecafbae566e7f1152c1bbd214f8d95e0113cfdc358036fc36e8319348bfbfed2a73948e993bd853ec
|
|
7
|
+
data.tar.gz: a2a5984979e156aaa75048eade81ec31de2a90052758c03557f71875727a4fa6576459c5b34f565a3493b3a3a52a9ae66c501ee008acff80fe28f7cfe8dcaedc
|
data/bin/iload
CHANGED
|
@@ -177,8 +177,8 @@ $csv_converters = []
|
|
|
177
177
|
$csv_converters << :null_converter if $options[:null]
|
|
178
178
|
|
|
179
179
|
CSV::Converters[:null_converter] = lambda{ |s|
|
|
180
|
-
return nil if s == $options[:null] or s == ""
|
|
181
|
-
return s
|
|
180
|
+
return nil if s == $options[:null] or s == "" or s.nil?
|
|
181
|
+
return s.strip
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
class String
|
data/full.sh
ADDED
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# SHARED VARIABLES
|
|
4
|
+
# ---------------------------------------------------------------------------------
|
|
5
|
+
# Database to store data tables
|
|
6
|
+
ORGNAME="sample"
|
|
7
|
+
|
|
8
|
+
# ENV variables used by the validation command
|
|
9
|
+
export HOST="localhost"
|
|
10
|
+
export USERNAME="postgres"
|
|
11
|
+
export PASSWORD="extr!me"
|
|
12
|
+
export DATABASE="$ORGNAME"
|
|
13
|
+
export LISTEN=5432
|
|
14
|
+
|
|
15
|
+
# Create temporary output folder
|
|
16
|
+
OUTPUT_DIR="/tmp/$ORGNAME" && test -e $OUTPUT_DIR || mkdir $OUTPUT_DIR
|
|
17
|
+
|
|
18
|
+
# Input files and correspondings names
|
|
19
|
+
FCONTRACTO="ContractMaster.csv"
|
|
20
|
+
FVENDOR="VendorMaster.csv"
|
|
21
|
+
FITEM="ItemMaster.csv"
|
|
22
|
+
FINVOICE="InvoiceHistory.csv"
|
|
23
|
+
FMFR="MfrMaster.csv"
|
|
24
|
+
FPO="PurchaseOrder.csv"
|
|
25
|
+
FUSER="User.csv"
|
|
26
|
+
FLOCATION="Location.csv"
|
|
27
|
+
FITEMCOST="ItemCostCenterAcctExceptions.csv"
|
|
28
|
+
FREQ="ReqHistoryLoad.csv"
|
|
29
|
+
FGL="GLAccount.csv"
|
|
30
|
+
FINVENTORY="Inventory.csv"
|
|
31
|
+
|
|
32
|
+
CONTRACTO="contracts"
|
|
33
|
+
VENDOR="vendors"
|
|
34
|
+
ITEM="items"
|
|
35
|
+
INVOICE="invoices"
|
|
36
|
+
MFR="manufacturers"
|
|
37
|
+
PO="purchase_orders"
|
|
38
|
+
USER="users"
|
|
39
|
+
LOCATION="locations"
|
|
40
|
+
ITEMCOST="item_costs"
|
|
41
|
+
REQ="reqs"
|
|
42
|
+
GL="gls"
|
|
43
|
+
INVENTORY="inventory"
|
|
44
|
+
|
|
45
|
+
# Standard UOM for reference
|
|
46
|
+
FUOMSTD="stduom.txt"
|
|
47
|
+
UOMSTD="uomstd"
|
|
48
|
+
|
|
49
|
+
# ---------------------------------------------------------------------------------
|
|
50
|
+
# LOAD
|
|
51
|
+
# ---------------------------------------------------------------------------------
|
|
52
|
+
# Sanitize input files
|
|
53
|
+
#isanitize --strip-newline --remove=65279 "$FCONTRACTO" "$FVENDOR" "$FITEM" "$FINVOICE" "$FMFR" "$FPO" \
|
|
54
|
+
# "$FTMPL" "$FUSER" "$FITEMEXPO" "$FUSEREQ" "$FLOCATION" "$FITEMCOST" "$FREQ" \
|
|
55
|
+
# "$FGL" "$FUSERCOST" "$FINVENTORY" "$FUSERCREATEREQ"
|
|
56
|
+
|
|
57
|
+
# Load
|
|
58
|
+
iload -i "$FCONTRACTO" -t "$CONTRACTO" -f csv
|
|
59
|
+
iload -i "$FVENDOR" -t "$VENDOR" -f csv
|
|
60
|
+
iload -i "$FITEM" -t "$ITEM" -f csv
|
|
61
|
+
iload -i "$FINVOICE" -t "$INVOICE" -f csv
|
|
62
|
+
iload -i "$FMFR" -t "$MFR" -f csv
|
|
63
|
+
iload -i "$FPO" -t "$PO" -f csv
|
|
64
|
+
iload -i "$FUSER" -t "$USER" -f csv
|
|
65
|
+
iload -i "$FLOCATION" -t "$LOCATION" -f csv
|
|
66
|
+
iload -i "$FITEMCOST" -t "$ITEMCOST" -f csv
|
|
67
|
+
iload -i "$FREQ" -t "$REQ" -f csv
|
|
68
|
+
iload -i "$FGL" -t "$GL" -f csv
|
|
69
|
+
iload -i "$FINVENTORY" -t "$INVENTORY" -f csv
|
|
70
|
+
|
|
71
|
+
# Load UOM STANDARD for reference
|
|
72
|
+
iload -i "$FUOMSTD" -t "$UOMSTD" -f csv
|
|
73
|
+
|
|
74
|
+
# ---------------------------------------------------------------------------------
|
|
75
|
+
# INDEXING (for speeding up validation queries)
|
|
76
|
+
# ---------------------------------------------------------------------------------
|
|
77
|
+
ipatch -q "drop index if exists items_item_id_index; create index items_item_id_index on $ITEM(item_id)"
|
|
78
|
+
ipatch -q "drop index if exists pos_item_id_index; create index pos_item_id_index on $PO(item_id)"
|
|
79
|
+
ipatch -q "drop index if exists gls_corp_acct_no_index; create index gls_corp_acct_no_index on $GL(corp_acct_no)"
|
|
80
|
+
ipatch -q "drop index if exists gls_corp_acct_name_index; create index gls_corp_acct_name_index on $GL(corp_acct_name)"
|
|
81
|
+
ipatch -q "drop index if exists gls_cc_acct_no_index; create index gls_cc_acct_no_index on $GL(cc_acct_no)"
|
|
82
|
+
ipatch -q "drop index if exists gls_cc_acct_name_index; create index gls_cc_acct_name_index on $GL(cc_acct_name)"
|
|
83
|
+
ipatch -q "drop index if exists locations_name_index; create index locations_name_index on $LOCATION(name)"
|
|
84
|
+
|
|
85
|
+
# ---------------------------------------------------------------------------------
|
|
86
|
+
# Some adjustment
|
|
87
|
+
# ---------------------------------------------------------------------------------
|
|
88
|
+
ipatch -q "
|
|
89
|
+
-- Normalize values
|
|
90
|
+
UPDATE $ITEM set active = '1' where active = 'Y';
|
|
91
|
+
UPDATE items set active = '3' where active = 'N';
|
|
92
|
+
"
|
|
93
|
+
|
|
94
|
+
ipatch -q "
|
|
95
|
+
-- Extract FIRST_NAME, LAST_NAME from NAME
|
|
96
|
+
ALTER TABLE $USER ADD COLUMN first_name varchar;
|
|
97
|
+
ALTER TABLE $USER ADD COLUMN last_name varchar;
|
|
98
|
+
UPDATE $USER SET username = trim(regexp_replace(username, '\s+', ' ', 'g'));
|
|
99
|
+
UPDATE $USER SET first_name = username, last_name = username
|
|
100
|
+
WHERE array_length(string_to_array(username, ' '), 1) = 1;
|
|
101
|
+
UPDATE $USER SET first_name = substring(username, '^[^\s]+'),
|
|
102
|
+
last_name = regexp_replace(username, '^[^\s]+\s', '', 'g')
|
|
103
|
+
WHERE array_length(string_to_array(username, ' '), 1) >= 2;
|
|
104
|
+
"
|
|
105
|
+
|
|
106
|
+
ipatch -q "
|
|
107
|
+
-- ADD EMAIL COLUMN
|
|
108
|
+
ALTER TABLE $USER ADD COLUMN email VARCHAR;
|
|
109
|
+
UPDATE $USER SET email = userlogin;
|
|
110
|
+
"
|
|
111
|
+
|
|
112
|
+
ipatch -q "
|
|
113
|
+
-- FIX ISSUE WITH linebreak
|
|
114
|
+
update items set vendor_item_id = (string_to_array(regexp_replace(replace(vendor_item_id, E'\r\n', ' '), '\s+', ' ', 'g'), ' '))[1]
|
|
115
|
+
where vendor_item_id like E'%\r\n%';
|
|
116
|
+
update purchase_orders set vendor_item_id = (string_to_array(regexp_replace(replace(vendor_item_id, E'\r\n', ' '), '\s+', ' ', 'g'), ' '))[1]
|
|
117
|
+
where vendor_item_id like E'%\r\n%';
|
|
118
|
+
update purchase_orders set vendor_item_id = (string_to_array(regexp_replace(replace(vendor_item_id, E'\n', ' '), '\s+', ' ', 'g'), ' '))[1]
|
|
119
|
+
where vendor_item_id like E'%\n%';
|
|
120
|
+
"
|
|
121
|
+
|
|
122
|
+
ipatch -q "
|
|
123
|
+
-- Normalize DATE
|
|
124
|
+
UPDATE $PO SET po_date = to_char(to_date(po_date, 'MM/DD/YYYY'), 'YYYY-MM-DD')
|
|
125
|
+
WHERE po_date IS NOT NULL AND po_date != '';
|
|
126
|
+
UPDATE $CONTRACTO SET contract_start = to_char(to_date(contract_start, 'MM/DD/YYYY'), 'YYYY-MM-DD')
|
|
127
|
+
WHERE contract_start like '%/%/%';
|
|
128
|
+
UPDATE $CONTRACTO SET contract_end = to_char(to_date(contract_end, 'MM/DD/YYYY'), 'YYYY-MM-DD')
|
|
129
|
+
WHERE contract_end like '%/%/%';
|
|
130
|
+
|
|
131
|
+
-- ADD MORE EMPTY FIELD (for validation)
|
|
132
|
+
-- ALTER TABLE $LOCATION ADD COLUMN corp_id varchar;
|
|
133
|
+
|
|
134
|
+
-- FILL EMPTY FIELDS WITH DEFAULT VALUE
|
|
135
|
+
UPDATE $LOCATION SET ship_to_ind = 'N' WHERE ship_to_ind IS NULL OR LENGTH(trim(ship_to_ind)) = 0;
|
|
136
|
+
UPDATE $LOCATION SET bill_to_ind = 'N' WHERE bill_to_ind IS NULL OR LENGTH(trim(bill_to_ind)) = 0;
|
|
137
|
+
UPDATE $LOCATION SET stockless_ind = 'N' WHERE stockless_ind IS NULL OR LENGTH(trim(stockless_ind)) = 0;
|
|
138
|
+
"
|
|
139
|
+
|
|
140
|
+
# Convert A2A2A2 to A2-A2-A2
|
|
141
|
+
# Manual check and comment out the following to speed up validating
|
|
142
|
+
# @todo IEVAL performance is very poor, avoid using it (use IPATCH instead) unless there is no better way
|
|
143
|
+
ieval -t $GL --eval="
|
|
144
|
+
if item.corp_acct_fmt && item.corp_acct_fmt[/^[A-Z][0-9][A-Z][0-9][A-Z][0-9]$/]
|
|
145
|
+
item.corp_acct_fmt = item.corp_acct_fmt.unpack('a2a2a2').join('-')
|
|
146
|
+
end
|
|
147
|
+
"
|
|
148
|
+
|
|
149
|
+
# ---------------------------------------------------------------------------------
|
|
150
|
+
# VALIDATE
|
|
151
|
+
# ---------------------------------------------------------------------------------
|
|
152
|
+
# validate VENDORS
|
|
153
|
+
ivalidate --case-insensitive --pretty -t $VENDOR \
|
|
154
|
+
--log-to=validation_errors \
|
|
155
|
+
--not-null="vendor_code" \
|
|
156
|
+
--not-null="vendor_name" \
|
|
157
|
+
--unique="vendor_code" \
|
|
158
|
+
--unique="vendor_name" \
|
|
159
|
+
--match="vendor_code/[a-zA-Z0-9]/" \
|
|
160
|
+
--match="vendor_name/[a-zA-Z0-9]/" \
|
|
161
|
+
--consistent-by="vendor_code|vendor_name" \
|
|
162
|
+
--consistent-by="vendor_name|vendor_code" \
|
|
163
|
+
--consistent-by="country_code|country_name" \
|
|
164
|
+
--consistent-by="country_name|country_code"
|
|
165
|
+
|
|
166
|
+
# validate MANUFACTURERS
|
|
167
|
+
ivalidate --case-insensitive --pretty -t $MFR \
|
|
168
|
+
--log-to=validation_errors \
|
|
169
|
+
--not-null="mfr_number" \
|
|
170
|
+
--not-null="mfr_name" \
|
|
171
|
+
--match="mfr_number/[a-zA-Z0-9]/" \
|
|
172
|
+
--match="mfr_name/[a-zA-Z0-9]/" \
|
|
173
|
+
--consistent-by="mfr_number|mfr_name" \
|
|
174
|
+
--consistent-by="mfr_name|mfr_number" \
|
|
175
|
+
--consistent-by="country_code|country_name" \
|
|
176
|
+
--consistent-by="country_name|country_code"
|
|
177
|
+
|
|
178
|
+
# validate GL
|
|
179
|
+
ivalidate --case-insensitive --pretty -t $GL \
|
|
180
|
+
--log-to=validation_errors \
|
|
181
|
+
--not-null=corp_acct_no \
|
|
182
|
+
--match="corp_acct_no/[a-zA-Z0-9]/" \
|
|
183
|
+
--not-null=corp_acct_name \
|
|
184
|
+
--match="corp_acct_name/[a-zA-Z0-9]/" \
|
|
185
|
+
--not-null=corp_acct_fmt \
|
|
186
|
+
--match="corp_acct_fmt/^[A-Z][0-9]-[A-Z][0-9]-[A-Z][0-9]$/" \
|
|
187
|
+
--not-null=cc_acct_no \
|
|
188
|
+
--match="cc_acct_no/[a-zA-Z0-9]/" \
|
|
189
|
+
--not-null=cc_acct_name \
|
|
190
|
+
--match="cc_acct_name/[a-zA-Z0-9]/" \
|
|
191
|
+
--not-null=cc_acct_type \
|
|
192
|
+
--match="cc_acct_type/^(1|2|3|4|5|Asset|Liability|Equity|Income\sStatement|Expense|Income)$/" \
|
|
193
|
+
--not-null=exp_acct_no \
|
|
194
|
+
--match="exp_acct_no/[a-zA-Z0-9]/" \
|
|
195
|
+
--not-null=exp_acct_name \
|
|
196
|
+
--match="exp_acct_name/[a-zA-Z0-9]/" \
|
|
197
|
+
--consistent-by="corp_acct_no|corp_acct_name" \
|
|
198
|
+
--consistent-by="corp_acct_name|corp_acct_no" \
|
|
199
|
+
--consistent-by="exp_acct_no|corp_acct_no, corp_acct_name, cc_acct_no, cc_acct_name, exp_acct_name" \
|
|
200
|
+
--consistent-by="exp_acct_name|corp_acct_no, corp_acct_name, cc_acct_no, cc_acct_name, exp_acct_no" \
|
|
201
|
+
--consistent-by="cc_acct_no|corp_acct_no, corp_acct_name, cc_acct_name" \
|
|
202
|
+
--consistent-by="cc_acct_name|corp_acct_no, corp_acct_name, cc_acct_no" \
|
|
203
|
+
--not-null=exp_acct_type \
|
|
204
|
+
--match="exp_acct_type/^(1|2|3|4|5|Asset|Liability|Equity|Income\sStatement|Expense|Income)$/"
|
|
205
|
+
|
|
206
|
+
# validate LOCATION
|
|
207
|
+
ivalidate --case-insensitive --pretty -t $LOCATION \
|
|
208
|
+
--log-to=validation_errors \
|
|
209
|
+
--not-null=loc_id \
|
|
210
|
+
--match="loc_id/[a-zA-Z0-9]/" \
|
|
211
|
+
--not-null="name" \
|
|
212
|
+
--match="name/[a-zA-Z0-9]/" \
|
|
213
|
+
--not-null=facility_code \
|
|
214
|
+
--match="facility_code/[a-zA-Z0-9]/" \
|
|
215
|
+
--not-null=facility_desc \
|
|
216
|
+
--match="facility_desc/[a-zA-Z0-9]/" \
|
|
217
|
+
--match="ship_to_ind/^(Y|N)$/" \
|
|
218
|
+
--match="bill_to_ind/^(Y|N)$/" \
|
|
219
|
+
--match="stockless_ind/^(Y|N)$/" \
|
|
220
|
+
--not-null=loc_type \
|
|
221
|
+
--match="loc_type/^(C|S|LOC_TYPE_SUPPLY|LOC_TYPE_CONSUME)$/" \
|
|
222
|
+
--not-null=inventory_path_name \
|
|
223
|
+
--not-null=inventory_location_name \
|
|
224
|
+
--query="(route_no is null or route_no = '' or regexp_replace(route_no, '[,\.]', '', 'g') ~ '^[1-9][0-9]+$') -- invalid route_no" \
|
|
225
|
+
--rquery="(loc_type ~* '^(LOC_TYPE_SUPPLY|S)$' and (corp_acct_no is null or corp_name is null or corp_id is null)) -- either corp id/name or corp_acct_no is null" \
|
|
226
|
+
--not-null=active \
|
|
227
|
+
--match="active/^(Y|N)$/" \
|
|
228
|
+
--not-null=corp_acct_no \
|
|
229
|
+
--match="corp_acct_no/[a-zA-Z0-9]/" \
|
|
230
|
+
--not-null=inventory_loc_seq_no \
|
|
231
|
+
--match="inventory_loc_seq_no/^[1-9][0-9]*$/" \
|
|
232
|
+
--match="route_no/^[1-9][0-9]*$/" \
|
|
233
|
+
--match="route_name/[a-zA-Z0-9]/" \
|
|
234
|
+
--match="corp_name/[a-zA-Z0-9]/" \
|
|
235
|
+
--consistent-by="corp_name|corp_id" \
|
|
236
|
+
--consistent-by="corp_id|corp_name" \
|
|
237
|
+
--consistent-by="name|facility_code, loc_id" \
|
|
238
|
+
--consistent-by="loc_id|facility_code, name" \
|
|
239
|
+
--cross-reference="inventory_path_name|$LOCATION.name" \
|
|
240
|
+
--cross-reference="inventory_location_name|$LOCATION.name" \
|
|
241
|
+
--cross-reference="corp_id|$GL.corp_acct_no" \
|
|
242
|
+
--cross-reference="corp_name|$GL.corp_acct_name"
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
# validate CONTRACTS ORIGINAL
|
|
246
|
+
ivalidate --case-insensitive --pretty -t $CONTRACTO \
|
|
247
|
+
--log-to=validation_errors \
|
|
248
|
+
--not-null=contract_number \
|
|
249
|
+
--not-null=contract_start \
|
|
250
|
+
--not-null=contract_end \
|
|
251
|
+
--not-null=vendor_name \
|
|
252
|
+
--not-null=mfr_item_id \
|
|
253
|
+
--not-null=mfr_name \
|
|
254
|
+
--not-null=item_uom \
|
|
255
|
+
--not-null=item_qoe \
|
|
256
|
+
--not-null=contract_price \
|
|
257
|
+
--not-null=contract_gpo_name \
|
|
258
|
+
--match="contract_number/[a-zA-Z0-9]/" \
|
|
259
|
+
--match="corp_name/[a-zA-Z0-9]/" \
|
|
260
|
+
--match="vendor_item_id/[a-zA-Z0-9]/" \
|
|
261
|
+
--match="vendor_name/[a-zA-Z0-9]/" \
|
|
262
|
+
--match="mfr_item_id/[a-zA-Z0-9]/" \
|
|
263
|
+
--match="mfr_name/[a-zA-Z0-9]/" \
|
|
264
|
+
--query="to_date(contract_end, 'YYYY-MM-DD') >= to_date(contract_start, 'YYYY-MM-DD') -- Contract end-date goes before start-date" \
|
|
265
|
+
--match="contract_status/^(1|2|3|A|I|Inactive|Active|Y)$/" \
|
|
266
|
+
--match="item_status/^(1|2|3|A|I|Inactive|Active|Y)$/" \
|
|
267
|
+
--consistent-by="corp_id|corp_name" \
|
|
268
|
+
--consistent-by="corp_name|corp_id" \
|
|
269
|
+
--consistent-by="mfr_number|mfr_name" \
|
|
270
|
+
--consistent-by="mfr_name|mfr_number" \
|
|
271
|
+
--consistent-by="vendor_code|vendor_name" \
|
|
272
|
+
--consistent-by="vendor_name|vendor_code" \
|
|
273
|
+
--cross-reference="vendor_name|$VENDOR.vendor_name" \
|
|
274
|
+
--cross-reference="mfr_name|$MFR.mfr_name" \
|
|
275
|
+
--cross-reference="corp_id|$GL.corp_acct_no" \
|
|
276
|
+
--cross-reference="corp_name|$GL.corp_acct_name" \
|
|
277
|
+
--match="contract_price/^[0-9]+(\.{0,1}[0-9]+|[0-9]*)$/" \
|
|
278
|
+
--match="item_qoe/^[0-9]+(\.{0,1}[0-9]+|[0-9]*)$/" \
|
|
279
|
+
--rquery="(item_uom NOT IN (SELECT code FROM uomstd) AND item_uom !~ '^[a-zA-Z0-9]{1,3}$') -- invalid item_uom" \
|
|
280
|
+
--unique="contract_gpo_name, contract_number, contract_start, contract_end, vendor_name, mfr_item_id, mfr_name, item_uom, corp_id" \
|
|
281
|
+
|
|
282
|
+
# validate ITEM
|
|
283
|
+
# Accepted:
|
|
284
|
+
# --rquery="mfr_name IN (SELECT mfr_name FROM $ITEM WHERE mfr_name IS NOT NULL GROUP BY mfr_name HAVING count(DISTINCT mfr_number) > 1) -- same mfr_name but with different mfr_number" \
|
|
285
|
+
ivalidate --case-insensitive --pretty -t $ITEM \
|
|
286
|
+
--log-to=validation_errors \
|
|
287
|
+
--not-null="item_id" \
|
|
288
|
+
--match="item_id/[a-zA-Z0-9]/" \
|
|
289
|
+
--not-null="item_descr" \
|
|
290
|
+
--match="item_descr/[a-zA-Z0-9]/" \
|
|
291
|
+
--not-null="item_uom" \
|
|
292
|
+
--not-null="default_uom" \
|
|
293
|
+
--not-null="item_price" \
|
|
294
|
+
--not-null="item_qoe" \
|
|
295
|
+
--not-null="corp_id" \
|
|
296
|
+
--not-null="corp_name" \
|
|
297
|
+
--not-null="vendor_code" \
|
|
298
|
+
--not-null="vendor_name" \
|
|
299
|
+
--not-null="mfr_number" \
|
|
300
|
+
--not-null="mfr_name" \
|
|
301
|
+
--not-null="active" \
|
|
302
|
+
--match="corp_id/[a-zA-Z0-9]/" \
|
|
303
|
+
--match="corp_name/[a-zA-Z0-9]/" \
|
|
304
|
+
--match="vendor_code/[a-zA-Z0-9]/" \
|
|
305
|
+
--match="vendor_name/[a-zA-Z0-9]/" \
|
|
306
|
+
--match="mfr_number/[a-zA-Z0-9]/" \
|
|
307
|
+
--match="mfr_name/[a-zA-Z0-9]/" \
|
|
308
|
+
--match="active/^(1|2|3|A|I)$/" \
|
|
309
|
+
--cross-reference="vendor_code|$VENDOR.vendor_code" \
|
|
310
|
+
--cross-reference="vendor_name|$VENDOR.vendor_name" \
|
|
311
|
+
--cross-reference="mfr_number|$MFR.mfr_number" \
|
|
312
|
+
--cross-reference="mfr_name|$MFR.mfr_name" \
|
|
313
|
+
--cross-reference="corp_id|$GL.corp_acct_no" \
|
|
314
|
+
--cross-reference="corp_name|$GL.corp_acct_name" \
|
|
315
|
+
--consistent-by="corp_id|corp_name" \
|
|
316
|
+
--consistent-by="corp_name|corp_id" \
|
|
317
|
+
--consistent-by="mfr_number|mfr_name" \
|
|
318
|
+
--consistent-by="mfr_name|mfr_number" \
|
|
319
|
+
--consistent-by="vendor_code|vendor_name" \
|
|
320
|
+
--consistent-by="vendor_name|vendor_code" \
|
|
321
|
+
--rquery="(item_uom NOT IN (SELECT code FROM uomstd) AND item_uom !~ '^[a-zA-Z0-9]{1,3}$') -- invalid item_uom" \
|
|
322
|
+
--rquery="(default_uom NOT IN (SELECT code FROM uomstd) AND default_uom !~ '^[a-zA-Z0-9]{1,3}$') -- invalid default_uom" \
|
|
323
|
+
--match="item_price/^[0-9]+(\.{0,1}[0-9]+|[0-9]*)$/" \
|
|
324
|
+
--match="item_qoe/^[0-9]+(\.{0,1}[0-9]+|[0-9]*)$/"
|
|
325
|
+
|
|
326
|
+
# validate PO
|
|
327
|
+
ivalidate --case-insensitive --pretty -t $PO \
|
|
328
|
+
--log-to=validation_errors \
|
|
329
|
+
--not-null=po_no \
|
|
330
|
+
--match="po_no/[a-zA-Z0-9]/" \
|
|
331
|
+
--not-null=po_date \
|
|
332
|
+
--not-null=corp_id \
|
|
333
|
+
--match="corp_id/[a-zA-Z0-9]/" \
|
|
334
|
+
--not-null=corp_name \
|
|
335
|
+
--match="corp_name/[a-zA-Z0-9]/" \
|
|
336
|
+
--not-null=cost_center_id \
|
|
337
|
+
--match="cost_center_id/[a-zA-Z0-9]/" \
|
|
338
|
+
--not-null=cost_center_name \
|
|
339
|
+
--match="cost_center_name/[a-zA-Z0-9]/" \
|
|
340
|
+
--not-null=po_line_number \
|
|
341
|
+
--match="po_line_number/^[1-9][0-9]*$/" \
|
|
342
|
+
--not-null=item_id \
|
|
343
|
+
--match="item_id/[a-zA-Z0-9]/" \
|
|
344
|
+
--not-null=vendor_name \
|
|
345
|
+
--match="vendor_name/[a-zA-Z0-9]/" \
|
|
346
|
+
--not-null=vendor_code \
|
|
347
|
+
--match="vendor_code/[a-zA-Z0-9]/" \
|
|
348
|
+
--not-null=mfr_name \
|
|
349
|
+
--match="mfr_name/[a-zA-Z0-9]/" \
|
|
350
|
+
--not-null=mfr_number \
|
|
351
|
+
--match="mfr_number/[a-zA-Z0-9]/" \
|
|
352
|
+
--not-null=item_descr \
|
|
353
|
+
--consistent-by="corp_id|corp_name" \
|
|
354
|
+
--consistent-by="corp_name|corp_id" \
|
|
355
|
+
--consistent-by="vendor_code|vendor_name" \
|
|
356
|
+
--consistent-by="vendor_name|vendor_code" \
|
|
357
|
+
--consistent-by="mfr_name|mfr_number" \
|
|
358
|
+
--unique="po_no, po_line_number" \
|
|
359
|
+
--rquery="(item_id not like '%~%' and item_id not in (select item_id from items)) -- item_id does not reference items.item_id" \
|
|
360
|
+
--cross-reference="vendor_code|$VENDOR.vendor_code" \
|
|
361
|
+
--cross-reference="vendor_name|$VENDOR.vendor_name" \
|
|
362
|
+
--cross-reference="mfr_number|$MFR.mfr_number" \
|
|
363
|
+
--cross-reference="mfr_name|$MFR.mfr_name" \
|
|
364
|
+
--cross-reference="corp_id|$GL.corp_acct_no" \
|
|
365
|
+
--cross-reference="corp_name|$GL.corp_acct_name" \
|
|
366
|
+
--cross-reference="cost_center_id|$GL.cc_acct_no" \
|
|
367
|
+
--cross-reference="cost_center_name|$GL.cc_acct_name" \
|
|
368
|
+
--rquery="(purchase_uom NOT IN (SELECT code FROM uomstd) AND purchase_uom !~ '^[a-zA-Z0-9]{1,3}$') -- invalid purchase_uom" \
|
|
369
|
+
--rquery="(item_id IS NOT NULL AND (vendor_code IS NOT NULL OR vendor_name IS NOT NULL) AND vendor_item_id IS NULL) -- vendor_item_id is null" \
|
|
370
|
+
--match="purchase_price/^[0-9]+(\.{0,1}[0-9]+|[0-9]*)$/" \
|
|
371
|
+
--match="purchase_qoe/^[0-9]+(\.{0,1}[0-9]+|[0-9]*)$/"
|
|
372
|
+
|
|
373
|
+
# do not check --match="item_descr/[a-zA-Z0-9]/" \
|
|
374
|
+
|
|
375
|
+
# validate Req
|
|
376
|
+
ivalidate --case-insensitive --pretty -t $REQ \
|
|
377
|
+
--log-to=validation_errors \
|
|
378
|
+
--not-null="req_no" \
|
|
379
|
+
--match="req_no/[a-zA-Z0-9]/" \
|
|
380
|
+
--not-null="req_date" \
|
|
381
|
+
--match="req_date/[a-zA-Z0-9]/" \
|
|
382
|
+
--not-null="corp_id" \
|
|
383
|
+
--match="corp_id/[a-zA-Z0-9]/" \
|
|
384
|
+
--not-null="corp_name" \
|
|
385
|
+
--match="corp_name/[a-zA-Z0-9]/" \
|
|
386
|
+
--not-null="req_line_number" \
|
|
387
|
+
--match="req_line_number/^[1-9][0-9]*$/" \
|
|
388
|
+
--not-null="item_id" \
|
|
389
|
+
--match="item_id/[a-zA-Z0-9]/" \
|
|
390
|
+
--not-null="vendor_name" \
|
|
391
|
+
--match="vendor_name/[a-zA-Z0-9]/" \
|
|
392
|
+
--not-null="vendor_code" \
|
|
393
|
+
--match="vendor_code/[a-zA-Z0-9]/" \
|
|
394
|
+
--not-null="mfr_name" \
|
|
395
|
+
--match="mfr_name/[a-zA-Z0-9]/" \
|
|
396
|
+
--not-null="item_descr" \
|
|
397
|
+
--match="item_descr/[a-zA-Z0-9]/" \
|
|
398
|
+
--consistent-by="corp_id|corp_name" \
|
|
399
|
+
--consistent-by="corp_name|corp_id" \
|
|
400
|
+
--rquery="(item_id not like '%~[%' and item_id not in (select item_id from items)) -- item_id does not reference items.item_id" \
|
|
401
|
+
--cross-reference="corp_id|$GL.corp_acct_no" \
|
|
402
|
+
--cross-reference="corp_name|$GL.corp_acct_name" \
|
|
403
|
+
--cross-reference="vendor_name|$VENDOR.vendor_name" \
|
|
404
|
+
--cross-reference="vendor_code|$VENDOR.vendor_code" \
|
|
405
|
+
--cross-reference="mfr_name|$MFR.mfr_name" \
|
|
406
|
+
--cross-reference="costcenter_id|$GL.cc_acct_no" \
|
|
407
|
+
--cross-reference="costcenter_name|$GL.cc_acct_name" \
|
|
408
|
+
--unique="req_no, req_line_number" \
|
|
409
|
+
|
|
410
|
+
# validate USERS
|
|
411
|
+
ivalidate --case-insensitive --pretty -t $USER \
|
|
412
|
+
--log-to=validation_errors \
|
|
413
|
+
--not-null="email" \
|
|
414
|
+
--unique="email" \
|
|
415
|
+
--query="lower(email) ~* '[a-z0-9][a-z0-9_\.]+@[a-z0-9][a-z0-9_\.\-]+\.[a-z0-9_\.\-]+' -- invalid email address"
|
|
416
|
+
|
|
417
|
+
# validate INVENTORY
|
|
418
|
+
ivalidate --case-insensitive --pretty -t $INVENTORY \
|
|
419
|
+
--log-to=validation_errors \
|
|
420
|
+
--not-null="item_id" \
|
|
421
|
+
--match="item_id/[a-zA-Z0-9]/" \
|
|
422
|
+
--not-null="loc_id" \
|
|
423
|
+
--match="loc_id/[a-zA-Z0-9]/" \
|
|
424
|
+
--not-null="vendor_code" \
|
|
425
|
+
--match="vendor_code/[a-zA-Z0-9]/" \
|
|
426
|
+
--not-null="vendor_name" \
|
|
427
|
+
--match="vendor_name/[a-zA-Z0-9]/" \
|
|
428
|
+
--not-null="corp_id" \
|
|
429
|
+
--match="corp_name/[a-zA-Z0-9]/" \
|
|
430
|
+
--not-null="location_name" \
|
|
431
|
+
--match="location_name/[a-zA-Z0-9]/" \
|
|
432
|
+
--not-null="item_id" \
|
|
433
|
+
--match="item_id/[a-zA-Z0-9]/" \
|
|
434
|
+
--match="inventory_status/^(Active|Pending Inactive|Inactive)$/" \
|
|
435
|
+
--cross-reference="item_id|$ITEM.item_id" \
|
|
436
|
+
--cross-reference="location_name|$LOCATION.name" \
|
|
437
|
+
--cross-reference="vendor_code|$VENDOR.vendor_code" \
|
|
438
|
+
--cross-reference="vendor_name|$VENDOR.vendor_name" \
|
|
439
|
+
--cross-reference="corp_id|$GL.corp_acct_no" \
|
|
440
|
+
--cross-reference="corp_name|$GL.corp_acct_name"
|
|
441
|
+
|
|
442
|
+
# validate
|
|
443
|
+
ivalidate --case-insensitive --pretty -t $ITEMCOST \
|
|
444
|
+
--log-to=validation_errors \
|
|
445
|
+
--not-null="corp_acct_no" \
|
|
446
|
+
--match="corp_acct_no/[a-zA-Z0-9]/" \
|
|
447
|
+
--not-null="item_no" \
|
|
448
|
+
--match="item_no/[a-zA-Z0-9]/" \
|
|
449
|
+
--not-null="excp_type" \
|
|
450
|
+
--match="excp_type/^(A|R)$/" \
|
|
451
|
+
--cross-reference="corp_acct_no|$GL.corp_acct_no" \
|
|
452
|
+
--cross-reference="item_no|$ITEM.item_id" \
|
|
453
|
+
--cross-reference="exp_acct_no|$GL.exp_acct_no"
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
####################################################
|
|
458
|
+
# Create report file for every table (extract 1000 records for every error)
|
|
459
|
+
# These file will then be used for the Validation Report
|
|
460
|
+
####################################################
|
|
461
|
+
|
|
462
|
+
iexport -t $ITEMCOST \
|
|
463
|
+
-o "$OUTPUT_DIR/$ITEMCOST.csv" -f csv --no-quote-empty --quotes --headers \
|
|
464
|
+
--query="select * from (select ROW_NUMBER() OVER (PARTITION BY error) AS group_index, *
|
|
465
|
+
FROM ( select unnest(string_to_array(validation_errors, ' || ')) as error, * from
|
|
466
|
+
$ITEMCOST order by id ) as main) as tmp
|
|
467
|
+
where group_index <= 1000" \
|
|
468
|
+
--exclude="id, validation_errors, group_index"
|
|
469
|
+
|
|
470
|
+
iexport -t $CONTRACTO \
|
|
471
|
+
-o "$OUTPUT_DIR/$CONTRACTO.csv" -f csv --no-quote-empty --quotes --headers \
|
|
472
|
+
--query="select * from (select ROW_NUMBER() OVER (PARTITION BY error) AS group_index, *
|
|
473
|
+
FROM ( select unnest(string_to_array(validation_errors, ' || ')) as error, * from
|
|
474
|
+
$CONTRACTO order by id ) as main) as tmp
|
|
475
|
+
where group_index <= 1000" \
|
|
476
|
+
--exclude="id, validation_errors, group_index"
|
|
477
|
+
|
|
478
|
+
iexport -t $VENDOR \
|
|
479
|
+
-o "$OUTPUT_DIR/$VENDOR.csv" -f csv --no-quote-empty --quotes --headers \
|
|
480
|
+
--query="select * from (select ROW_NUMBER() OVER (PARTITION BY error) AS group_index, *
|
|
481
|
+
FROM ( select unnest(string_to_array(validation_errors, ' || ')) as error, * from
|
|
482
|
+
$VENDOR order by id ) as main) as tmp
|
|
483
|
+
where group_index <= 1000" \
|
|
484
|
+
--exclude="id, validation_errors, group_index"
|
|
485
|
+
|
|
486
|
+
iexport -t $MFR \
|
|
487
|
+
-o "$OUTPUT_DIR/$MFR.csv" -f csv --no-quote-empty --quotes --headers \
|
|
488
|
+
--query="select * from (select ROW_NUMBER() OVER (PARTITION BY error) AS group_index, *
|
|
489
|
+
FROM ( select unnest(string_to_array(validation_errors, ' || ')) as error, * from
|
|
490
|
+
$MFR order by id ) as main) as tmp
|
|
491
|
+
where group_index <= 1000" \
|
|
492
|
+
--exclude="id, validation_errors, group_index"
|
|
493
|
+
|
|
494
|
+
iexport -t $GL \
|
|
495
|
+
-o "$OUTPUT_DIR/$GL.csv" -f csv --no-quote-empty --quotes --headers \
|
|
496
|
+
--query="select * from (select ROW_NUMBER() OVER (PARTITION BY error) AS group_index, *
|
|
497
|
+
FROM ( select unnest(string_to_array(validation_errors, ' || ')) as error, * from
|
|
498
|
+
$GL order by id ) as main) as tmp
|
|
499
|
+
where group_index <= 1000" \
|
|
500
|
+
--exclude="id, validation_errors, group_index"
|
|
501
|
+
|
|
502
|
+
iexport -t $PO \
|
|
503
|
+
-o "$OUTPUT_DIR/$PO.csv" -f csv --no-quote-empty --quotes --headers \
|
|
504
|
+
--query="select * from (select ROW_NUMBER() OVER (PARTITION BY error) AS group_index, *
|
|
505
|
+
FROM ( select unnest(string_to_array(validation_errors, ' || ')) as error, * from
|
|
506
|
+
$PO order by id ) as main) as tmp
|
|
507
|
+
where group_index <= 1000" \
|
|
508
|
+
--exclude="id, validation_errors, group_index"
|
|
509
|
+
|
|
510
|
+
iexport -t $INVENTORY \
|
|
511
|
+
-o "$OUTPUT_DIR/$INVENTORY.csv" -f csv --no-quote-empty --quotes --headers \
|
|
512
|
+
--query="select * from (select ROW_NUMBER() OVER (PARTITION BY error) AS group_index, *
|
|
513
|
+
FROM ( select unnest(string_to_array(validation_errors, ' || ')) as error, * from
|
|
514
|
+
$INVENTORY order by id ) as main) as tmp
|
|
515
|
+
where group_index <= 1000" \
|
|
516
|
+
--exclude="id, validation_errors, group_index"
|
|
517
|
+
|
|
518
|
+
iexport -t $REQ \
|
|
519
|
+
-o "$OUTPUT_DIR/$REQ.csv" -f csv --no-quote-empty --quotes --headers \
|
|
520
|
+
--query="select * from (select ROW_NUMBER() OVER (PARTITION BY error) AS group_index, *
|
|
521
|
+
FROM ( select unnest(string_to_array(validation_errors, ' || ')) as error, * from
|
|
522
|
+
$REQ order by id ) as main) as tmp
|
|
523
|
+
where group_index <= 1000" \
|
|
524
|
+
--exclude="id, validation_errors, group_index"
|
|
525
|
+
|
|
526
|
+
iexport -t $ITEM \
|
|
527
|
+
-o "$OUTPUT_DIR/$ITEM.csv" -f csv --no-quote-empty --quotes --headers \
|
|
528
|
+
--query="select * from (select ROW_NUMBER() OVER (PARTITION BY error) AS group_index, *
|
|
529
|
+
FROM ( select unnest(string_to_array(validation_errors, ' || ')) as error, * from
|
|
530
|
+
$ITEM order by id ) as main) as tmp
|
|
531
|
+
where group_index <= 1000" \
|
|
532
|
+
--exclude="id, validation_errors, group_index"
|
|
533
|
+
|
|
534
|
+
iexport -t $USER \
|
|
535
|
+
-o "$OUTPUT_DIR/$USER.csv" -f csv --no-quote-empty --quotes --headers \
|
|
536
|
+
--query="select * from (select ROW_NUMBER() OVER (PARTITION BY error) AS group_index, *
|
|
537
|
+
FROM ( select unnest(string_to_array(validation_errors, ' || ')) as error, * from
|
|
538
|
+
$USER order by id ) as main) as tmp
|
|
539
|
+
where group_index <= 1000" \
|
|
540
|
+
--exclude="id, validation_errors, group_index"
|
|
541
|
+
|
|
542
|
+
iexport -t $LOCATION \
|
|
543
|
+
-o "$OUTPUT_DIR/$LOCATION.csv" -f csv --no-quote-empty --quotes --headers \
|
|
544
|
+
--query="select * from (select ROW_NUMBER() OVER (PARTITION BY error) AS group_index, *
|
|
545
|
+
FROM ( select unnest(string_to_array(validation_errors, ' || ')) as error, * from
|
|
546
|
+
$LOCATION order by id ) as main) as tmp
|
|
547
|
+
where group_index <= 1000" \
|
|
548
|
+
--exclude="id, validation_errors, group_index"
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
# Use SQL to compute the summary, write the outputs to summary.csv
|
|
552
|
+
# --------------------------------------------------------------
|
|
553
|
+
iexport --output="$OUTPUT_DIR/summary.csv" -f csv --no-quote-empty --quotes --headers \
|
|
554
|
+
--query="(select 'ContractMaster' as input_file, unnest(string_to_array(validation_errors, ' || ')) as error, count(*), round((count(*) * 100)::numeric / (select count(*) from $CONTRACTO), 2)::varchar || '%' as percentage from $CONTRACTO group by error order by error) union
|
|
555
|
+
(select 'VendorMaster' as input_file, unnest(string_to_array(validation_errors, ' || ')) as error, count(*), round((count(*) * 100)::numeric / (select count(*) from $VENDOR), 2)::varchar || '%' as percentage from $VENDOR group by error order by error) union
|
|
556
|
+
(select 'ItemMaster' as input_file, unnest(string_to_array(validation_errors, ' || ')) as error, count(*), round((count(*) * 100)::numeric / (select count(*) from $ITEM), 2)::varchar || '%' as percentage from $ITEM group by error order by error) union
|
|
557
|
+
(select 'ReqHistoryLoad' as input_file, unnest(string_to_array(validation_errors, ' || ')) as error, count(*), round((count(*) * 100)::numeric / (select count(*) from $REQ), 2)::varchar || '%' as percentage from $REQ group by error order by error) union
|
|
558
|
+
(select 'MfrMaster' as input_file, unnest(string_to_array(validation_errors, ' || ')) as error, count(*), round((count(*) * 100)::numeric / (select count(*) from $MFR), 2)::varchar || '%' as percentage from $MFR group by error order by error) union
|
|
559
|
+
(select 'PurchaseOrder' as input_file, unnest(string_to_array(validation_errors, ' || ')) as error, count(*), round((count(*) * 100)::numeric / (select count(*) from $PO), 2)::varchar || '%' as percentage from $PO group by error order by error) union
|
|
560
|
+
(select 'Inventory' as input_file, unnest(string_to_array(validation_errors, ' || ')) as error, count(*), round((count(*) * 100)::numeric / (select count(*) from $INVENTORY), 2)::varchar || '%' as percentage from $INVENTORY group by error order by error) union
|
|
561
|
+
(select 'User' as input_file, unnest(string_to_array(validation_errors, ' || ')) as error, count(*), round((count(*) * 100)::numeric / (select count(*) from $USER), 2)::varchar || '%' as percentage from $USER group by error order by error) union
|
|
562
|
+
(select 'Location' as input_file, unnest(string_to_array(validation_errors, ' || ')) as error, count(*), round((count(*) * 100)::numeric / (select count(*) from $LOCATION), 2)::varchar || '%' as percentage from $LOCATION group by error order by error) union
|
|
563
|
+
(select 'ItemCost' as input_file, unnest(string_to_array(validation_errors, ' || ')) as error, count(*), round((count(*) * 100)::numeric / (select count(*) from $ITEMCOST), 2)::varchar || '%' as percentage from $ITEMCOST group by error order by error) union
|
|
564
|
+
(select 'GLAccount' as input_file, unnest(string_to_array(validation_errors, ' || ')) as error, count(*), round((count(*) * 100)::numeric / (select count(*) from $GL), 2)::varchar || '%' as percentage from $GL group by error order by error)"
|
|
565
|
+
|
|
566
|
+
# Merge summary.xls and report files into one single file with several tabs
|
|
567
|
+
imerge --output=$OUTPUT_DIR/$ORGNAME.xls \
|
|
568
|
+
--input="Summary:$OUTPUT_DIR/summary.csv" \
|
|
569
|
+
--input="ItemCostCenterAcctExceptions:$OUTPUT_DIR/$ITEMCOST.csv" \
|
|
570
|
+
--input="ContractMaster:$OUTPUT_DIR/$CONTRACTO.csv" \
|
|
571
|
+
--input="ItemMaster:$OUTPUT_DIR/$ITEM.csv" \
|
|
572
|
+
--input="MfrMaster:$OUTPUT_DIR/$MFR.csv" \
|
|
573
|
+
--input="PurchaseOrder:$OUTPUT_DIR/$PO.csv" \
|
|
574
|
+
--input="User:$OUTPUT_DIR/$USER.csv" \
|
|
575
|
+
--input="Location:$OUTPUT_DIR/$LOCATION.csv" \
|
|
576
|
+
--input="ReqHistoryLoad:$OUTPUT_DIR/$REQ.csv" \
|
|
577
|
+
--input="GLAccount:$OUTPUT_DIR/$GL.csv" \
|
|
578
|
+
--input="Inventory:$OUTPUT_DIR/$INVENTORY.csv"
|
|
579
|
+
|
|
580
|
+
exit
|
data/lib/idata/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: idata
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.30
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Nghi Pham
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2014-07-
|
|
11
|
+
date: 2014-07-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -92,6 +92,7 @@ files:
|
|
|
92
92
|
- bin/ipatch
|
|
93
93
|
- bin/isanitize
|
|
94
94
|
- bin/ivalidate
|
|
95
|
+
- full.sh
|
|
95
96
|
- idata.gemspec
|
|
96
97
|
- lib/idata.rb
|
|
97
98
|
- lib/idata/version.rb
|