rawbotz 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/CODE_OF_CONDUCT.md +49 -0
  4. data/Gemfile +9 -0
  5. data/README.md +185 -0
  6. data/Rakefile +29 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/config.ru +9 -0
  10. data/exe/debug/test_mail +15 -0
  11. data/exe/rawbotz +39 -0
  12. data/exe/rawbotz_import_links +74 -0
  13. data/exe/rawbotz_maintenance.sh +57 -0
  14. data/exe/rawbotz_process_order +86 -0
  15. data/exe/rawbotz_process_order_queue +80 -0
  16. data/exe/rawbotz_stock_update +84 -0
  17. data/exe/rawbotz_update_local_products +48 -0
  18. data/exe/rawbotz_update_remote_products +160 -0
  19. data/lib/rawbotz/app.rb +84 -0
  20. data/lib/rawbotz/cli/order_result_table.rb +57 -0
  21. data/lib/rawbotz/datapolate.rb +42 -0
  22. data/lib/rawbotz/helpers/flash_helper.rb +13 -0
  23. data/lib/rawbotz/helpers/icon_helper.rb +40 -0
  24. data/lib/rawbotz/helpers/resource_link_helper.rb +45 -0
  25. data/lib/rawbotz/local_shop.rb +12 -0
  26. data/lib/rawbotz/mail_template.rb +29 -0
  27. data/lib/rawbotz/option_parser.rb +37 -0
  28. data/lib/rawbotz/order_processor.rb +92 -0
  29. data/lib/rawbotz/product_updater.rb +89 -0
  30. data/lib/rawbotz/public/Chart.min.js +14 -0
  31. data/lib/rawbotz/public/font-awesome-4.5.0/HELP-US-OUT.txt +7 -0
  32. data/lib/rawbotz/public/font-awesome-4.5.0/css/font-awesome.css +2086 -0
  33. data/lib/rawbotz/public/font-awesome-4.5.0/css/font-awesome.min.css +4 -0
  34. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/FontAwesome.otf +0 -0
  35. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.eot +0 -0
  36. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.svg +655 -0
  37. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.ttf +0 -0
  38. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.woff +0 -0
  39. data/lib/rawbotz/public/font-awesome-4.5.0/fonts/fontawesome-webfont.woff2 +0 -0
  40. data/lib/rawbotz/public/font-awesome-4.5.0/less/animated.less +34 -0
  41. data/lib/rawbotz/public/font-awesome-4.5.0/less/bordered-pulled.less +25 -0
  42. data/lib/rawbotz/public/font-awesome-4.5.0/less/core.less +12 -0
  43. data/lib/rawbotz/public/font-awesome-4.5.0/less/fixed-width.less +6 -0
  44. data/lib/rawbotz/public/font-awesome-4.5.0/less/font-awesome.less +17 -0
  45. data/lib/rawbotz/public/font-awesome-4.5.0/less/icons.less +697 -0
  46. data/lib/rawbotz/public/font-awesome-4.5.0/less/larger.less +13 -0
  47. data/lib/rawbotz/public/font-awesome-4.5.0/less/list.less +19 -0
  48. data/lib/rawbotz/public/font-awesome-4.5.0/less/mixins.less +26 -0
  49. data/lib/rawbotz/public/font-awesome-4.5.0/less/path.less +15 -0
  50. data/lib/rawbotz/public/font-awesome-4.5.0/less/rotated-flipped.less +20 -0
  51. data/lib/rawbotz/public/font-awesome-4.5.0/less/stacked.less +20 -0
  52. data/lib/rawbotz/public/font-awesome-4.5.0/less/variables.less +708 -0
  53. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_animated.scss +34 -0
  54. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_bordered-pulled.scss +25 -0
  55. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_core.scss +12 -0
  56. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_fixed-width.scss +6 -0
  57. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_icons.scss +697 -0
  58. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_larger.scss +13 -0
  59. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_list.scss +19 -0
  60. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_mixins.scss +26 -0
  61. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_path.scss +15 -0
  62. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_rotated-flipped.scss +20 -0
  63. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_stacked.scss +20 -0
  64. data/lib/rawbotz/public/font-awesome-4.5.0/scss/_variables.scss +708 -0
  65. data/lib/rawbotz/public/font-awesome-4.5.0/scss/font-awesome.scss +17 -0
  66. data/lib/rawbotz/public/jquery-2.2.0.min.js +4 -0
  67. data/lib/rawbotz/public/jui/external/jquery/jquery.js +9789 -0
  68. data/lib/rawbotz/public/jui/images/ui-icons_444444_256x240.png +0 -0
  69. data/lib/rawbotz/public/jui/images/ui-icons_555555_256x240.png +0 -0
  70. data/lib/rawbotz/public/jui/images/ui-icons_777620_256x240.png +0 -0
  71. data/lib/rawbotz/public/jui/images/ui-icons_777777_256x240.png +0 -0
  72. data/lib/rawbotz/public/jui/images/ui-icons_cc0000_256x240.png +0 -0
  73. data/lib/rawbotz/public/jui/images/ui-icons_ffffff_256x240.png +0 -0
  74. data/lib/rawbotz/public/jui/index.html +513 -0
  75. data/lib/rawbotz/public/jui/jquery-ui.css +1225 -0
  76. data/lib/rawbotz/public/jui/jquery-ui.js +16617 -0
  77. data/lib/rawbotz/public/jui/jquery-ui.min.css +7 -0
  78. data/lib/rawbotz/public/jui/jquery-ui.min.js +13 -0
  79. data/lib/rawbotz/public/jui/jquery-ui.structure.css +833 -0
  80. data/lib/rawbotz/public/jui/jquery-ui.structure.min.css +5 -0
  81. data/lib/rawbotz/public/jui/jquery-ui.theme.css +410 -0
  82. data/lib/rawbotz/public/jui/jquery-ui.theme.min.css +5 -0
  83. data/lib/rawbotz/public/pure-min.css +11 -0
  84. data/lib/rawbotz/public/rawbotz.css +60 -0
  85. data/lib/rawbotz/public/rawbotz.js +96 -0
  86. data/lib/rawbotz/public/rawbotz_ajax_product_link.js +64 -0
  87. data/lib/rawbotz/remote_shop.rb +21 -0
  88. data/lib/rawbotz/routes/non_remote_orders.rb +45 -0
  89. data/lib/rawbotz/routes/orders.rb +76 -0
  90. data/lib/rawbotz/routes/product_links.rb +68 -0
  91. data/lib/rawbotz/routes/products.rb +104 -0
  92. data/lib/rawbotz/routes/remote_shop.rb +37 -0
  93. data/lib/rawbotz/routes/suppliers.rb +36 -0
  94. data/lib/rawbotz/routes.rb +9 -0
  95. data/lib/rawbotz/version.rb +3 -0
  96. data/lib/rawbotz/views/_hide_unhide_button.haml +11 -0
  97. data/lib/rawbotz/views/_menu.haml +20 -0
  98. data/lib/rawbotz/views/index.haml +1 -0
  99. data/lib/rawbotz/views/layout.haml +55 -0
  100. data/lib/rawbotz/views/maintenance/menu.haml +25 -0
  101. data/lib/rawbotz/views/maintenance.haml +150 -0
  102. data/lib/rawbotz/views/order/_head.haml +24 -0
  103. data/lib/rawbotz/views/order/_item_table.haml +44 -0
  104. data/lib/rawbotz/views/order/new.haml +22 -0
  105. data/lib/rawbotz/views/order/non_remote.haml +42 -0
  106. data/lib/rawbotz/views/order/packlist.haml +14 -0
  107. data/lib/rawbotz/views/order/view.haml +79 -0
  108. data/lib/rawbotz/views/orders/index.haml +40 -0
  109. data/lib/rawbotz/views/orders/menu.haml +24 -0
  110. data/lib/rawbotz/views/orders/non_remotes.haml +8 -0
  111. data/lib/rawbotz/views/product/_stock_sales_plot.haml +60 -0
  112. data/lib/rawbotz/views/product/link_to.haml +29 -0
  113. data/lib/rawbotz/views/product/view.haml +64 -0
  114. data/lib/rawbotz/views/products/_link_table.haml +38 -0
  115. data/lib/rawbotz/views/products/index.haml +36 -0
  116. data/lib/rawbotz/views/products/link_wizard.haml +48 -0
  117. data/lib/rawbotz/views/products/links.haml +65 -0
  118. data/lib/rawbotz/views/products/menu.haml +27 -0
  119. data/lib/rawbotz/views/products/table.haml +20 -0
  120. data/lib/rawbotz/views/products/table_with_linking.haml +30 -0
  121. data/lib/rawbotz/views/remote_cart/index.haml +30 -0
  122. data/lib/rawbotz/views/remote_order/view.haml +35 -0
  123. data/lib/rawbotz/views/remote_orders/index.haml +20 -0
  124. data/lib/rawbotz/views/remote_product/view.haml +90 -0
  125. data/lib/rawbotz/views/remote_products/_table.haml +15 -0
  126. data/lib/rawbotz/views/remote_products/index.haml +30 -0
  127. data/lib/rawbotz/views/supplier/view.haml +63 -0
  128. data/lib/rawbotz/views/suppliers/index.haml +13 -0
  129. data/lib/rawbotz/views/thin_layout.haml +32 -0
  130. data/lib/rawbotz/views/widgets/_ajax_link.haml +5 -0
  131. data/lib/rawbotz/views/widgets/_link.haml +6 -0
  132. data/lib/rawbotz/views/widgets/_link_line.haml +15 -0
  133. data/lib/rawbotz.rb +77 -0
  134. data/rawbotz.gemspec +33 -0
  135. metadata +327 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 81bcca5d73862da12d5eb4ed197377f0866bae8c
4
+ data.tar.gz: 903e12e32aade0a32acc87310d820b574e6edf0e
5
+ SHA512:
6
+ metadata.gz: 081bc679e520975b5df4541200295bf9925798cacbad4246582b998c539a3bb1a3cc8a561bd6d36ce8b6e58955405094eb613fb82492de5229313fd4077888a7
7
+ data.tar.gz: c20fd92925a37221f111e5156ef9f9db0da466e4469f0002869a1422e8eed9924bfbe4dd23cc5d06f9052f7716e2cddc7264ce537ecf8652087499a8ee3dab7a
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *config*yml
11
+ rawbotz.conf
12
+ *.swp
@@ -0,0 +1,49 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, and in the interest of
4
+ fostering an open and welcoming community, we pledge to respect all people who
5
+ contribute through reporting issues, posting feature requests, updating
6
+ documentation, submitting pull requests or patches, and other activities.
7
+
8
+ We are committed to making participation in this project a harassment-free
9
+ experience for everyone, regardless of level of experience, gender, gender
10
+ identity and expression, sexual orientation, disability, personal appearance,
11
+ body size, race, ethnicity, age, religion, or nationality.
12
+
13
+ Examples of unacceptable behavior by participants include:
14
+
15
+ * The use of sexualized language or imagery
16
+ * Personal attacks
17
+ * Trolling or insulting/derogatory comments
18
+ * Public or private harassment
19
+ * Publishing other's private information, such as physical or electronic
20
+ addresses, without explicit permission
21
+ * Other unethical or unprofessional conduct
22
+
23
+ Project maintainers have the right and responsibility to remove, edit, or
24
+ reject comments, commits, code, wiki edits, issues, and other contributions
25
+ that are not aligned to this Code of Conduct, or to ban temporarily or
26
+ permanently any contributor for other behaviors that they deem inappropriate,
27
+ threatening, offensive, or harmful.
28
+
29
+ By adopting this Code of Conduct, project maintainers commit themselves to
30
+ fairly and consistently applying these principles to every aspect of managing
31
+ this project. Project maintainers who do not follow or enforce the Code of
32
+ Conduct may be permanently removed from the project team.
33
+
34
+ This code of conduct applies both within project spaces and in public spaces
35
+ when an individual is representing the project or its community.
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
38
+ reported by contacting a project maintainer at felix.wolfsteller@gmail.com. All
39
+ complaints will be reviewed and investigated and will result in a response that
40
+ is deemed necessary and appropriate to the circumstances. Maintainers are
41
+ obligated to maintain confidentiality with regard to the reporter of an
42
+ incident.
43
+
44
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
45
+ version 1.3.0, available at
46
+ [http://contributor-covenant.org/version/1/3/0/][version]
47
+
48
+ [homepage]: http://contributor-covenant.org
49
+ [version]: http://contributor-covenant.org/version/1/3/0/
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Uncomment these for local development
4
+ #gem 'magento_remote', path: "../magento_remote"
5
+ #gem 'rawgento_models', path: "../rawgento_models"
6
+ #gem 'rawgento_db', path: "../rawgento_db"
7
+
8
+ # Specify your gem's dependencies in rawbotz.gemspec
9
+ gemspec
data/README.md ADDED
@@ -0,0 +1,185 @@
1
+ # Rawbotz
2
+
3
+ Rawbotz provides a Web-Interface to do certain management tasks for a particular Magento Web-Shop (RawLiving Germany).
4
+
5
+ In this shop, products are supplied by different suppliers, of which one offers a magento-shop itself.
6
+
7
+ Rawbotz couples the `rawgento_db`, `rawgento_models` and `magento_remote` gems to make it easy to order items from this particular other shop and provides further functionality, e.g. accessing stock and sales history information.
8
+
9
+ Note that this git repository includes software components whose Copyright and License differ from the other parts.
10
+
11
+ These are
12
+ - Font Awesome (http://fontawesome.io/) in `lib/rawbotz/public/font-awesome-4.5.0`
13
+ - Pure CSS (http://purecss.io) in `lib/rawbotz/public/pure-min.css`
14
+ - Chart.JS (http://chartjs.org) in `lib/rawbotz/public/Chart.min.js`
15
+ - jquery and jquery-ui (http://jquery.com, http://jqueryui.com) in `lib/rawbotz/public/jquery-2.2.0.min.js` and `lib/rawbotz/public/jui`
16
+
17
+ The copyright and license information is contained in the respective file headers. All other files are Copyright 2016 Felix Wolfsteller and licensed under the AGPLv3 (or any later).
18
+
19
+ ## Installation
20
+
21
+ While bundling rawbotz up and installing it as a gem should be possible, it is strongly advised to install it via git.
22
+
23
+ Note that the dependencies should be handled with bundler if you are not running a development setup.
24
+
25
+ Anyway, the application is so specific to RawLiving Germanys needs that you probably want to get in contact first.
26
+
27
+ ## Assumptions
28
+
29
+ - supplier attribute
30
+ - shelve attribute
31
+ - packsize attribute
32
+ - Ubuntu 14.04 installation, using rvm in an unprivileged users home.
33
+
34
+ ## Usage
35
+
36
+ Until `rawgento_models`, `rawgento_db` and `magento_remote` (gems by same author) have settled, please adjust the `Gemfile` and checkout these gems in the parent folder.
37
+
38
+ ### Configuration
39
+
40
+ Rawbotz combines the configuration files of `rawgento_db`, `rawgento_models` and `magento_remote` in a single file (default: `rawbotz.conf`). In theory, the components configure themselves using their respective default configuration file paths.
41
+
42
+
43
+ #### Unified appraoch
44
+
45
+ Create a `rawbotz.conf` YAML-file with the unified keys needed. Note that you can pass the path to this configuration file to the various executables in `exe/`.
46
+
47
+ # Rawbotz own database
48
+ default: &default
49
+ adapter: sqlite3
50
+ database: /home/rawbotz/database.sqlite
51
+ encoding: utf8
52
+ pool: 5
53
+ timeout: 5000
54
+
55
+ development:
56
+ <<: *default
57
+ test:
58
+ <<: *default
59
+ database: db/rawgento_test.db
60
+
61
+ # Local Magento MySQL database
62
+ host: 127.0.0.1
63
+ port: 3306
64
+ database: magento_shop_dbname
65
+ username: magento_db_username
66
+ password: magento_db_password
67
+ # Attributes needed
68
+ attribute_ids:
69
+ name: 11
70
+ supplier_name: 666
71
+ shelve_nr: 42
72
+ packsize: 1337
73
+
74
+ # Remote Magento Web Interface (for our mech)
75
+ remote_shop:
76
+ base_uri: https://magentoshop.remote
77
+ user: mylogin@email.address
78
+ pass: whatnottobenamed
79
+
80
+ supplier_name: MagentoShop Remote
81
+
82
+ local_shop:
83
+ base_uri: https://magentoshop.mine
84
+
85
+ mail:
86
+ to: your@email.address
87
+ from: senders@email.address
88
+ host: email.address
89
+ user: senders@email.user
90
+ pass: senders.email.password
91
+ port: 587
92
+
93
+ Then, tell RawbotzApp to eat your config via `exe/rawbotz -c rawbotz.conf`.
94
+ To have fun directly with rack instead use the environment variable `RAWBOTZ_CONFIG`, like in `RAWBOTZ_CONFIG=/home/rawbotz/rawbotz.conf rackup`.
95
+
96
+ #### Reference to the configurable required components
97
+
98
+ Look in the corresponding gems to check how their configuration has to be done:
99
+
100
+ * [rawgento_db s rawgento_db-config.yml](https://github.com/rawliving-germany/rawgento_db)
101
+ * [rawgento_models s db/config.yml](https://github.com/rawliving-germany/rawgento_models)
102
+ * [magento_remotes config](https://github.com/fwolfst/magento_remote)
103
+
104
+ ##### In Quick
105
+
106
+ Configure your database in db/config.yml (Rails style, `rawgento_models`).
107
+
108
+ Configure your magento mysql-connection in rawgento_db-config.yml (`rawgento_db`):
109
+ host: myshop.shop
110
+ port: 3306
111
+ database: magento_myshop
112
+ username: magento_myshop_dbuser
113
+ password: magento_myshop_dbpassword
114
+
115
+ Finally, configure the remote shops credentials (`magento_remote`)
116
+
117
+ ## Setup
118
+
119
+ Note that a script with basic support for maintenance-tasks is underway (exe/rawbotz_maintenance.sh).
120
+
121
+ #### Setup the database
122
+
123
+ Run `rake db:setup` (if `db/schema.rb` is present) or `rake db:migrate` to setup the database.
124
+ Unfortunately, there is no way to pass in the config file, so for now you have to create `db/config.yml` (which can be nearly the same as `rawbotz.conf`) temporarily.
125
+
126
+ #### Populate the database with local and remote products
127
+
128
+ E.g. with `bundle exec exe/rawbotz_update_local_products -c rawbotz.conf` .
129
+ This will query your magento MySQL database and create 'local' products, expect the command to run a while (minutes).
130
+
131
+ E.g. with `bundle exec exe/rawbotz_update_remote_products -c rawbotz.conf`
132
+ This will query the remote magento shop (scraping it via html GET requests) and create 'remote' products, expect the command to run a while longer (more minutes). You might need to adapt parameters, depending on the remote shop. `bundle exec exe/rawbotz_update_remote_products --help` gives you a hint on how to optimize your settings.
133
+
134
+ #### Setup mailing
135
+
136
+ Mails are sent via pony.
137
+
138
+ Create following `rawbotz.conf` section:
139
+
140
+ mail:
141
+ to: your@email.address
142
+ from: senders@email.address
143
+ host: email.address
144
+ user: senders@email.user
145
+ pass: senders.email.password
146
+ port: 587
147
+
148
+ . Multiple receipients can be addressed like this:
149
+
150
+ mail:
151
+ to:
152
+ - your@email.address
153
+ - colleagues@mail.address
154
+ .
155
+
156
+ ### Deployment or web-app startup
157
+
158
+ You can run `(bundle exec) exe/rawbotz`, `rackup` or put rawbotz behind a phusion passenger.
159
+ There is a `-c` option to pass in a config file.
160
+
161
+ As usual, for `rackup` you can specify port (`-p`) and host (`-o`) parameters. The path to config file has to be exposed as RAWBOTZ_CONFIG env var.
162
+
163
+ ### Stock History Update via cron
164
+
165
+ Assuming an Ubuntu Server Setup, run `crontab -e` and add following line to fetch stock values every day at 03:00 am.
166
+
167
+ ### Other tools included
168
+
169
+ #### rawbotz_update_local_products
170
+
171
+ Updates Products from magento MySQL database. See `--help` for more information.
172
+
173
+ ## Development
174
+
175
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment. Run `bundle exec rawbotz` to use the gem in this directory, ignoring other installed copies of this gem.
176
+
177
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
178
+
179
+ You can `bundle console` to jump into a pre-setup irb, then call `RawgentoModels::establish_connection "rawbotz.conf"` to setup the database connection and deal with real world data.
180
+
181
+ ## Contributing
182
+
183
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/rawbotz. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
184
+
185
+ Feel free to get in contact with me.
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rawgento_models'
3
+
4
+ require 'rake/testtask'
5
+
6
+ task :default => :spec
7
+
8
+ RawgentoModels.load_tasks
9
+
10
+ # TODO Setup the environment by calling something like RawgentoModels::establish_connection "rawbotz.conf"` and reading the rest of the config file
11
+
12
+ # These tasks should be solveable either via a rake task or via single executables
13
+
14
+ # initial load
15
+
16
+ # remote scrape
17
+
18
+ # local load and update
19
+
20
+ # stock update
21
+
22
+ Rake::TestTask.new do |t|
23
+ t.pattern = "test/*test.rb"
24
+ end
25
+ #Rake::TestTask.new do |t|
26
+ # t.libs << "test"
27
+ # t.test_files = FileList['test/*test.rb']
28
+ # t.verbose = true
29
+ #end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "rawbotz"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/config.ru ADDED
@@ -0,0 +1,9 @@
1
+ # encoding: UTF-8
2
+ require 'rawbotz'
3
+
4
+ if ENV['RAWBOTZ_CONFIG']
5
+ Rawbotz.conf_file_path = ENV['RAWBOTZ_CONFIG']
6
+ end
7
+
8
+ require 'rawbotz/app'
9
+ run RawbotzApp
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rawbotz"
4
+ require 'rawbotz/option_parser'
5
+
6
+ optparse = Rawbotz::OptionParser.new do |opts, options|
7
+ opts.banner = "Usage: #{$PROGRAM_NAME} [OPTIONS] ORDER_ID"
8
+ opts.separator ""
9
+ end
10
+ optparse.parse!
11
+ options = optparse.options
12
+
13
+ mail = Rawbotz::mail("rawbotz test mail", "Success.\nHere the body.")
14
+
15
+ exit 0
data/exe/rawbotz ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rawbotz"
4
+ require 'optparse'
5
+
6
+ options = {}
7
+ program_name = File.basename __FILE__
8
+ $program_name = program_name
9
+
10
+ optparse = OptionParser.new do |opts|
11
+ opts.banner = "Usage: #{program_name} [OPTIONS]"
12
+ opts.separator ""
13
+
14
+ opts.separator "Single rawbotz configuration file"
15
+ opts.on("-c", "--config FILE", 'file path to rawgento-db YAML config file.') do |c|
16
+ if !File.exist? c
17
+ STDERR.puts "Cannot load conf file #{c}"
18
+ exit 2
19
+ end
20
+
21
+ Rawbotz.conf_file_path = c
22
+ end
23
+
24
+ opts.separator ""
25
+ opts.separator "General"
26
+ opts.on_tail('--version', 'Show version.') do
27
+ puts "#{program_name} #{Rawbotz::VERSION}"
28
+ exit 0
29
+ end
30
+ opts.on('-h', '--help', 'Show this help.') do
31
+ puts opts
32
+ exit 0
33
+ end
34
+ end
35
+ optparse.parse!
36
+
37
+ require "rawbotz/app"
38
+
39
+ RawbotzApp.run!
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "rawbotz"
4
+ require "rawbotz/option_parser"
5
+
6
+ require 'csv'
7
+
8
+ program_name = File.basename __FILE__
9
+
10
+ optparse = Rawbotz::OptionParser.new do |opts, options|
11
+ opts.banner = "Usage: #{program_name} [OPTIONS] <CSVFILE>"
12
+ opts.separator ""
13
+
14
+ opts.on("-d", "--dry-run", "Simulate, do not actually write to db") do |d|
15
+ options[:dry_run] = d
16
+ end
17
+ end
18
+ optparse.parse!
19
+
20
+ logger = Logger.new(STDOUT)
21
+ logger.level = optparse.options[:verbose] ? Logger::DEBUG : Logger::INFO
22
+
23
+ logger.debug "#{program_name} #{Rawbotz::VERSION}"
24
+
25
+ if ARGV.length != 1
26
+ STDERR.puts "Need to supply an argument!"
27
+ STDERR.puts optparse.banner
28
+ exit 2
29
+ end
30
+
31
+ logger.info("Read csv input file #{ARGV[0]}")
32
+
33
+ if optparse.options[:dry_run]
34
+ logger.info("In dry-run-mode, will not actually write to database.")
35
+ end
36
+
37
+ begin
38
+ CSV.foreach(ARGV[0]) do |line|
39
+ local_pid = line[0]
40
+ remote_pid = line[1]
41
+
42
+ local_product = RawgentoModels::LocalProduct.find_by(product_id: local_pid)
43
+ remote_product = RawgentoModels::RemoteProduct.find_by(product_id: remote_pid)
44
+
45
+ if local_product.nil?
46
+ logger.error "Local Product with product-id #{local_pid} could not be found"
47
+ next
48
+ elsif remote_product.nil?
49
+ logger.error "Remote Product with product-id #{remote_pid} could not be found"
50
+ next
51
+ end
52
+ if local_product.remote_product == remote_product
53
+ logger.info "Link #{local_pid} -> #{remote_pid} already present"
54
+ next
55
+ end
56
+ if !options[:dry_run]
57
+ local_product.remote_product = remote_product
58
+ local_product.save
59
+ end
60
+ logger.info "Linked #{local_pid} -> #{remote_pid}"
61
+ logger.debug "Linked #{local_product.name} -> #{remote_product.name}"
62
+ end
63
+ rescue Exception => e
64
+ logger.error "Could not read csv input file"
65
+ logger.error e.inspect
66
+ logger.error e.backtrace
67
+ exit 1
68
+ end
69
+
70
+ if optparse.options[:dry_run]
71
+ logger.info("In dry-run-mode, did not actually write to database.")
72
+ end
73
+
74
+ exit 0
@@ -0,0 +1,57 @@
1
+ #!/bin/bash
2
+
3
+ # Part of rawbotz, (c) Felix Wolfsteller 2016
4
+ # Licensed under the GPLv3
5
+
6
+ set -e
7
+
8
+ command -v dialog >/dev/null 2>&1 || {
9
+ echo >&2 "The program 'dialog' seems not to be installed, exiting."
10
+ exit 1
11
+ }
12
+
13
+ PROGRESS_WIDTH=60
14
+ PROGRESS_HEIGHT=30
15
+
16
+ RAWBOTZ_CONF="rawbotz.conf"
17
+
18
+ menu_selection=$(mktemp /tmp/rawbotz_maintenance.XXXXXX)
19
+
20
+ dialog --menu "Rawbotz Menu" 18 30 8 \
21
+ 1 "Start rawbotz on port 9711" \
22
+ 2 "Update local magento products" \
23
+ 3 "Look for new remote products" \
24
+ 4 "Save current stock data" \
25
+ 5 "Trigger Order queue processing" \
26
+ 2> tmp
27
+
28
+ if [ "$?" = 0 ]
29
+ then
30
+ _ret=$(cat tmp)
31
+ rm tmp
32
+ if [ "$_ret" = "1" ]
33
+ then
34
+ echo "starting rawbotz"
35
+ ./start_rb.sh
36
+ elif [ "$_ret" = "2" ]
37
+ then
38
+ bundle exec rawbotz_update_local_products -v -c "$RAWBOTZ_CONF" | sed -e 's/.* -- : //' | dialog --progressbox "Update local magento products" $PROGRESS_HEIGHT $PROGRESS_WIDTH
39
+ elif [ "$_ret" = "3" ]
40
+ then
41
+ # program "unbuffer?"
42
+ bundle exec rawbotz_update_remote_products -c "$RAWBOTZ_CONF" -n -w 0 | stdbuf -oL -eL sed -e 's/.* -- : //' | dialog --progressbox "Updating Remote Products" $PROGRESS_HEIGHT $PROGRESS_WIDTH
43
+ elif [ "$_ret" = "4" ]
44
+ then
45
+ rawbotz_stock_update -v -c "$RAWBOTZ_CONF" | dialog --progressbox "Saving current stock data" $PROGRESS_HEIGHT $PROGRESS_WIDTH
46
+ elif [ "$_ret" = "5" ]
47
+ then
48
+ rawbotz_process_order_queue -v -c "$RAWBOTZ_CONF" | dialog --progressbox "Processing Order Queue" $PROGRESS_HEIGHT $PROGRESS_WIDTH
49
+ else
50
+ echo "Bad choice."
51
+ exit 1
52
+ fi
53
+ fi
54
+
55
+ rm "$menu_selection"
56
+
57
+ exit 0
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'date'
4
+
5
+ require "rawbotz"
6
+ require 'rawbotz/option_parser'
7
+
8
+ optparse = Rawbotz::OptionParser.new do |opts, options|
9
+ opts.banner = "Usage: #{$PROGRAM_NAME} [OPTIONS] ORDER_ID"
10
+ opts.separator ""
11
+
12
+ opts.on("-m", "--[no]-mail", "Send mail with result") do |m|
13
+ options[:mail] = true
14
+ end
15
+
16
+ opts.on("-f", "--force", "Force order even if state is not queued") do |m|
17
+ options[:force] = true
18
+ end
19
+ end
20
+ optparse.parse!
21
+
22
+ options = optparse.options
23
+ Rawbotz::configure_logger options
24
+
25
+ include RawgentoModels
26
+
27
+ def main options
28
+ Rawbotz::logger.debug "#{$PROGRAM_NAME} #{Rawbotz::VERSION}"
29
+
30
+ if ARGV.length != 1
31
+ Rawbotz::logger.error("Need an argument (order_id)")
32
+ exit 4
33
+ end
34
+
35
+ Rawbotz::logger.info("Starting order")
36
+
37
+ order = RawgentoModels::Order.find(ARGV[0].to_i)
38
+ if !order.present?
39
+ Rawbotz::logger.error("No Order with #{ARGV[0].to_i} found.")
40
+ exit 5
41
+ end
42
+
43
+ Rawbotz::logger.info("#{order.order_items.length} items in Order")
44
+ if order.state != :new
45
+ Rawbotz::logger.warn("Order in state #{order.state}!")
46
+ if !options[:force]
47
+ Rawbotz::logger.warn("Run with -f,--force flag to ignore")
48
+ exit 6
49
+ end
50
+ end
51
+
52
+ order.update(state: :processing)
53
+
54
+ order_processor = Rawbotz::OrderProcessor.new(order, Rawbotz::logger)
55
+
56
+ order_processor.process!
57
+
58
+ Rawbotz::logger.info("Finished order")
59
+
60
+ order.update(state: :ordered)
61
+
62
+ if options[:mail]
63
+ settings = YAML::load_file(Rawbotz::conf_file_path)["mail"]
64
+ pony_via_options = { address: settings["host"],
65
+ user_name: settings["user"],
66
+ port: settings["port"].to_i,
67
+ authentication: :login,
68
+ password: settings["pass"]}
69
+ Rawbotz::logger.info("Attempting mail send to #{settings['to']}")
70
+ Pony.mail({
71
+ to: settings["to"],
72
+ from: settings["from"],
73
+ subject: "test",
74
+ body: "great",
75
+ via: :smtp,
76
+ via_options: pony_via_options
77
+ })
78
+ else
79
+ Rawbotz::logger.info("Not sending mail (invoke with -m to do so)")
80
+ end
81
+
82
+ diff = order_processor.check_against_cart
83
+ end
84
+
85
+ main options
86
+ exit 0
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'date'
4
+
5
+ require 'terminal-table'
6
+
7
+ require "rawbotz"
8
+ require 'rawbotz/option_parser'
9
+ require 'rawbotz/cli/order_result_table'
10
+
11
+
12
+ optparse = Rawbotz::OptionParser.new do |opts, options|
13
+ opts.banner = "Usage: #{$PROGRAM_NAME} [OPTIONS] ORDER_ID"
14
+ opts.separator ""
15
+
16
+ opts.on("-m", "--[no-]mail", "Send mail with result") do |m|
17
+ options[:mail] = m
18
+ end
19
+ end
20
+ optparse.parse!
21
+ options = optparse.options
22
+
23
+ include RawgentoModels
24
+
25
+ def main options
26
+ logger = Logger.new(STDOUT)
27
+ logger.level = options[:verbose] ? Logger::DEBUG : Logger::INFO
28
+
29
+ logger.debug "#{$PROGRAM_NAME} #{Rawbotz::VERSION}"
30
+
31
+ logger.info("Checking queue")
32
+
33
+ queue = RawgentoModels::Order.queued
34
+ logger.info("-> #{queue.count} orders to process")
35
+
36
+ if queue.count == 0
37
+ logger.info("Nothing to do, exiting.")
38
+ exit 0
39
+ end
40
+
41
+ order = queue.first
42
+
43
+ logger.info("#{order.order_items.length} items in Order")
44
+
45
+ if order.state != "queued"
46
+ logger.warn("Order in state #{order.state}!")
47
+ end
48
+ order.update(state: :processing)
49
+
50
+ logger.info ("#{order.order_items.processible.count} products to order.")
51
+
52
+ mech = Rawbotz.new_mech
53
+ mech.login
54
+
55
+ order_processor = Rawbotz::OrderProcessor.new(order, logger)
56
+ order_processor.process!
57
+
58
+ order.update(state: :ordered)
59
+
60
+ logger.info("Finished order")
61
+
62
+ logger.info("Checking current cart")
63
+ diffs = order_processor.check_against_cart
64
+
65
+ # Option to put to stdout
66
+ diff_table = Rawbotz::CLI::OrderResultTable.tables diffs
67
+ puts diff_table
68
+
69
+ if options[:mail]
70
+ logger.debug("Sending mail")
71
+ mail = Rawbotz::mail("rawbotz order finished",
72
+ "Finished Order nr #{order.id}. Result: [tbd]\n\n#{diff_table}")
73
+ logger.debug("Mail sent: #{mail}")
74
+ else
75
+ logger.debug("not sending mail")
76
+ end
77
+ end
78
+
79
+ main options
80
+ exit 0