lightspeed_pos 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []