farmbot-resource 0.0.1
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 +7 -0
- data/.gitignore +48 -0
- data/.rspec +3 -0
- data/Gemfile +5 -0
- data/README.md +29 -0
- data/Rakefile +0 -0
- data/lib/client.rb +20 -0
- data/lib/config.rb +16 -0
- data/lib/fb_resource.rb +6 -0
- data/lib/http/abstract_resp.rb +16 -0
- data/lib/http/bad_http_resp.rb +5 -0
- data/lib/http/good_http_resp.rb +5 -0
- data/lib/http/http.rb +31 -0
- data/lib/resources/abstract_resource.rb +39 -0
- data/lib/resources/schedules.rb +7 -0
- data/lib/resources/sequences.rb +7 -0
- data/spec/spec_helper.rb +28 -0
- metadata +146 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8e30f1034ba61c2be980b07431ad78f18c16ba05
|
4
|
+
data.tar.gz: dd69a2001d79e5cface4c0473c11660f18c09475
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fc0a073cc0d2f47328ae4408d745c43f45717af800953b97cf34ea973797e6e450033877bdfabaf1db6ac918ab24392100e62037b8962fdc58f99196928458f0
|
7
|
+
data.tar.gz: 30500e2196c07aac086e6bc9d285dd53af5bcce65d0a55e513083e859cff8fdd2fbb08b2af6f48414c1cafcac774d70cb78eba35f3dbbce74fad3af8975ce2c9
|
data/.gitignore
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
*.pstore
|
2
|
+
*.gem
|
3
|
+
*.rbc
|
4
|
+
*.swp
|
5
|
+
.bundle/*
|
6
|
+
.DS_Store
|
7
|
+
.idea/*
|
8
|
+
.loadpath
|
9
|
+
.project
|
10
|
+
.ruby-gemset
|
11
|
+
.ruby-version
|
12
|
+
/.bundle
|
13
|
+
/.bundle/
|
14
|
+
/.yardoc/
|
15
|
+
/_yardoc/
|
16
|
+
/coverage/
|
17
|
+
/coverage/
|
18
|
+
/db/*.sqlite3
|
19
|
+
/db/*.sqlite3-journal
|
20
|
+
/doc/
|
21
|
+
/InstalledFiles
|
22
|
+
/lib/.build
|
23
|
+
/lib/bundler/man/
|
24
|
+
/log/*.log
|
25
|
+
/pkg/
|
26
|
+
/rdoc/
|
27
|
+
/spec/reports/
|
28
|
+
/test/tmp/
|
29
|
+
/test/version_tmp/
|
30
|
+
/tmp
|
31
|
+
/tmp/
|
32
|
+
config.yml
|
33
|
+
coverage/**
|
34
|
+
credentials.yml
|
35
|
+
doc/*
|
36
|
+
doc/**/*
|
37
|
+
Gemfile.lock
|
38
|
+
log/*
|
39
|
+
notes.rb
|
40
|
+
settings.rb
|
41
|
+
/lib/.build
|
42
|
+
write_db_settings.rb
|
43
|
+
snippet.coffee
|
44
|
+
snippets.rb
|
45
|
+
tmp/**/*
|
46
|
+
*.rb~
|
47
|
+
serial_port.txt
|
48
|
+
*fiddle*
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Farmbot Resource
|
2
|
+
|
3
|
+
Adapter gem for Farmbot Web App API. Currently used in Raspberry Pi controller to support scheduling operations.
|
4
|
+
|
5
|
+
# Available Resources
|
6
|
+
|
7
|
+
* Sequences
|
8
|
+
* Schedules
|
9
|
+
|
10
|
+
Need more than what's available? Raise an issue.
|
11
|
+
|
12
|
+
# Usage
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
client = FbResource::Client.new do |config|
|
16
|
+
config.uuid = 'xyxyxyxy-1234-5678-5345-453453453453'
|
17
|
+
config.token = '229458cgsdfgsdfgsdfaasdfasdfasdfasdfasda'
|
18
|
+
config.url = 'http://my.farmbot.it'
|
19
|
+
end
|
20
|
+
|
21
|
+
# Simple use case: get all schedules
|
22
|
+
# Returns array of hashes
|
23
|
+
schedules = client.schedules.all
|
24
|
+
|
25
|
+
# Another use case: cache busting with fetch()
|
26
|
+
# Results are always cached until fetch() is called
|
27
|
+
sequences = client.sequences.fetch.all
|
28
|
+
|
29
|
+
```
|
data/Rakefile
ADDED
File without changes
|
data/lib/client.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'config'
|
2
|
+
|
3
|
+
module FbResource
|
4
|
+
class Client
|
5
|
+
attr_reader :config
|
6
|
+
|
7
|
+
def initialize(&blk)
|
8
|
+
@config = Config.build
|
9
|
+
yield(@config)
|
10
|
+
end
|
11
|
+
|
12
|
+
def schedules
|
13
|
+
@schedules ||= FbResource::Schedules.new(config)
|
14
|
+
end
|
15
|
+
|
16
|
+
def sequences
|
17
|
+
@sequences ||= FbResource::Sequences.new(config)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/config.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
module FbResource
|
4
|
+
class Config < OpenStruct
|
5
|
+
def creds
|
6
|
+
{ BOT_UUID: self.uuid, BOT_TOKEN: self.token }
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.build
|
10
|
+
# Set defaults
|
11
|
+
self
|
12
|
+
.new
|
13
|
+
.tap {|obj| obj.url = 'http://localhost:3000'}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/fb_resource.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
class AbstractResp
|
2
|
+
attr_reader :body, :request, :response
|
3
|
+
|
4
|
+
def initialize(body, request, response)
|
5
|
+
@body, @request, @response = body, request, response
|
6
|
+
end
|
7
|
+
|
8
|
+
def obj
|
9
|
+
JSON.parse(body.to_s)
|
10
|
+
rescue JSON::ParserError
|
11
|
+
body
|
12
|
+
end
|
13
|
+
|
14
|
+
def ok; self; end
|
15
|
+
def no; self; end
|
16
|
+
end
|
data/lib/http/http.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'abstract_resp'
|
2
|
+
require_relative 'bad_http_resp'
|
3
|
+
require_relative 'good_http_resp'
|
4
|
+
|
5
|
+
module FbResource
|
6
|
+
class Http
|
7
|
+
def self.get(url, headers)
|
8
|
+
i = self.new(nil, nil, nil)
|
9
|
+
RestClient.get(url, headers) do |a, b, c|
|
10
|
+
i.body, i.request, i.response = a, b, c
|
11
|
+
i.run
|
12
|
+
end
|
13
|
+
rescue => e
|
14
|
+
BadHttpResp.new(e, e, e) # ?
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :body, :request, :response
|
18
|
+
|
19
|
+
def initialize(body, request, response)
|
20
|
+
@body, @request, @response = body, request, response
|
21
|
+
end
|
22
|
+
|
23
|
+
def run
|
24
|
+
(success? ? GoodHttpResp : BadHttpResp).new(body, request, response)
|
25
|
+
end
|
26
|
+
|
27
|
+
def success?
|
28
|
+
response.code[0].to_i == 2
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative '../http/http'
|
2
|
+
|
3
|
+
module FbResource
|
4
|
+
class FetchError < Exception; end
|
5
|
+
class AbstractResource
|
6
|
+
class << self
|
7
|
+
attr_writer :path
|
8
|
+
def path
|
9
|
+
@path or
|
10
|
+
raise "Set a resource path on your resource class via self.path="
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_accessor :conf
|
15
|
+
|
16
|
+
def initialize(conf)
|
17
|
+
@conf = conf
|
18
|
+
end
|
19
|
+
|
20
|
+
def fetch
|
21
|
+
Http
|
22
|
+
.get(conf.url + self.class.path, conf.creds)
|
23
|
+
.no { |e| no(e) }
|
24
|
+
.ok { |obj, req, res| fetch_ok(obj, req, res) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def no(error)
|
28
|
+
raise FetchError, "Error fetching #{self.class.to_s}: #{error.message}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def fetch_ok(obj, request, response)
|
32
|
+
@all = obj
|
33
|
+
end
|
34
|
+
|
35
|
+
def all
|
36
|
+
@all || fetch
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start { add_filter "/spec/" }
|
3
|
+
|
4
|
+
Dir['spec/fakes/**/*.rb'].each { |file| load file }
|
5
|
+
require_relative '../lib/farmbot-pi'
|
6
|
+
require_relative '../lib/controllers/exec_sequence_controller'
|
7
|
+
require_relative '../lib/command_objects/commands'
|
8
|
+
require_relative '../lib/models/status_storage.rb'
|
9
|
+
|
10
|
+
RSpec.configure do |config|
|
11
|
+
config.expect_with :rspec do |expectations|
|
12
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
13
|
+
end
|
14
|
+
|
15
|
+
config.mock_with :rspec do |mocks|
|
16
|
+
mocks.verify_partial_doubles = true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# This is used for testing things that require an event loop. Once run, you can
|
21
|
+
# observe / make assertions on side effects.
|
22
|
+
def within_event_loop(ticks = 20)
|
23
|
+
EM.run do
|
24
|
+
bot.status[:BUSY] = 0
|
25
|
+
EM.tick_loop { (ticks < 1) ? EM.stop : ticks -= 1 }
|
26
|
+
yield
|
27
|
+
end
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: farmbot-resource
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rick Carlino
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-06-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: simplecov
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rest-client
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.8'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.8'
|
97
|
+
description: REST API adapter for Farmbot web app.
|
98
|
+
email:
|
99
|
+
- rick.carlino@gmail.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".gitignore"
|
105
|
+
- ".rspec"
|
106
|
+
- Gemfile
|
107
|
+
- README.md
|
108
|
+
- Rakefile
|
109
|
+
- lib/client.rb
|
110
|
+
- lib/config.rb
|
111
|
+
- lib/fb_resource.rb
|
112
|
+
- lib/http/abstract_resp.rb
|
113
|
+
- lib/http/bad_http_resp.rb
|
114
|
+
- lib/http/good_http_resp.rb
|
115
|
+
- lib/http/http.rb
|
116
|
+
- lib/resources/abstract_resource.rb
|
117
|
+
- lib/resources/schedules.rb
|
118
|
+
- lib/resources/sequences.rb
|
119
|
+
- spec/spec_helper.rb
|
120
|
+
homepage: https://github.com/FarmBot/farmbot-resource
|
121
|
+
licenses:
|
122
|
+
- MIT
|
123
|
+
metadata: {}
|
124
|
+
post_install_message:
|
125
|
+
rdoc_options: []
|
126
|
+
require_paths:
|
127
|
+
- lib
|
128
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 2.2.0
|
133
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
requirements: []
|
139
|
+
rubyforge_project:
|
140
|
+
rubygems_version: 2.4.6
|
141
|
+
signing_key:
|
142
|
+
specification_version: 4
|
143
|
+
summary: Ruby Gem to access resources on Farmbot Web App
|
144
|
+
test_files:
|
145
|
+
- spec/spec_helper.rb
|
146
|
+
has_rdoc:
|