citrulu 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,17 +1,69 @@
1
1
  Citrulu
2
2
  =======
3
- A wrapper for the [Citrulu api](https://www.citrulu.com/api)
3
+
4
+ [Citrulu](https://www.citrulu.com/) exposes an [api](https://www.citrulu.com/api) for creating, editing and compiling test files. This gem provides a wrapper around that api which allows you to work with TestFile objects locally.
5
+
6
+ The gem has not yet been widely used. It's probably very unlikely to cause anything bad to happen in your app, but please **use at your own risk** and raise an issue if you find any bugs.
7
+
8
+ Installation
9
+ -------------
10
+
11
+ gem install citrulu
12
+
13
+ Or in your gemfile:
14
+
15
+ ```ruby
16
+ gem "citrulu"
17
+ ```
18
+
19
+ Setup
20
+ -----
21
+
22
+ You need an account on Citrulu to use the gem: Sign up at <http://www.citrulu.com>, and once you're signed in you can create an API key on the '[Account Settings](https://www.citrulu.com/settings)' page.
23
+
24
+ Configure your API key by adding it to an initializer:
25
+
26
+ ```ruby
27
+ #config/initializers/citrulu_auth.rb
28
+ CITRULU_API_KEY = "abcdefgh"
29
+ ```
4
30
 
5
31
  Usage
6
32
  -----
7
- You need an account on Citrulu to use the gem. Sign up at <http://www.citrulu.com>.
8
33
 
9
- You can create an API key on the '[Account Settings](https://www.citrulu.com/settings)' tab once you're signed in.
34
+ You can interact with TestFile instances in mostly the same way that you'd interact with a Rails model:
10
35
 
11
- Configure your API key by adding the following to an initializer, eg. `config/initializers/citrulu_auth.rb`:
36
+ List test files
12
37
 
13
38
  ```ruby
14
- CITRULU_API_KEY = "abcdefgh"
39
+ TestFile.all
40
+ ```
41
+
42
+ Create a new test file
43
+
44
+ ```ruby
45
+ test_file = TestFile.new( name: "My first test file",
46
+ test_file_text: "On http://www.google.com",
47
+ run_tests: "true" )
48
+ test_file.save
49
+
50
+ # test files must have be successfully compiled before they will be run:
51
+ test_file.compile
52
+ ```
53
+
54
+ Find a specific test file by and update it:
55
+
56
+ ```ruby
57
+ test_file = TestFile.find(23)
58
+ test_file.update(run_tests: false)
59
+ test_file.save
60
+ ```
61
+
62
+ Delete a test file:
63
+
64
+ ```ruby
65
+ test_file = TestFile.find(23)
66
+ test_file.destroy
15
67
  ```
16
68
 
17
69
  Contributing to the Citrulu gem
@@ -28,6 +80,8 @@ Authors
28
80
  -------
29
81
  Duncan Stuart (duncan@dxw.com)
30
82
 
83
+ contact@dxw.com
84
+
31
85
  Copyright
32
86
  ---------
33
- Copyright (c) 2012 The Dextrous Web Ltd. See LICENSE.txt for further details.
87
+ Copyright (c) 2012 The Dextrous Web Ltd. See LICENSE.txt for further details.
data/Rakefile CHANGED
@@ -17,8 +17,8 @@ Jeweler::Tasks.new do |gem|
17
17
  gem.name = "citrulu"
18
18
  gem.homepage = "https://github.com/dxw/citrulu-api-ruby.git"
19
19
  gem.license = "MIT"
20
- gem.summary = %Q{ Wrapper for the api exposed by Citrulu }
21
- gem.description = %Q{ Citrulu exposes an api for creating, editing and compiling test files (http://www.citrulu.com/api). This gem provides a wrapper around that api which allows you to work with TestFile objects locally. }
20
+ gem.summary = %Q{Wrapper for the api exposed by Citrulu}
21
+ gem.description = %Q{Citrulu exposes an api for creating, editing and compiling test files (http://www.citrulu.com/api). This gem provides a wrapper around that api which allows you to work with TestFile objects locally.}
22
22
  gem.email = ["contact@dxw.com", "duncan@dxw.com"]
23
23
  gem.authors = ["Duncan Stuart"]
24
24
  # dependencies defined in Gemfile
@@ -38,12 +38,12 @@ end
38
38
 
39
39
  task :default => :spec
40
40
 
41
- # require 'rdoc/task'
42
- # Rake::RDocTask.new do |rdoc|
43
- # version = File.exist?('VERSION') ? File.read('VERSION') : ""
44
- #
45
- # rdoc.rdoc_dir = 'rdoc'
46
- # rdoc.title = "citrulu-api #{version}"
47
- # rdoc.rdoc_files.include('README*')
48
- # rdoc.rdoc_files.include('lib/**/*.rb')
49
- # end
41
+ require 'rdoc/task'
42
+ Rake::RDocTask.new do |rdoc|
43
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
44
+
45
+ rdoc.rdoc_dir = 'rdoc'
46
+ rdoc.title = "citrulu-api #{version}"
47
+ rdoc.rdoc_files.include('README*')
48
+ rdoc.rdoc_files.include('lib/**/*.rb')
49
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
data/citrulu.gemspec CHANGED
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "citrulu"
8
- s.version = "0.1.0"
8
+ s.version = "0.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Duncan Stuart"]
12
12
  s.date = "2012-10-29"
13
- s.description = " Citrulu exposes an api for creating, editing and compiling test files (http://www.citrulu.com/api). This gem provides a wrapper around that api which allows you to work with TestFile objects locally. "
13
+ s.description = "Citrulu exposes an api for creating, editing and compiling test files (http://www.citrulu.com/api). This gem provides a wrapper around that api which allows you to work with TestFile objects locally."
14
14
  s.email = ["contact@dxw.com", "duncan@dxw.com"]
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE.txt",
data/lib/citrulu.rb CHANGED
@@ -3,9 +3,10 @@ Dir[File.expand_path('../faraday/*.rb', __FILE__)].each{|f| require f}
3
3
  require 'faraday'
4
4
 
5
5
  module Citrulu
6
+ # The address of the Citrulu API
6
7
  BASE_URL = "https://www.citrulu.com/api/v1"
7
- # BASE_URL = "http://localhost:3000/api/v1"
8
8
 
9
+ # Sets up the connection to the Citrulu API using the api key, which must already have been set to CITRULU_API_KEY
9
10
  def self.connection
10
11
  Faraday.new(:url => BASE_URL) do |connection|
11
12
  connection.request :url_encoded # form-encode POST params
data/lib/citrulu/error.rb CHANGED
@@ -1,4 +1,4 @@
1
- module Citrulu
1
+ module Citrulu #:nodoc:
2
2
  # Custom error class for rescuing from all Citrulu errors
3
3
  class Error < StandardError; end
4
4
 
@@ -4,18 +4,25 @@ require 'active_model'
4
4
  class TestFile
5
5
  attr_accessor :name
6
6
  attr_accessor :test_file_text
7
+ # The tests which will be run. May differ from test_file_text if the
7
8
  attr_reader :compiled_test_file_text
9
+ # Boolean - if set to true, the tests will be run
8
10
  attr_accessor :run_tests
11
+ # The list of domains in compiled_test_file_text
9
12
  attr_reader :domains
13
+ # How often the test file is run, in seconds (e.g. 3600 = once every hour)
10
14
  attr_reader :frequency
11
15
  attr_reader :id
12
16
  attr_reader :tutorial_id
13
17
  attr_reader :updated_at
14
18
  attr_reader :created_at
15
19
 
20
+ # A rails style error object (using ActiveModel::Errors) - use errors.full_messages to access an array of error messages
16
21
  attr_reader :errors
17
22
 
18
- def self.attribute_method?(attribute)
23
+ protected
24
+
25
+ def self.attribute_method?(attribute) #:nodoc:
19
26
  [ :name,
20
27
  :test_file_text,
21
28
  :compiled_test_file_text,
@@ -29,27 +36,38 @@ class TestFile
29
36
  ].include?(attribute)
30
37
  end
31
38
 
39
+ public
40
+
32
41
  extend ActiveModel::Naming
33
42
  # Required dependency for ActiveModel::Errors
34
43
 
35
- # This is for the user creating Test Files. Internally we use build (defined below)
36
- def initialize(args={})
37
- args.each do |attr, value|
38
- self.public_send("#{attr}=", value)
39
- end if args
44
+ class << self
45
+ private
46
+
47
+ # Required in order for ActiveModel::Errors to work correctly
48
+ def self.human_attribute_name(attr, options = {})
49
+ attr
50
+ end
51
+
52
+ # Required in order for ActiveModel::Errors to work correctly
53
+ def self.lookup_ancestors
54
+ [self]
55
+ end
40
56
  end
41
57
 
42
- # The following methods are needed in order for ActiveModel::Errors to work correctly
58
+ private
59
+
60
+ # Required in order for ActiveModel::Errors to work correctly
43
61
  def read_attribute_for_validation(attr)
44
62
  send(attr)
45
63
  end
46
-
47
- def self.human_attribute_name(attr, options = {})
48
- attr
49
- end
50
-
51
- def self.lookup_ancestors
52
- [self]
64
+
65
+ public
66
+
67
+ def initialize(args={})
68
+ args.each do |attr, value|
69
+ self.public_send("#{attr}=", value)
70
+ end if args
53
71
  end
54
72
 
55
73
 
@@ -84,7 +102,7 @@ class TestFile
84
102
  build(body)
85
103
  else # 422 - validation errors
86
104
  test_file = build(options)
87
- test_file.add_all_errors(body["errors"])
105
+ add_all_errors(test_file, body["errors"])
88
106
  return test_file
89
107
  end
90
108
  end
@@ -98,7 +116,7 @@ class TestFile
98
116
  build(body)
99
117
  else # 422 - validation errors
100
118
  test_file = find(id)
101
- test_file.add_all_errors(body["errors"])
119
+ add_all_errors(test_file, body["errors"])
102
120
  return test_file
103
121
  end
104
122
  end
@@ -121,7 +139,7 @@ class TestFile
121
139
  # Instance Methods #
122
140
  ####################
123
141
 
124
- # Create or update the current object
142
+ # Create or update the current test file on Citrulu
125
143
  def save
126
144
  options = { name: name,
127
145
  test_file_text: test_file_text,
@@ -134,10 +152,12 @@ class TestFile
134
152
  end
135
153
  end
136
154
 
155
+ # Deletes the current test file on Citrulu
137
156
  def destroy
138
157
  self.class.delete(id)
139
158
  end
140
159
 
160
+ # Attempts to compile the test file. Returns any compilation errors as an errors object. Use errors.full_messages to access the array of error messages.
141
161
  def compile
142
162
  self.class.compile(id)
143
163
  end
@@ -150,7 +170,6 @@ class TestFile
150
170
  # Utility Methods #
151
171
  ####################
152
172
 
153
- #TODO: really not sure about this...
154
173
  class << self
155
174
  private
156
175
 
@@ -165,17 +184,17 @@ class TestFile
165
184
  return test_file
166
185
  end
167
186
 
187
+ def add_all_errors(test_file, error_hash)
188
+ error_hash.each do |attribute, messages|
189
+ messages.each do |message|
190
+ test_file.errors.add(attribute.to_sym, message)
191
+ end
192
+ end
193
+ end
194
+
168
195
  def parse_response(json)
169
196
  attrs = JSON.parse(json)
170
197
  build(attrs)
171
- end
172
- end
173
-
174
- def add_all_errors(error_hash)
175
- error_hash.each do |attribute, messages|
176
- messages.each do |message|
177
- errors.add(attribute.to_sym, message)
178
- end
179
- end
198
+ end
180
199
  end
181
200
  end
@@ -5,6 +5,7 @@ require 'faraday'
5
5
 
6
6
  module FaradayMiddleware
7
7
  class RaiseHttpException < Faraday::Middleware
8
+ # Handle response codes 401, 404 and 500 as exceptions. See https://github.com/technoweenie/faraday#writing-middleware for more details.
8
9
  def call(env)
9
10
  @app.call(env).on_complete do |response|
10
11
  case response[:status].to_i
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: citrulu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -155,9 +155,9 @@ dependencies:
155
155
  - - ! '>='
156
156
  - !ruby/object:Gem::Version
157
157
  version: '0'
158
- description: ! ' Citrulu exposes an api for creating, editing and compiling test files
158
+ description: Citrulu exposes an api for creating, editing and compiling test files
159
159
  (http://www.citrulu.com/api). This gem provides a wrapper around that api which
160
- allows you to work with TestFile objects locally. '
160
+ allows you to work with TestFile objects locally.
161
161
  email:
162
162
  - contact@dxw.com
163
163
  - duncan@dxw.com
@@ -199,7 +199,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
199
199
  version: '0'
200
200
  segments:
201
201
  - 0
202
- hash: 1427762494516547865
202
+ hash: -1012160131491449687
203
203
  required_rubygems_version: !ruby/object:Gem::Requirement
204
204
  none: false
205
205
  requirements: