stockboy 0.5.0

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.
Files changed (112) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +5 -0
  4. data/.yardopts +7 -0
  5. data/CHANGELOG.md +24 -0
  6. data/Gemfile +12 -0
  7. data/Guardfile +10 -0
  8. data/LICENSE +21 -0
  9. data/README.md +293 -0
  10. data/Rakefile +30 -0
  11. data/lib/stockboy.rb +80 -0
  12. data/lib/stockboy/attribute.rb +11 -0
  13. data/lib/stockboy/attribute_map.rb +74 -0
  14. data/lib/stockboy/candidate_record.rb +130 -0
  15. data/lib/stockboy/configuration.rb +62 -0
  16. data/lib/stockboy/configurator.rb +176 -0
  17. data/lib/stockboy/dsl.rb +68 -0
  18. data/lib/stockboy/exceptions.rb +3 -0
  19. data/lib/stockboy/filter.rb +58 -0
  20. data/lib/stockboy/filter_chain.rb +41 -0
  21. data/lib/stockboy/filters.rb +11 -0
  22. data/lib/stockboy/filters/missing_email.rb +37 -0
  23. data/lib/stockboy/job.rb +241 -0
  24. data/lib/stockboy/mapped_record.rb +59 -0
  25. data/lib/stockboy/provider.rb +238 -0
  26. data/lib/stockboy/providers.rb +11 -0
  27. data/lib/stockboy/providers/file.rb +135 -0
  28. data/lib/stockboy/providers/ftp.rb +205 -0
  29. data/lib/stockboy/providers/http.rb +123 -0
  30. data/lib/stockboy/providers/imap.rb +290 -0
  31. data/lib/stockboy/providers/soap.rb +120 -0
  32. data/lib/stockboy/railtie.rb +28 -0
  33. data/lib/stockboy/reader.rb +59 -0
  34. data/lib/stockboy/readers.rb +11 -0
  35. data/lib/stockboy/readers/csv.rb +115 -0
  36. data/lib/stockboy/readers/fixed_width.rb +121 -0
  37. data/lib/stockboy/readers/spreadsheet.rb +144 -0
  38. data/lib/stockboy/readers/xml.rb +155 -0
  39. data/lib/stockboy/registry.rb +42 -0
  40. data/lib/stockboy/source_record.rb +43 -0
  41. data/lib/stockboy/string_pool.rb +35 -0
  42. data/lib/stockboy/template_file.rb +44 -0
  43. data/lib/stockboy/translations.rb +70 -0
  44. data/lib/stockboy/translations/boolean.rb +58 -0
  45. data/lib/stockboy/translations/date.rb +41 -0
  46. data/lib/stockboy/translations/decimal.rb +33 -0
  47. data/lib/stockboy/translations/default_empty_string.rb +38 -0
  48. data/lib/stockboy/translations/default_false.rb +41 -0
  49. data/lib/stockboy/translations/default_nil.rb +38 -0
  50. data/lib/stockboy/translations/default_true.rb +41 -0
  51. data/lib/stockboy/translations/default_zero.rb +41 -0
  52. data/lib/stockboy/translations/integer.rb +33 -0
  53. data/lib/stockboy/translations/string.rb +33 -0
  54. data/lib/stockboy/translations/time.rb +41 -0
  55. data/lib/stockboy/translations/uk_date.rb +51 -0
  56. data/lib/stockboy/translations/us_date.rb +51 -0
  57. data/lib/stockboy/translator.rb +66 -0
  58. data/lib/stockboy/version.rb +3 -0
  59. data/spec/fixtures/.gitkeep +0 -0
  60. data/spec/fixtures/files/a_garbage.csv +1 -0
  61. data/spec/fixtures/files/test_data-20120101.csv +1 -0
  62. data/spec/fixtures/files/test_data-20120202.csv +1 -0
  63. data/spec/fixtures/files/z_garbage.csv +1 -0
  64. data/spec/fixtures/jobs/test_job.rb +1 -0
  65. data/spec/fixtures/soap/get_list/fault.xml +8 -0
  66. data/spec/fixtures/soap/get_list/success.xml +18 -0
  67. data/spec/fixtures/spreadsheets/test_data.xls +0 -0
  68. data/spec/fixtures/spreadsheets/test_row_options.xls +0 -0
  69. data/spec/fixtures/xml/body.xml +14 -0
  70. data/spec/spec_helper.rb +28 -0
  71. data/spec/stockboy/attribute_map_spec.rb +59 -0
  72. data/spec/stockboy/attribute_spec.rb +11 -0
  73. data/spec/stockboy/candidate_record_spec.rb +150 -0
  74. data/spec/stockboy/configuration_spec.rb +28 -0
  75. data/spec/stockboy/configurator_spec.rb +127 -0
  76. data/spec/stockboy/filter_chain_spec.rb +40 -0
  77. data/spec/stockboy/filter_spec.rb +41 -0
  78. data/spec/stockboy/filters/missing_email_spec.rb +26 -0
  79. data/spec/stockboy/filters_spec.rb +38 -0
  80. data/spec/stockboy/job_spec.rb +238 -0
  81. data/spec/stockboy/mapped_record_spec.rb +30 -0
  82. data/spec/stockboy/provider_spec.rb +34 -0
  83. data/spec/stockboy/providers/file_spec.rb +116 -0
  84. data/spec/stockboy/providers/ftp_spec.rb +143 -0
  85. data/spec/stockboy/providers/http_spec.rb +94 -0
  86. data/spec/stockboy/providers/imap_spec.rb +76 -0
  87. data/spec/stockboy/providers/soap_spec.rb +107 -0
  88. data/spec/stockboy/providers_spec.rb +38 -0
  89. data/spec/stockboy/readers/csv_spec.rb +68 -0
  90. data/spec/stockboy/readers/fixed_width_spec.rb +52 -0
  91. data/spec/stockboy/readers/spreadsheet_spec.rb +121 -0
  92. data/spec/stockboy/readers/xml_spec.rb +94 -0
  93. data/spec/stockboy/readers_spec.rb +30 -0
  94. data/spec/stockboy/source_record_spec.rb +19 -0
  95. data/spec/stockboy/template_file_spec.rb +30 -0
  96. data/spec/stockboy/translations/boolean_spec.rb +48 -0
  97. data/spec/stockboy/translations/date_spec.rb +38 -0
  98. data/spec/stockboy/translations/decimal_spec.rb +23 -0
  99. data/spec/stockboy/translations/default_empty_string_spec.rb +32 -0
  100. data/spec/stockboy/translations/default_false_spec.rb +25 -0
  101. data/spec/stockboy/translations/default_nil_spec.rb +32 -0
  102. data/spec/stockboy/translations/default_true_spec.rb +25 -0
  103. data/spec/stockboy/translations/default_zero_spec.rb +32 -0
  104. data/spec/stockboy/translations/integer_spec.rb +22 -0
  105. data/spec/stockboy/translations/string_spec.rb +22 -0
  106. data/spec/stockboy/translations/time_spec.rb +27 -0
  107. data/spec/stockboy/translations/uk_date_spec.rb +37 -0
  108. data/spec/stockboy/translations/us_date_spec.rb +37 -0
  109. data/spec/stockboy/translations_spec.rb +55 -0
  110. data/spec/stockboy/translator_spec.rb +27 -0
  111. data/stockboy.gemspec +32 -0
  112. metadata +305 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9084ee54795b124c1f8d696f121f9bf2c157d203
4
+ data.tar.gz: e55ec14784707d3c7faa55339a23d2f27832f33d
5
+ SHA512:
6
+ metadata.gz: b2aee64506bd8ac04e4e8cd110fe882b6722e11eeae34ddcb7bfb2f1882615a1d9b82f621ee01ef45ae234ad98b2019bbdfd1e7ec2d2dd6f911e160d30ab4e32
7
+ data.tar.gz: 70429f68f99fbfb65dfa8cc24bb2c0e20a4a49b6a33b3147ab9e8feeb542fff794d2f45ce3d94d2ab9a168998d52ca7d07881b6b5a8b23aaaf7ed786946b831d
@@ -0,0 +1,9 @@
1
+ .ruby-version
2
+ *.gem
3
+ /.bundle
4
+ /.yardoc
5
+ /Gemfile.lock
6
+ /pkg/*
7
+ /doc
8
+ /tags
9
+ /tmp
data/.rspec ADDED
@@ -0,0 +1,5 @@
1
+ --backtrace
2
+ --colour
3
+ --format progress
4
+ --order random
5
+ --profile
@@ -0,0 +1,7 @@
1
+ --hide-void-return
2
+ --protected
3
+ --no-private
4
+ -
5
+ README.md
6
+ LICENSE
7
+ lib/**/*.rb
@@ -0,0 +1,24 @@
1
+ # Changelog
2
+
3
+ ## 0.5.0 / 2013-12-03
4
+
5
+ [FEATURE] YARD documentation throughout
6
+ [FEATURE] Triggers for invoking actions in job context
7
+ [FEATURE] Add generic `delete_data` method for cleanup of matched files
8
+ [ENHANCEMENT] Expose provider `client` for reuse
9
+ [ENHANCEMENT] Expose provider `matching_file` for reuse
10
+ [BUGFIX] Add missing file validations
11
+
12
+ ## 0.4.3 / 2013-11-22
13
+
14
+ [ENHANCEMENT] Optimize CSV memory usage with shared hash keys
15
+ [BUGFIX] Missed a required file for SOAP/XML
16
+
17
+ ## 0.4.2 / 2013-11-21
18
+
19
+ [ENHANCEMENT] Use consistent conversion for XML hash keys
20
+
21
+ ## 0.4.1 / 2013-11-19
22
+
23
+ First post!
24
+
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ group :debug do
5
+ gem "pry"
6
+ gem "pry-debugger"
7
+ end
8
+
9
+ group :quality do
10
+ gem "redcarpet", "~> 1.0"
11
+ gem "yard"
12
+ end
@@ -0,0 +1,10 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ group :specs do
5
+ guard 'rspec' do
6
+ watch(%r{^spec/.+_spec\.rb$})
7
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
8
+ watch('spec/spec_helper.rb') { "spec" }
9
+ end
10
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 Andrew Vit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,293 @@
1
+ # Stockboy
2
+
3
+ Stockboy helps you receive and unpack data onto your shelves. You might
4
+ consider using it to synchronize data exported from external sources, or
5
+ migrating your own data from legacy systems. (TL;DR, Stockboy is a Ruby
6
+ [DSL][dsl] for doing [ETL][etl].)
7
+
8
+
9
+ ## Goals
10
+
11
+ Stockboy was originally developed at [Guestfolio][gf] to help synchronize data
12
+ from many external systems that export periodic reports in various incompatible
13
+ ways. Each data source might vary orthogonally on:
14
+
15
+ * __Where the data resides:__
16
+ whether a SOAP service, sent to an IMAP mailbox, an FTP server, or simply a
17
+ local file.
18
+ * __How the data is formatted:__
19
+ whether CSV, Excel, XML, JSON, or some other obscure format.
20
+ * __How the records are structured:__
21
+ what fields are included, and how they are named.
22
+ * __What format the fields are:__
23
+ such as different date formats (DMY vs. MDY), whether names are "first,
24
+ last", or what do do with missing values.
25
+ * __Which records to process:__
26
+ selecting whether records are incomplete, or valid and needing to be added,
27
+ updated or deleted.
28
+
29
+ The goal of Stockboy is to provide a clean, but flexible DSL for declaring
30
+ these configurations and keeping them external to your application, letting
31
+ your app standardize on handling one common interface for the many different
32
+ sources.
33
+
34
+
35
+ ## Usage
36
+
37
+ Following your defined job template (see below), a Stockboy job will process
38
+ incoming data into abstract "records". Stockboy leaves it up to your
39
+ application to decide what to do with them.
40
+
41
+ job = Job.define("my_template")
42
+
43
+ job.process
44
+ records = job.records #=> Hash of records sorted by filter key
45
+ other = job.unfiltered_records #=> Array of records unmatched by a filter
46
+ all = job.all_records #=> Array
47
+
48
+ Yielding processed results to a block is also supported:
49
+
50
+ job.process do |records, unfiltered|
51
+ records[:updated].each { |r| YourModel.create(r.attributes) }
52
+ records[:no_data].each { |r| log.warn "No data for #{r.id}" }
53
+ unfiltered_records.each { |r| log.info "Skipping: #{r.raw_hash}" }
54
+ end
55
+
56
+ ### Records
57
+
58
+ Each record exposes both the source values and the mapped output values
59
+ according to your defined mapping. Typically the mapped fields should
60
+ correspond to the actual attributes on your application models. These can be
61
+ accessed as individual methods, or by converting the record to a hash.
62
+
63
+ record.input["RawEmailField"] # => "ARTHUR@EXAMPLE.COM"
64
+ record.output.email # => "arthur@example.com"
65
+
66
+ record.to_hash or record.attributes
67
+ #=> {check_in: #<Time ...>, location_id: 123, first_name: "Arthur", ...}
68
+
69
+ record.to_model(YourModel) or YourModel.new(record.attributes)
70
+ #=> #<YourModel ...>
71
+
72
+
73
+ ## Job Template DSL
74
+
75
+ Stockboy job templates are defined in Ruby but are simple and abstract enough
76
+ to be considered more _configuration_ than _code_. They should reside in the
77
+ [template load path](#stockboy-configuration) for easy loading. Once defined,
78
+ job templates are parsed and loaded at runtime, so they can be added or updated
79
+ separately without needing to restart a long-running process, e.g. Rails or
80
+ Sidekiq.
81
+
82
+ Writing a job template requires you to declare three parts:
83
+
84
+ ### Example
85
+
86
+ # config/stockboy_jobs/my_template.rb
87
+
88
+ provider :ftp do
89
+ host "example.com"
90
+ username "mystore"
91
+ password "123456"
92
+ file_name "dailyreport-*.csv"
93
+ file_pick :first
94
+ end
95
+
96
+ reader :csv do
97
+ headers true
98
+ col_sep "|"
99
+ encoding "Windows-1252"
100
+ end
101
+
102
+ attributes do
103
+ email from: 'RawEmailAddress'
104
+ first_name as: proc{ |r| r['Full-Name'].split(' ').first }
105
+ last_name as: proc{ |r| r['Full-Name'].split(' ').last }
106
+ birthdate as: [:time]
107
+ score as: [:integer, :default_zero]
108
+ end
109
+
110
+ filter(:invalid_email) do |input, _|
111
+ not(input.email.include?('@') or input['EmailAddress'] == '')
112
+ end
113
+
114
+ filter(:missing_code) do |_, output|
115
+ output.product_code.nil?
116
+ end
117
+
118
+ Looking at the parts of this template:
119
+
120
+ ### 1. Get it with a provider
121
+
122
+ The provider block describes the connection parameters for finding and fetching
123
+ data, which is returned as a raw string blob. It can handle some complexity to
124
+ determine which file to pick from an email attachment or FTP directory, for
125
+ example.
126
+
127
+ See: [File][file], [FTP][ftp], [HTTP][http], [IMAP][imap], [SOAP][soap]
128
+
129
+ [file]: lib/stockboy/providers/file.rb
130
+ [ftp]: lib/stockboy/providers/ftp.rb
131
+ [http]: lib/stockboy/providers/http.rb
132
+ [imap]: lib/stockboy/providers/imap.rb
133
+ [soap]: lib/stockboy/providers/soap.rb
134
+
135
+
136
+ ### 2. Parse it with a reader
137
+
138
+ The reader block describes how to turn the raw string from the provider into
139
+ sets of fields. This extracts the raw data tokens, which we can then map to our
140
+ application's domain.
141
+
142
+ See: [CSV][csv], [Fixed-Width][fix], [Spreadsheet][xls], [XML][xml]
143
+
144
+ [csv]: lib/stockboy/readers/csv.rb
145
+ [fix]: lib/stockboy/readers/fixed_width.rb
146
+ [xls]: lib/stockboy/readers/spreadsheet.rb
147
+ [xml]: lib/stockboy/readers/xml.rb
148
+
149
+
150
+ ### 3. Collect it into attributes
151
+
152
+ The attributes block is the main part of the template definition. This
153
+ describes which fields to extract from the parsed data, and how to represent
154
+ each value in the output record. The output attributes are defined by calling
155
+ the attribute's name plus two options:
156
+
157
+ #### from:
158
+ When the field name from the source doesn't match the desired attribute name,
159
+ this option should be used to name the correct field to read from the source
160
+ record.
161
+
162
+ #### as:
163
+ By default, attributes are returned as the original raw string data value, but
164
+ translators can be applied to change the input to any format. Acceptable
165
+ options include a symbol for a built-in translator (e.g. `:date`) or any Proc
166
+ or callable object responding to `call(source_record)`.
167
+
168
+ Translator blocks can access record fields as either:
169
+
170
+ | Indexes for raw input fields | Methods for final attribute names |
171
+ | :-------------------------------: | :-------------------------------: |
172
+ | `->(r){ r['RawEmail'].downcase }` | `->(r){ r.email.downcase }` |
173
+
174
+ Since the entire record context is passed, you can combine multiple input
175
+ fields into one attribute (e.g. combining date plus time). You can also define
176
+ two attributes that extract different data from the same field, e.g. splitting
177
+ a full name field into first and last.
178
+
179
+ Translations are applied in order when given as an array. Since translators are
180
+ designed to handle invalid data, they will catch exceptions and return a `nil`
181
+ so it's a good idea to have default values at the end of the chain.
182
+
183
+ #### Built-in attribute translators:
184
+
185
+ * [`:boolean`][bool]
186
+ Common true/false strings to `True` or `False` (e.g. '1'/'0' or 't'/'f')
187
+ * [`:date`][date]
188
+ ISO-8601 or common strings to `Date` (e.g. "2012-12-21" or "Dec 12, 2012")
189
+ * [`:uk_date`][ukda]
190
+ Date strings from UK format to `Date` (e.g. "DD/MM/YY")
191
+ * [`:us_date`][usda]
192
+ Date strings from US format to `Date` (e.g. "MM/DD/YY")
193
+ * [`:decimal`][deci]
194
+ Numeric strings to `BigDecimal` (e.g. prices)
195
+ * [`:integer`][intg]
196
+ Numeric strings to `Fixnum` integers
197
+ * [`:string`][stri]
198
+ Clean strings with leading/trailing whitespace trimmed
199
+ * [`:or_empty`][dest]
200
+ Returns `""` for blank values
201
+ * [`:or_nil`][dest]
202
+ Returns `nil` for blank values
203
+ * [`:or_zero`][dzer]
204
+ Returns `0` for blank values
205
+
206
+ [bool]: lib/stockboy/translators/boolean.rb
207
+ [date]: lib/stockboy/translators/date.rb
208
+ [deci]: lib/stockboy/translators/decimal.rb
209
+ [dest]: lib/stockboy/translators/default_empty_string.rb
210
+ [dnil]: lib/stockboy/translators/default_nil.rb
211
+ [dzer]: lib/stockboy/translators/default_zero.rb
212
+ [intg]: lib/stockboy/translators/integer.rb
213
+ [stri]: lib/stockboy/translators/string.rb
214
+ [time]: lib/stockboy/translators/time.rb
215
+ [ukda]: lib/stockboy/translators/uk_date.rb
216
+ [usda]: lib/stockboy/translators/us_date.rb
217
+
218
+
219
+ ### 4. Funnel it with filters
220
+
221
+ Filters are optional, but they are very helpful for funneling the data into
222
+ your workflow. For example, you may need to partition records for different
223
+ handling based on a status field.
224
+
225
+ Filters are applied in the order that they are declared. The first filter that
226
+ returns `true` when traversing a record will capture it. Records that fall
227
+ through all the filters without matching anything are considered "unfiltered".
228
+
229
+ job.process
230
+ job.records[:update] #=> Array
231
+ job.unfiltered_records #=> Array
232
+ job.all_records #=> Array
233
+
234
+ Filters can inspect records either pre- or post-translation. Often you just
235
+ need to look at the raw input parameters, but it's also possible to get the
236
+ output values from the second block parameter:
237
+
238
+ filter(:example) do |input, output|
239
+ input["RawEmailAddress"] =~ /gmail/ or output.bounce_count > 1
240
+ end
241
+
242
+ ---
243
+
244
+ ## Installation
245
+
246
+ Add `gem 'stockboy'` to your Gemfile and run `bundle install`.
247
+
248
+ Supported on Ruby 1.9+.
249
+
250
+
251
+ <a name="stockboy-configuration"></a>
252
+ ## Configuration
253
+
254
+ When loaded under a Rails app, Stockboy will look for `config/stockboy.rb` for
255
+ self-configuration if it's present.
256
+
257
+ ### Template Load Paths
258
+
259
+ Template load paths are intended for storing your defined job templates for
260
+ different data sources. (`config/stockboy_jobs/` is the default when loaded in
261
+ a Rails app; else it must be defined.)
262
+
263
+ Stockboy.configuration do |config|
264
+ config.template_load_paths = ['config/job_imports', 'config/log_imports']
265
+ end
266
+
267
+ ### Register Custom Providers / Readers
268
+
269
+ Beyond the standard providers (`:ftp`, `:soap`, etc.) and readers (`:csv`,
270
+ `:xml`), you can register your own for fetching or parsing data from different
271
+ sources. (Contributions welcome.)
272
+
273
+ Stockboy::Readers.register :m3u, PlaylistReader
274
+ Stockboy::Providers.register :gopher, GopherProvider
275
+ Stockboy::Translations.register :product_code, YourProductCodeTranslator
276
+
277
+ See the [Reader][reader], [Provider][provider], and [Translator][translator]
278
+ for details on implementing your own custom classes.
279
+
280
+ [provider]: lib/stockboy/provider.rb
281
+ [reader]: lib/stockboy/reader.rb
282
+ [translator]: lib/stockboy/translator.rb
283
+
284
+ ## Development
285
+
286
+ Contributions and pull requests are welcome.
287
+
288
+ bundle install
289
+ bundle exec rake # runs tests
290
+
291
+ [gf]: http://guestfolio.com/
292
+ [etl]: https://en.wikipedia.org/wiki/Extract,_transform,_load
293
+ [dsl]: https://en.wikipedia.org/wiki/Domain-specific_language
@@ -0,0 +1,30 @@
1
+ #
2
+ # Bundler
3
+ #
4
+
5
+ require "bundler/gem_tasks"
6
+
7
+ #
8
+ # RSpec
9
+ #
10
+
11
+ require "rspec/core/rake_task"
12
+ RSpec::Core::RakeTask.new
13
+
14
+ #
15
+ # YARD
16
+ #
17
+
18
+ require 'yard'
19
+ require "yard/rake/yardoc_task"
20
+ YARD::Rake::YardocTask.new do |t|
21
+ # t.options += ['--title', "Stockboy Documentation"]
22
+ end
23
+
24
+ #
25
+ # Stockboy
26
+ #
27
+
28
+ task :default => :spec
29
+
30
+ task :test => :spec
@@ -0,0 +1,80 @@
1
+ require 'stockboy/version'
2
+ require 'stockboy/exceptions'
3
+ require 'stockboy/dsl'
4
+ require 'stockboy/job'
5
+
6
+ # Registries
7
+ require 'stockboy/translations'
8
+ require 'stockboy/providers'
9
+ require 'stockboy/readers'
10
+ require 'stockboy/filters'
11
+
12
+ # Translations
13
+ require 'stockboy/translations/default_empty_string'
14
+ require 'stockboy/translations/default_false'
15
+ require 'stockboy/translations/default_true'
16
+ require 'stockboy/translations/default_nil'
17
+ require 'stockboy/translations/default_zero'
18
+ require 'stockboy/translations/boolean'
19
+ require 'stockboy/translations/integer'
20
+ require 'stockboy/translations/decimal'
21
+ require 'stockboy/translations/time'
22
+ require 'stockboy/translations/date'
23
+ require 'stockboy/translations/us_date'
24
+ require 'stockboy/translations/uk_date'
25
+
26
+ # Filters
27
+ require 'stockboy/filters/missing_email'
28
+
29
+ # Providers
30
+ require 'stockboy/providers/ftp'
31
+ require 'stockboy/providers/http'
32
+ require 'stockboy/providers/imap'
33
+ require 'stockboy/providers/soap'
34
+ require 'stockboy/providers/file'
35
+
36
+ # Readers
37
+ require 'stockboy/readers/csv'
38
+ require 'stockboy/readers/xml'
39
+ require 'stockboy/readers/fixed_width'
40
+ require 'stockboy/readers/spreadsheet'
41
+
42
+ module Stockboy
43
+
44
+ module Filters
45
+ register :missing_email, MissingEmail
46
+ end
47
+
48
+ module Providers
49
+ register :file, File
50
+ register :ftp, FTP
51
+ register :http, HTTP
52
+ register :soap, SOAP
53
+ register :imap, IMAP
54
+ end
55
+
56
+ module Readers
57
+ register :csv, CSV
58
+ register :xml, XML
59
+ register :fixed_width, FixedWidth
60
+ register :spreadsheet, Spreadsheet
61
+ end
62
+
63
+ module Translations
64
+ register :or_false, DefaultFalse
65
+ register :or_true, DefaultTrue
66
+ register :or_nil, DefaultNil
67
+ register :or_empty, DefaultEmptyString
68
+ register :or_zero, DefaultZero
69
+ register :boolean, Boolean
70
+ register :integer, Integer
71
+ register :decimal, Decimal
72
+ register :time, Time
73
+ register :date, Date
74
+ register :us_date, USDate
75
+ register :uk_date, UKDate
76
+ end
77
+
78
+ end
79
+
80
+ require 'stockboy/railtie' if defined? Rails