automation-api 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/.dependabot/config.yml +8 -0
  3. data/.gitignore +13 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +3 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +7 -0
  8. data/CHANGELONG.md +13 -0
  9. data/Dockerfile +16 -0
  10. data/Gemfile +6 -0
  11. data/Gemfile.lock +149 -0
  12. data/Jenkinsfile +31 -0
  13. data/README.md +176 -0
  14. data/Rakefile +44 -0
  15. data/automation-api.gemspec +42 -0
  16. data/bin/console +17 -0
  17. data/bin/setup +8 -0
  18. data/config/basic.yml +16 -0
  19. data/config/essential.yml +21 -0
  20. data/config/loyalty.yml +7 -0
  21. data/config/online.yml +17 -0
  22. data/config/profile.yml.example +231 -0
  23. data/config/restrictions.yml +55 -0
  24. data/config/starter.yml +11 -0
  25. data/docker-compose.yml +12 -0
  26. data/exe/store-gen +6 -0
  27. data/lib/automation/api.rb +17 -0
  28. data/lib/automation/api/cli.rb +320 -0
  29. data/lib/automation/api/client.rb +133 -0
  30. data/lib/automation/api/requests.rb +26 -0
  31. data/lib/automation/api/requests/account_owner.rb +22 -0
  32. data/lib/automation/api/requests/app_sync.rb +93 -0
  33. data/lib/automation/api/requests/button_pages.rb +34 -0
  34. data/lib/automation/api/requests/buttons.rb +34 -0
  35. data/lib/automation/api/requests/categories.rb +34 -0
  36. data/lib/automation/api/requests/collection.rb +32 -0
  37. data/lib/automation/api/requests/customers.rb +34 -0
  38. data/lib/automation/api/requests/departments.rb +34 -0
  39. data/lib/automation/api/requests/employees.rb +34 -0
  40. data/lib/automation/api/requests/entitlements.rb +33 -0
  41. data/lib/automation/api/requests/features.rb +33 -0
  42. data/lib/automation/api/requests/helper.rb +59 -0
  43. data/lib/automation/api/requests/location_preferences.rb +22 -0
  44. data/lib/automation/api/requests/loyalty_provisioning.rb +22 -0
  45. data/lib/automation/api/requests/matrix_products.rb +34 -0
  46. data/lib/automation/api/requests/modifiers.rb +34 -0
  47. data/lib/automation/api/requests/named_discounts.rb +34 -0
  48. data/lib/automation/api/requests/online_orders.rb +18 -0
  49. data/lib/automation/api/requests/registers.rb +30 -0
  50. data/lib/automation/api/requests/sales.rb +22 -0
  51. data/lib/automation/api/requests/sales_restrictions.rb +34 -0
  52. data/lib/automation/api/requests/settings.rb +22 -0
  53. data/lib/automation/api/requests/stock_items.rb +34 -0
  54. data/lib/automation/api/requests/tax_rate_service_taxes.rb +34 -0
  55. data/lib/automation/api/requests/taxes.rb +34 -0
  56. data/lib/automation/api/requests/tenders.rb +38 -0
  57. data/lib/automation/api/version.rb +7 -0
  58. metadata +321 -0
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'automation/api/version'
4
+ require 'bundler/gem_tasks'
5
+ require 'rspec/core/rake_task'
6
+ require 'pact/tasks'
7
+ require 'pact_broker/client/tasks'
8
+
9
+ RSpec::Core::RakeTask.new(:spec)
10
+
11
+ task default: :spec
12
+
13
+ # Run with `bundle exec rake pact:publish`
14
+ PactBroker::Client::PublicationTask.new do |task|
15
+ version = Automation::API::VERSION
16
+ git_commit = ENV.fetch('GIT_COMMIT')
17
+ git_branch = ENV.fetch('GIT_BRANCH')
18
+
19
+ task.consumer_version = "#{version}-#{git_commit}"
20
+
21
+ # optional, default value is 'spec/pacts/*.json'
22
+ # task.pattern = 'spec/pacts/*.json'
23
+
24
+ task.pact_broker_base_url = 'https://pact-broker.internal.staging.posrip.com/'
25
+
26
+ # Optional but STRONGLY RECOMMENDED as it will greatly assist with your
27
+ # pact workflow. Result will be merged with other specified task.tags
28
+ # However this is retrieving the branch name, it doesn't work
29
+ # task.tag_with_git_branch = true
30
+
31
+ # Optional
32
+ task.tags = [git_branch]
33
+
34
+ # # Optional
35
+ # task.pact_broker_basic_auth = { username: '', password: '' }
36
+
37
+ # # Optional
38
+ # task.pact_broker_token = '1234abcd' # Bearer token
39
+
40
+ # # This will merge the published pact into an existing pact rather than
41
+ # # overwriting it if one exists. Not recommended, as it makes a mulch of
42
+ # # the workflow on the broker.
43
+ # task.write_method = :merge
44
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+
7
+ require 'automation/api/version'
8
+
9
+ # rubocop:disable Metrics/BlockLength
10
+ Gem::Specification.new do |spec|
11
+ spec.name = 'automation-api'
12
+ spec.version = Automation::API::VERSION
13
+ spec.authors = ['Marc Sangster']
14
+ spec.email = ['msangster@shopkeep.com']
15
+ spec.summary = 'Client for HTTP requests to BackOffice'
16
+
17
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
19
+ end
20
+
21
+ spec.bindir = 'exe'
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_dependency 'graphql-client', '~> 0.16.0'
26
+ spec.add_dependency 'json', '>= 1.8', '< 3'
27
+ spec.add_dependency 'rest-client', '~> 2.1'
28
+ spec.add_dependency 'thor', '~> 0.20'
29
+
30
+ spec.add_development_dependency 'bundler', '~> 1.16'
31
+ spec.add_development_dependency 'codeclimate-test-reporter', '~> 1.0'
32
+ spec.add_development_dependency 'faker', '~> 2.4'
33
+ spec.add_development_dependency 'pact', '~> 1.42'
34
+ spec.add_development_dependency 'pact_broker-client', '~> 1.20'
35
+ spec.add_development_dependency 'pry', '~> 0.12.2'
36
+ spec.add_development_dependency 'rake', '~> 12.3', '>= 12.3.3'
37
+ spec.add_development_dependency 'rspec', '~> 3.8'
38
+ spec.add_development_dependency 'rspec_junit_formatter', '~> 0.2'
39
+ spec.add_development_dependency 'simplecov', '~> 0.13'
40
+ spec.add_development_dependency 'simplecov-rcov', '~> 0.2'
41
+ end
42
+ # rubocop:enable Metrics/BlockLength
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # frozen_string_literal: true
4
+
5
+ require 'bundler/setup'
6
+ require 'automation/api'
7
+ require 'pry'
8
+
9
+ # You can add fixtures and/or initialization code here to make experimenting
10
+ # with your gem easier. You can also use a different console, if you like.
11
+ @uuid = '<insert store uuid>'
12
+ @client = Automation::API::Client.new(uuid: @uuid,
13
+ store: @store,
14
+ login: @login,
15
+ password: @password)
16
+
17
+ Pry.start
@@ -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
@@ -0,0 +1,16 @@
1
+ :account_owner:
2
+ :first_name: Test
3
+ :last_name: Basic
4
+ :phone: '9736928048'
5
+ :entitlements:
6
+ :activate:
7
+ - standard_care
8
+ - customer_recognition
9
+ - price_packaging
10
+ - point_of_sale
11
+ # Default: Here for reference
12
+ # - pocket
13
+ # - freemium_care
14
+ # - billing_management
15
+ :deactivate:
16
+ - freemium
@@ -0,0 +1,21 @@
1
+ :account_owner:
2
+ :first_name: Test
3
+ :last_name: Essential
4
+ :phone: '9736928048'
5
+ :entitlements:
6
+ :activate:
7
+ - standard_care
8
+ - sales_restrictions
9
+ - pocket_date_picker
10
+ - customer_recognition
11
+ - custom_permissions
12
+ - price_packaging
13
+ - online_ordering
14
+ - quickbooks
15
+ - gift_card
16
+ - mailchimp
17
+ - webstore
18
+ - advanced_reporting
19
+ - point_of_sale
20
+ :deactivate:
21
+ - freemium
@@ -0,0 +1,7 @@
1
+ :account_owner:
2
+ :first_name: Test
3
+ :last_name: Loyalty
4
+ :phone: '9736928048'
5
+ :loyalty_provisioned: true
6
+ :location_preferences:
7
+ :loyalty_enabled: true
@@ -0,0 +1,17 @@
1
+ :account_owner:
2
+ :first_name: Test
3
+ :last_name: Online
4
+ :phone: '9736928048'
5
+ :settings:
6
+ :location_name: Online Ordering Test
7
+ :location_addr1: 1 Yemen Street
8
+ :location_addr2: Yemen
9
+ :location_city: Yemen
10
+ :location_postal_code: YM111
11
+ :location_phone: '1111111111'
12
+ :location_state: AK
13
+ :location_country: United States
14
+ :entitlements:
15
+ :activate:
16
+ - online_ordering
17
+ :online_ordering: true
@@ -0,0 +1,231 @@
1
+ # Below is an example configuration just to give an idea of what can be done,
2
+ # and the shape of the data. No validation is done this side, so if something
3
+ # isn't right the request to request will simply fail.
4
+
5
+ # Account owner information is required if you plan on using loyalty.
6
+ # I believe '9736928048' is the magic phone number that must be used in this case.
7
+ :account_owner:
8
+ # :login: ~
9
+ # :email: ~
10
+ :first_name: Test
11
+ :last_name: Example
12
+ :phone: '9736928048'
13
+
14
+ # Not required, but can help to dry up some of the configuration.
15
+ :customer: &customer
16
+ :last_name: Simpson
17
+ :address_line1: 742 Evergreen Terrace
18
+ # Additonal customer fields
19
+ # :first_name: ~
20
+ # :email: ~
21
+ # :address_line2: ~
22
+ # :city: ~
23
+ # :state: ~
24
+ # :zip: ~
25
+ # :phone: ~
26
+ # :account_code: ~
27
+ # :account_type: ~
28
+ # :tax_exempt: ~
29
+ # :sales_tax_number: ~
30
+ # :notes:
31
+
32
+ # An Array of customers to add
33
+ :customers:
34
+ - <<: *customer
35
+ :first_name: Homer
36
+ - <<: *customer
37
+ :first_name: Marge
38
+ - <<: *customer
39
+ :first_name: Bart
40
+ - <<: *customer
41
+ :first_name: Lisa
42
+ - <<: *customer
43
+ :first_name: Maggie
44
+
45
+ # :employee: &employee
46
+ # :first_name: ~
47
+ # :last_name: ~
48
+ # :phone: ~
49
+ # :email: ~
50
+ # :login: ~
51
+ # :register_name: ~
52
+ # :register_code: ~
53
+ # :manager: ~
54
+ # :password: ~
55
+ # :ipad_login_code:
56
+ # :register_manager_signin: ~
57
+ # :register_cashier_signin: ~
58
+ # :hourly_wage: ~
59
+
60
+ :employees:
61
+ - :first_name: Working
62
+ :last_name: Hard
63
+ :manager: false
64
+ :ipad_login_code: 9090
65
+ - :first_name: Hardly
66
+ :last_name: Working
67
+ :manager: true
68
+ :ipad_login_code: 3948
69
+
70
+ # Entitlements take an array of entitlements to 'activate' and another array to deactivate,
71
+ # though neither is required.
72
+ :entitlements:
73
+ :activate:
74
+ - standard_care
75
+ - price_packaging
76
+ - online_ordering
77
+ :deactivate:
78
+ - freemium
79
+
80
+ # Works just like entitlements. Feature flag names are always snake_cased versions of
81
+ # the backoffice admin list
82
+ :features:
83
+ :activate:
84
+ - validated_clockpunch_ios
85
+ - item_sales_restrictions
86
+ :deactivate:
87
+ - check_sync_and_backup
88
+ - register_push_notification
89
+
90
+ # Loyalty is not provisioned be default, so if you didn't want this
91
+ # you would just leave it out entirely
92
+ # :loyalty_provisioned: true
93
+
94
+ # Loyalty must be provisioned before being enabled. Order matters
95
+ :location_preferences:
96
+ :loyalty_enabled: false
97
+ :table_layout_enabled: true
98
+ :pinless_login_enabled: true
99
+ :guest_count_tracking: false
100
+ :guest_count_cashier_prompt: false
101
+
102
+ # On iOS the first register assigned to an account will have coach marks displayed,
103
+ # this can be a pain for automation. This option will discard the first register.
104
+ :burn_first_register: false
105
+
106
+ # Most of the settings are self explanatory. We've set the location information here
107
+ # as it's a requirement for setting up online ordering.
108
+ :settings:
109
+ # :publisher_name: ~
110
+ # :publisher_password: ~
111
+ # :merchant_location_code: ~
112
+ # :processor_name: ~
113
+ # :config_display_gratuity_line: ~
114
+ # :config_display_sig_line: ~
115
+ # :gift_card_processor_name: ~
116
+ # :gift_card_processor_url: ~
117
+ # :gift_card_processor_username: ~
118
+ # :gift_card_processor_password: ~
119
+ # :gift_card_enabled: ~
120
+ # :emv_enabled: ~
121
+ :location_name: Online Ordering Test
122
+ :location_addr1: 1 Yemen Street
123
+ :location_addr2: Yemen
124
+ :location_city: Yemen
125
+ :location_postal_code: YM111
126
+ :location_phone: '1111111111'
127
+ :location_state: AK
128
+ :location_country: United States
129
+ # :location_email: ~
130
+ # :location_website: ~
131
+ # :signature_on_paper_receipt: ~
132
+ # :tip_suggestions_on_paper: ~
133
+ # :combine_tip_and_signature_screens: ~
134
+ # :suggested_tip_1_value: ~
135
+ # :suggested_tip_1_type: ~
136
+ # :suggested_tip_2_value: ~
137
+ # :suggested_tip_2_type: ~
138
+ # :suggested_tip_3_value: ~
139
+ # :suggested_tip_3_type: ~
140
+ # :receipt_custom_text: ~
141
+ # :print_customer_delivery_on_tickets: ~
142
+ # :print_customer_delivery_on_checks: ~
143
+ # :print_customer_delivery_on_receipts: ~
144
+ # :show_receipt_logo: ~
145
+ # :config_display_powered_by: ~
146
+ # :apply_discounts_to_entire_subtotal: ~
147
+ # :require_manager_to_void: ~
148
+ # :tax_id: ~
149
+ # :default_home_screen: ~
150
+ # :auto_signout: ~
151
+ # :register_sync: ~
152
+ # :customer_facing_display_enabled: ~
153
+
154
+ # Departments are simple and only have a 'name' field
155
+ :departments:
156
+ - :name: Restricted
157
+
158
+ # If you reference a department, this will fetch the department by name and use the 'id'
159
+ :category: &category
160
+ :department: Restricted
161
+
162
+ :categories:
163
+ - :name: Age Restricted
164
+ <<: *category
165
+ - :name: Qty Restricted
166
+ <<: *category
167
+
168
+ # Again, reference the department/categories by name and the relevant 'id' will be fetched
169
+ # before making the request
170
+ :sales_restrictions:
171
+ - :name: Age Restriction
172
+ :age_minimum: 21
173
+ :department: Restricted
174
+ :category: Age Restricted
175
+ - :name: Qty Restriction
176
+ :item_maximum: 3
177
+ :department: Restricted
178
+ :category: Qty Restricted
179
+
180
+ :stock_item: &stock_item
181
+ :price_type: system
182
+ :price: 10.0
183
+ :department: Restricted
184
+ # :description:
185
+ # :department_id:
186
+ # :category_id:
187
+ # :register_data_status:
188
+ # :upc_code:
189
+ # :discountable:
190
+ # :taxable:
191
+ # :unit:
192
+ # :cost:
193
+ # :tax_id:
194
+ # :quantity_on_hand:
195
+ # :recommended_order:
196
+ # :order_trigger:
197
+ # :supplier_id:
198
+ # :select_modifiers_when_sold:
199
+ # :inventory_method:
200
+ # :assigned_cost:
201
+ # :printer_setting_id:
202
+
203
+ :stock_items:
204
+ - <<: *stock_item
205
+ :description: Age Restricted Item
206
+ :category: Age Restricted
207
+ - <<: *stock_item
208
+ :description: Qty Restricted Item
209
+ :category: Qty Restricted
210
+
211
+ :button_pages:
212
+ - :name: Restricted Items
213
+ :page_number: 0
214
+
215
+ :button: &button
216
+ :page: Restricted Items
217
+ :x_offset: 0
218
+ :y_offset: 0
219
+ :item_type: StockItem
220
+
221
+ :buttons:
222
+ - <<: *button
223
+ :item: Age Restricted Item
224
+ - <<: *button
225
+ :x_offset: 1
226
+ :item: Qty Restricted Item
227
+
228
+ # This step blocks the request until the user activates a register.
229
+ # For online orders to be received a register must be activated first, though
230
+ # this step can be skipped.
231
+ :online_ordering: true
@@ -0,0 +1,55 @@
1
+ :features:
2
+ :activate:
3
+ - item_sales_restrictions
4
+
5
+ :departments:
6
+ - :name: Restricted
7
+
8
+ :category: &category
9
+ :department: Restricted
10
+
11
+ :categories:
12
+ - :name: Age Restricted
13
+ <<: *category
14
+ - :name: Qty Restricted
15
+ <<: *category
16
+
17
+ :sales_restrictions:
18
+ - :name: Age Restriction
19
+ :age_minimum: 21
20
+ :department: Restricted
21
+ :category: Age Restricted
22
+ - :name: Qty Restriction
23
+ :item_maximum: 3
24
+ :department: Restricted
25
+ :category: Qty Restricted
26
+
27
+ :stock_item: &stock_item
28
+ :price_type: system
29
+ :price: 10.0
30
+ :department: Restricted
31
+
32
+ :stock_items:
33
+ - <<: *stock_item
34
+ :description: Age Restricted Item
35
+ :category: Age Restricted
36
+ - <<: *stock_item
37
+ :description: Qty Restricted Item
38
+ :category: Qty Restricted
39
+
40
+ :button_pages:
41
+ - :name: Restricted Items
42
+ :page_number: 0
43
+
44
+ :button: &button
45
+ :page: Restricted Items
46
+ :x_offset: 0
47
+ :y_offset: 0
48
+ :item_type: StockItem
49
+
50
+ :buttons:
51
+ - <<: *button
52
+ :item: Age Restricted Item
53
+ - <<: *button
54
+ :x_offset: 1
55
+ :item: Qty Restricted Item