lightspeed_pos 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f479289d48eb83582ea0f30e93bf82644e0a5cad
4
+ data.tar.gz: a0b8758eaeeaa5f7f6f044cc9bdd3689156f6d03
5
+ SHA512:
6
+ metadata.gz: be2f7ba8a83b024b43def375f084ab63f695087651563e690f4ec235c453b1f19d54cf0e938f5fd31a04fb83e110d8c0fde4c5006bac7c405f6da6c987bc9891
7
+ data.tar.gz: e04d5d7c4dabf225688e79e5bf071cd86c371ec5dd2fffea4d88721970ceeb4558cf3b996a24b42ebaf3a3f9be15cd2d72ee3b5dec07011bfc38a4d37bbeaa41
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .env
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,69 @@
1
+ AlignHash:
2
+ EnforcedLastArgumentHashStyle: always_ignore
3
+
4
+ AlignParameters:
5
+ Enabled: false
6
+
7
+ LineLength:
8
+ Max: 180
9
+
10
+ ClassLength:
11
+ Enabled: true
12
+ Severity: refactor
13
+ Max: 300
14
+
15
+ MethodLength:
16
+ Enabled: true
17
+ Max: 30
18
+ Severity: refactor
19
+
20
+ CyclomaticComplexity:
21
+ Max: 10
22
+ Severity: refactor
23
+
24
+ EndAlignment:
25
+ Enabled: false
26
+
27
+ StringLiterals:
28
+ Enabled: false
29
+
30
+ Documentation:
31
+ Enabled: false
32
+
33
+ PercentLiteralDelimiters:
34
+ PreferredDelimiters:
35
+ '%w': '{}'
36
+
37
+ MethodDefParentheses:
38
+ Enabled: false
39
+
40
+ PredicateName:
41
+ NamePrefixBlacklist:
42
+ - is_
43
+ - have_
44
+
45
+ IndentHash:
46
+ EnforcedStyle: consistent
47
+
48
+ # breaks using if blocks with assignments
49
+ IndentationWidth:
50
+ Enabled: false
51
+
52
+ CaseIndentation:
53
+ IndentWhenRelativeTo: end
54
+
55
+ FormatString:
56
+ Enabled: false
57
+
58
+ ActionFilter:
59
+ Enabled: false
60
+
61
+ # different methods calls that do exactly the same thing are a smell, regardless of semantics
62
+ SignalException:
63
+ EnforcedStyle: only_raise
64
+
65
+ DoubleNegation:
66
+ Enabled: false
67
+
68
+ TrailingComma:
69
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ - 2.1.6
5
+ script:
6
+ - 'bundle exec rspec spec'
7
+ - 'bundle exec rubocop'
8
+ cache: bundler
9
+ sudo: false
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in lightspeed-pos.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Ryan Bigg
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.
data/README.markdown ADDED
@@ -0,0 +1,98 @@
1
+ # Lightspeed POS
2
+
3
+ [![Build Status](https://travis-ci.org/radar/lightspeed-pos.svg?branch=master)](https://travis-ci.org/radar/lightspeed-pos)
4
+ [![Code Climate](https://codeclimate.com/github/radar/lightspeed-pos/badges/gpa.svg)](https://codeclimate.com/github/radar/lightspeed-pos)
5
+
6
+
7
+ An _unofficial_ gem for interacting with [Lightspeed's Point of Sale API](http://www.lightspeedpos.com/retail/help/developers/api/basics/). Works with API keys for the time being.
8
+
9
+ Most definitely not production ready yet, but you can help by submitting pull requests!
10
+
11
+ ## Getting Started
12
+
13
+ First, intialize a new client:
14
+
15
+ ```ruby
16
+ client = Lightspeed::Client.new(api_key: "YOUR_API_KEY_HERE")
17
+ ```
18
+
19
+ **OR** you may also choose to pass through an OAuth access token if you have one:
20
+
21
+ ```ruby
22
+ client = Lightspeed::Client.new(oauth_token: "YOUR_ACCESS_TOKEN_HERE")
23
+ ```
24
+
25
+ Next, make a request for your accounts:
26
+
27
+ ```ruby
28
+ accounts = client.accounts
29
+ ```
30
+
31
+ Pick the account you want to use, and then start using it:
32
+
33
+ ```ruby
34
+ account = accounts.first
35
+ account.items # This will return the first 100 items from the account
36
+ ```
37
+
38
+ ## Account Resources
39
+
40
+ Account resources share a common API. Account resources that are currently supported by this library are:
41
+
42
+ * Categories
43
+ * Items
44
+
45
+ To work with account resources, you first need to fetch an account. The examples below are for items, but will also work with other types listed above.
46
+
47
+ ### List
48
+
49
+ You can fetch a list of items with this:
50
+
51
+ ```ruby
52
+ account.items.all
53
+ ```
54
+
55
+ ### Show
56
+
57
+ You can fetch a particular item by its ID by doing this:
58
+
59
+ ```ruby
60
+ account.items.find(1)
61
+ ```
62
+
63
+ ### Create
64
+
65
+ You can create a particular item by calling `create`:
66
+
67
+ ```ruby
68
+ account.items.create({
69
+ description: "Onesie"
70
+ })
71
+ ```
72
+
73
+ ### Update
74
+
75
+ You can update a particular item by calling `update`, passing that item's ID and providing a list of attributes to update:
76
+
77
+ ```ruby
78
+ account.items.update(1, {
79
+ description: "Onesie"
80
+ })
81
+ ```
82
+
83
+ This method isn't available on items themselves because I couldn't work out how to share the account ID easily there.
84
+
85
+ ### Destroy
86
+
87
+ You can destroy a particular item by calling `destroy` and passing that item's ID:
88
+
89
+ ```ruby
90
+ account.items.destroy(1)
91
+ ```
92
+
93
+ For the `Items` resource, this is aliased to `archive`:
94
+
95
+ ```ruby
96
+ account.items.archive(1)
97
+ ```
98
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "lightspeed/pos"
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,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,48 @@
1
+ require 'lightspeed/base'
2
+ require 'lightspeed/categories'
3
+ require 'lightspeed/items'
4
+ require 'lightspeed/item_matrices'
5
+
6
+ module Lightspeed
7
+ class Account < Lightspeed::Base
8
+ attr_accessor :id, :name, :link
9
+
10
+ def client
11
+ owner
12
+ end
13
+
14
+ def items
15
+ item_proxy
16
+ end
17
+
18
+ def categories
19
+ category_proxy
20
+ end
21
+
22
+ def item_matrices
23
+ item_matrices_proxy
24
+ end
25
+
26
+ def instantiate(*args)
27
+ client.instantiate(self, *args)
28
+ end
29
+
30
+ private
31
+
32
+ def self.id_field
33
+ "accountID"
34
+ end
35
+
36
+ def item_proxy
37
+ @item_proxy ||= Lightspeed::Items.new(self)
38
+ end
39
+
40
+ def category_proxy
41
+ @category_proxy ||= Lightspeed::Categories.new(self)
42
+ end
43
+
44
+ def item_matrices_proxy
45
+ @item_matrices_proxy ||= Lightspeed::ItemMatrices.new(self)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,103 @@
1
+ require 'active_support/core_ext/string'
2
+
3
+ module Lightspeed
4
+ class AccountResources
5
+ attr_accessor :account
6
+
7
+ def initialize(account)
8
+ @account = account
9
+ end
10
+
11
+ def all
12
+ response = get
13
+ account.instantiate(response[resource_name], Lightspeed.const_get(resource_name))
14
+ end
15
+
16
+ def find(id)
17
+ params = { "#{resource_name.camelize(:lower)}ID" => id }
18
+ response = get(params: params)
19
+ if response[resource_name]
20
+ resource_class.new(account, response[resource_name])
21
+ else
22
+ raise Lightspeed::Errors::NotFound, "Could not find a #{resource_name} by #{params.inspect}"
23
+ end
24
+ end
25
+
26
+ def create(attributes = {})
27
+ craft_instance(post(body: attributes.to_json))
28
+ end
29
+
30
+ def update(id, attributes = {})
31
+ craft_instance(put(id, body: attributes.to_json))
32
+ end
33
+
34
+ def destroy(id)
35
+ craft_instance(delete(id))
36
+ end
37
+
38
+ private
39
+
40
+ def craft_instance(response)
41
+ resource_class.new(client, response[resource_name])
42
+ end
43
+
44
+ def client
45
+ account.client
46
+ end
47
+
48
+ def resource_class
49
+ Lightspeed.const_get(resource_name)
50
+ end
51
+
52
+ def resource_name
53
+ self.class.resource_name
54
+ end
55
+
56
+ def get(params: nil)
57
+ request = client.request(
58
+ method: :get,
59
+ path: collection_path,
60
+ params: params
61
+ )
62
+ request.perform
63
+ end
64
+
65
+ def post(body:)
66
+ request = client.request(
67
+ method: :post,
68
+ path: collection_path,
69
+ body: body
70
+ )
71
+ request.perform
72
+ end
73
+
74
+ def put(id, body:)
75
+ request = client.request(
76
+ method: :put,
77
+ path: item_path(id),
78
+ body: body,
79
+ )
80
+ request.perform
81
+ end
82
+
83
+ def delete(id)
84
+ request = client.request(
85
+ method: :delete,
86
+ path: item_path(id)
87
+ )
88
+ request.perform
89
+ end
90
+
91
+ def base_path
92
+ "/Account/#{account.id}/#{self.class.resource_name}"
93
+ end
94
+
95
+ def collection_path
96
+ base_path + ".json"
97
+ end
98
+
99
+ def item_path(id)
100
+ base_path + "/#{id}.json"
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,17 @@
1
+ module Lightspeed
2
+ class Base
3
+ attr_accessor :id, :owner
4
+
5
+ def initialize(owner, data = {})
6
+ @owner = owner
7
+ self.id = data.delete(self.class.id_field)
8
+ data.each do |k, v|
9
+ send("#{k}=", v)
10
+ end
11
+ end
12
+
13
+ def inspect
14
+ "#<#{self.class.name} id=#{id}>"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ require 'lightspeed/category'
2
+ require 'lightspeed/account_resources'
3
+
4
+ module Lightspeed
5
+ class Categories < Lightspeed::AccountResources
6
+ def self.resource_name
7
+ "Category"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Lightspeed
2
+ class Category < Base
3
+ attr_accessor :name, :nodeDepth, :fullPathName, :leftNode, :rightNode, :timeStamp, :parentID,
4
+ :createTime
5
+
6
+ def self.id_field
7
+ "categoryID"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,45 @@
1
+ require 'lightspeed/account'
2
+ require 'lightspeed/request'
3
+
4
+ module Lightspeed
5
+ class Client
6
+ attr_accessor :api_key, :oauth_token
7
+
8
+ def initialize(api_key: nil, oauth_token: nil)
9
+ @api_key = api_key
10
+ @oauth_token = oauth_token
11
+ end
12
+
13
+ def request(**args)
14
+ Lightspeed::Request.new(self, **args)
15
+ end
16
+
17
+ # Returns a list of accounts that you have access to.
18
+ def accounts
19
+ request = request(method: :get, path: "/Account.json")
20
+ response = request.perform
21
+ instantiate(response["Account"], Lightspeed::Account)
22
+ end
23
+
24
+ # Instantiates a bunch of records from Lightspeed into their proper classes.
25
+ def instantiate(owner = self, records, klass)
26
+ records = splat(records)
27
+ records.map do |record|
28
+ klass.new(owner, record)
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ # Converts a thing to an Array unless it is already.
35
+ # Unfortunately necessary because Lightspeed's API may return an object,
36
+ # or an array of objects.
37
+ #
38
+ # The compact is becuase it may return nothing at all.
39
+ # In the example of fetching categories resource where there are no categories,
40
+ # response["Category"] will not be present.
41
+ def splat(thing)
42
+ (thing.is_a?(Array) ? thing : [thing]).compact
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,8 @@
1
+ module Lightspeed
2
+ module Errors
3
+ class BadRequest < Exception; end # 400
4
+ class Unauthorized < Exception; end # 401
5
+ class NotFound < Exception; end # 404
6
+ class InternalServerError < Exception; end # 500
7
+ end
8
+ end
@@ -0,0 +1,26 @@
1
+ require 'lightspeed/base'
2
+
3
+ module Lightspeed
4
+ class Item < Lightspeed::Base
5
+ attr_accessor :systemSku, :defaultCost, :avgCost, :discountable, :tax,
6
+ :archived, :itemType, :description, :modelYear, :upc, :ean, :customSku,
7
+ :manufacturerSku, :createTime, :timeStamp,
8
+
9
+ # Association keys
10
+ :categoryID, :taxClassID, :departmentID, :itemMatrixID, :manufacturerID, :seasonID,
11
+ :defaultVendorID, :itemECommerceID,
12
+
13
+ # Embedded
14
+ :ItemMatrix, :ItemAttributes, :ItemShops, :Prices, :Note
15
+
16
+ def self.id_field
17
+ "itemID"
18
+ end
19
+
20
+ # FUNFACT: ItemMatrix data is returned during an `update` request,
21
+ # but not during a `find` request.
22
+ def item_matrix
23
+ @ItemMatrix ||= owner.item_matrices.find(itemMatrixID) # rubocop:disable VariableName
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,10 @@
1
+ require 'lightspeed/item_matrix'
2
+ require 'lightspeed/account_resources'
3
+
4
+ module Lightspeed
5
+ class ItemMatrices < AccountResources
6
+ def self.resource_name
7
+ "ItemMatrix"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ module Lightspeed
2
+ class ItemMatrix < Lightspeed::Base
3
+ attr_accessor :description, :tax, :defaultCost, :itemType, :modelYear, :archived,
4
+ :timeStamp
5
+
6
+ # Association keys
7
+ attr_accessor :itemAttributeSetID, :manufacturerID, :categoryID, :defaultVendorID,
8
+ :taxClassID, :seasonID, :departmentID, :itemECommerceID
9
+
10
+ # Embedded
11
+ attr_accessor :Prices
12
+
13
+ def self.id_field
14
+ "itemMatrixID"
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ require 'lightspeed/item'
2
+ require 'lightspeed/account_resources'
3
+
4
+ module Lightspeed
5
+ class Items < Lightspeed::AccountResources
6
+ alias_method :archive, :destroy
7
+
8
+ def self.resource_name
9
+ "Item"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,55 @@
1
+ module Lightspeed
2
+ class Request
3
+ attr_accessor :raw_request
4
+
5
+ def self.base_url
6
+ "https://api.merchantos.com/API"
7
+ end
8
+
9
+ def initialize(client, method:, path:, params: nil, body: nil)
10
+ @raw_request = Typhoeus::Request.new(
11
+ self.class.base_url + path,
12
+ method: method,
13
+ body: body,
14
+ params: params
15
+ )
16
+
17
+ if client.oauth_token
18
+ @raw_request.options[:headers].merge!(
19
+ "Authorization" => "OAuth #{client.oauth_token}"
20
+ )
21
+ end
22
+
23
+ @raw_request.options[:userpwd] = "#{client.api_key}:apikey" if client.api_key
24
+ end
25
+
26
+ def perform
27
+ response = raw_request.run
28
+ if response.code == 200
29
+ handle_success(response)
30
+ else
31
+ handle_error(response)
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def handle_success(response)
38
+ JSON.parse(response.body)
39
+ end
40
+
41
+ def handle_error(response)
42
+ data = JSON.parse(response.body)
43
+ error = case response.code
44
+ when 400
45
+ Lightspeed::Errors::BadRequest
46
+ when 401
47
+ Lightspeed::Errors::Unauthorized
48
+ when 500
49
+ Lightspeed::Errors::InternalServerError
50
+ end
51
+
52
+ raise error.new(data["message"]) if error # rubocop:disable RaiseArgs
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,3 @@
1
+ module Lightspeed
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,9 @@
1
+ require 'typhoeus'
2
+ require 'json'
3
+ require 'pry'
4
+
5
+ module Lightspeed
6
+ end
7
+
8
+ require 'lightspeed/client'
9
+ require 'lightspeed/errors'
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'lightspeed/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "lightspeed_pos"
8
+ spec.version = Lightspeed::VERSION
9
+ spec.authors = ["Ryan Bigg"]
10
+ spec.email = ["git@ryanbigg.com"]
11
+
12
+ spec.summary = "A gem for interacting with Lightspeed's Point of Sale system"
13
+ spec.description = "A gem for interacting with Lightspeed's Point of Sale system"
14
+ spec.homepage = "https://github.com/radar/lightspeed_pos"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+ spec.license = "MIT"
21
+
22
+ spec.add_dependency "typhoeus", "0.7.2"
23
+ spec.add_dependency "activesupport", "4.2.3"
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.9"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "rspec", "3.2.0"
28
+ spec.add_development_dependency "webmock", "1.21.0"
29
+ spec.add_development_dependency "vcr", "2.9.3"
30
+
31
+ spec.add_development_dependency "pry"
32
+ end
metadata ADDED
@@ -0,0 +1,181 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lightspeed_pos
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Bigg
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-07-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: typhoeus
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 4.2.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 4.2.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 3.2.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 3.2.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 1.21.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.21.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: vcr
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 2.9.3
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 2.9.3
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: A gem for interacting with Lightspeed's Point of Sale system
126
+ email:
127
+ - git@ryanbigg.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".rspec"
134
+ - ".rubocop.yml"
135
+ - ".travis.yml"
136
+ - Gemfile
137
+ - LICENSE
138
+ - README.markdown
139
+ - Rakefile
140
+ - bin/console
141
+ - bin/setup
142
+ - lib/lightspeed/account.rb
143
+ - lib/lightspeed/account_resources.rb
144
+ - lib/lightspeed/base.rb
145
+ - lib/lightspeed/categories.rb
146
+ - lib/lightspeed/category.rb
147
+ - lib/lightspeed/client.rb
148
+ - lib/lightspeed/errors.rb
149
+ - lib/lightspeed/item.rb
150
+ - lib/lightspeed/item_matrices.rb
151
+ - lib/lightspeed/item_matrix.rb
152
+ - lib/lightspeed/items.rb
153
+ - lib/lightspeed/request.rb
154
+ - lib/lightspeed/version.rb
155
+ - lib/lightspeed_pos.rb
156
+ - lightspeed_pos.gemspec
157
+ homepage: https://github.com/radar/lightspeed_pos
158
+ licenses:
159
+ - MIT
160
+ metadata: {}
161
+ post_install_message:
162
+ rdoc_options: []
163
+ require_paths:
164
+ - lib
165
+ required_ruby_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ requirements: []
176
+ rubyforge_project:
177
+ rubygems_version: 2.4.8
178
+ signing_key:
179
+ specification_version: 4
180
+ summary: A gem for interacting with Lightspeed's Point of Sale system
181
+ test_files: []