app_report 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/COPYING ADDED
@@ -0,0 +1,165 @@
1
+ GNU LESSER GENERAL PUBLIC LICENSE
2
+ Version 3, 29 June 2007
3
+
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5
+ Everyone is permitted to copy and distribute verbatim copies
6
+ of this license document, but changing it is not allowed.
7
+
8
+
9
+ This version of the GNU Lesser General Public License incorporates
10
+ the terms and conditions of version 3 of the GNU General Public
11
+ License, supplemented by the additional permissions listed below.
12
+
13
+ 0. Additional Definitions.
14
+
15
+ As used herein, "this License" refers to version 3 of the GNU Lesser
16
+ General Public License, and the "GNU GPL" refers to version 3 of the GNU
17
+ General Public License.
18
+
19
+ "The Library" refers to a covered work governed by this License,
20
+ other than an Application or a Combined Work as defined below.
21
+
22
+ An "Application" is any work that makes use of an interface provided
23
+ by the Library, but which is not otherwise based on the Library.
24
+ Defining a subclass of a class defined by the Library is deemed a mode
25
+ of using an interface provided by the Library.
26
+
27
+ A "Combined Work" is a work produced by combining or linking an
28
+ Application with the Library. The particular version of the Library
29
+ with which the Combined Work was made is also called the "Linked
30
+ Version".
31
+
32
+ The "Minimal Corresponding Source" for a Combined Work means the
33
+ Corresponding Source for the Combined Work, excluding any source code
34
+ for portions of the Combined Work that, considered in isolation, are
35
+ based on the Application, and not on the Linked Version.
36
+
37
+ The "Corresponding Application Code" for a Combined Work means the
38
+ object code and/or source code for the Application, including any data
39
+ and utility programs needed for reproducing the Combined Work from the
40
+ Application, but excluding the System Libraries of the Combined Work.
41
+
42
+ 1. Exception to Section 3 of the GNU GPL.
43
+
44
+ You may convey a covered work under sections 3 and 4 of this License
45
+ without being bound by section 3 of the GNU GPL.
46
+
47
+ 2. Conveying Modified Versions.
48
+
49
+ If you modify a copy of the Library, and, in your modifications, a
50
+ facility refers to a function or data to be supplied by an Application
51
+ that uses the facility (other than as an argument passed when the
52
+ facility is invoked), then you may convey a copy of the modified
53
+ version:
54
+
55
+ a) under this License, provided that you make a good faith effort to
56
+ ensure that, in the event an Application does not supply the
57
+ function or data, the facility still operates, and performs
58
+ whatever part of its purpose remains meaningful, or
59
+
60
+ b) under the GNU GPL, with none of the additional permissions of
61
+ this License applicable to that copy.
62
+
63
+ 3. Object Code Incorporating Material from Library Header Files.
64
+
65
+ The object code form of an Application may incorporate material from
66
+ a header file that is part of the Library. You may convey such object
67
+ code under terms of your choice, provided that, if the incorporated
68
+ material is not limited to numerical parameters, data structure
69
+ layouts and accessors, or small macros, inline functions and templates
70
+ (ten or fewer lines in length), you do both of the following:
71
+
72
+ a) Give prominent notice with each copy of the object code that the
73
+ Library is used in it and that the Library and its use are
74
+ covered by this License.
75
+
76
+ b) Accompany the object code with a copy of the GNU GPL and this license
77
+ document.
78
+
79
+ 4. Combined Works.
80
+
81
+ You may convey a Combined Work under terms of your choice that,
82
+ taken together, effectively do not restrict modification of the
83
+ portions of the Library contained in the Combined Work and reverse
84
+ engineering for debugging such modifications, if you also do each of
85
+ the following:
86
+
87
+ a) Give prominent notice with each copy of the Combined Work that
88
+ the Library is used in it and that the Library and its use are
89
+ covered by this License.
90
+
91
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
92
+ document.
93
+
94
+ c) For a Combined Work that displays copyright notices during
95
+ execution, include the copyright notice for the Library among
96
+ these notices, as well as a reference directing the user to the
97
+ copies of the GNU GPL and this license document.
98
+
99
+ d) Do one of the following:
100
+
101
+ 0) Convey the Minimal Corresponding Source under the terms of this
102
+ License, and the Corresponding Application Code in a form
103
+ suitable for, and under terms that permit, the user to
104
+ recombine or relink the Application with a modified version of
105
+ the Linked Version to produce a modified Combined Work, in the
106
+ manner specified by section 6 of the GNU GPL for conveying
107
+ Corresponding Source.
108
+
109
+ 1) Use a suitable shared library mechanism for linking with the
110
+ Library. A suitable mechanism is one that (a) uses at run time
111
+ a copy of the Library already present on the user's computer
112
+ system, and (b) will operate properly with a modified version
113
+ of the Library that is interface-compatible with the Linked
114
+ Version.
115
+
116
+ e) Provide Installation Information, but only if you would otherwise
117
+ be required to provide such information under section 6 of the
118
+ GNU GPL, and only to the extent that such information is
119
+ necessary to install and execute a modified version of the
120
+ Combined Work produced by recombining or relinking the
121
+ Application with a modified version of the Linked Version. (If
122
+ you use option 4d0, the Installation Information must accompany
123
+ the Minimal Corresponding Source and Corresponding Application
124
+ Code. If you use option 4d1, you must provide the Installation
125
+ Information in the manner specified by section 6 of the GNU GPL
126
+ for conveying Corresponding Source.)
127
+
128
+ 5. Combined Libraries.
129
+
130
+ You may place library facilities that are a work based on the
131
+ Library side by side in a single library together with other library
132
+ facilities that are not Applications and are not covered by this
133
+ License, and convey such a combined library under terms of your
134
+ choice, if you do both of the following:
135
+
136
+ a) Accompany the combined library with a copy of the same work based
137
+ on the Library, uncombined with any other library facilities,
138
+ conveyed under the terms of this License.
139
+
140
+ b) Give prominent notice with the combined library that part of it
141
+ is a work based on the Library, and explaining where to find the
142
+ accompanying uncombined form of the same work.
143
+
144
+ 6. Revised Versions of the GNU Lesser General Public License.
145
+
146
+ The Free Software Foundation may publish revised and/or new versions
147
+ of the GNU Lesser General Public License from time to time. Such new
148
+ versions will be similar in spirit to the present version, but may
149
+ differ in detail to address new problems or concerns.
150
+
151
+ Each version is given a distinguishing version number. If the
152
+ Library as you received it specifies that a certain numbered version
153
+ of the GNU Lesser General Public License "or any later version"
154
+ applies to it, you have the option of following the terms and
155
+ conditions either of that published version or of any later version
156
+ published by the Free Software Foundation. If the Library as you
157
+ received it does not specify a version number of the GNU Lesser
158
+ General Public License, you may choose any version of the GNU Lesser
159
+ General Public License ever published by the Free Software Foundation.
160
+
161
+ If the Library as you received it specifies that a proxy can decide
162
+ whether future versions of the GNU Lesser General Public License shall
163
+ apply, that proxy's public statement of acceptance of any version is
164
+ permanent authorization for you to choose that version for the
165
+ Library.
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.test_files = Dir['test/**/*_test.rb']
5
+ t.libs << 'test'
6
+ end
7
+
8
+ desc 'Run tests'
9
+ task :default => :test
@@ -0,0 +1,19 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "app_report"
3
+ s.version = "0.0.2"
4
+ s.description = "Ruby client to AppReport API!"
5
+ s.summary = "App Report!"
6
+ s.author = "Lucas D'Avila"
7
+ s.email = 'lucas@lucasdavi.la'
8
+ s.homepage = 'https://github.com/simple_services/app_report-ruby'
9
+ s.files = Dir["{lib/**/*.rb,README.rdoc,test/**/*.rb,Rakefile,*.gemspec,COPYING}"]
10
+
11
+ s.add_development_dependency 'minitest', '~> 4.6.1'
12
+ s.add_development_dependency 'minitest-colorize', '~> 0.0.5'
13
+ s.add_development_dependency 'webmock', '~> 1.10.0'
14
+
15
+ s.add_dependency 'active_support', '~> 3.0.0'
16
+ s.add_dependency 'simple_signer', '~> 0.0.1'
17
+ s.add_dependency 'faraday', '~> 0.8.6'
18
+ s.add_dependency 'multi_json', '~> 1.0'
19
+ end
@@ -0,0 +1,57 @@
1
+ =begin
2
+ This file is part of AppReport.
3
+
4
+ AppReport is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU Lesser General Public License as published by
6
+ the Free Software Foundation, version 3 of the License.
7
+
8
+ AppReport is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU Lesser General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Lesser General Public License
14
+ along with AppReport. If not, see <http://www.gnu.org/licenses/>.
15
+ =end
16
+
17
+ module AppReport
18
+ module API
19
+ class Base
20
+
21
+ attr_accessor :params
22
+
23
+ def initialize
24
+ @params = {}
25
+ end
26
+
27
+ def params_to_sign
28
+ []
29
+ end
30
+
31
+ def sign_params params
32
+ string = params.map { |k, v| v.to_s }.join
33
+ SimpleSigner.sign :secret_key => AppReport.settings.secret_key, :string => string
34
+ end
35
+
36
+ def signed_params
37
+ params = {}
38
+
39
+ # include params that must be signed
40
+ params_to_sign.each { |param|
41
+ params[param] = @params[param]# unless params.include? param
42
+ }
43
+
44
+ # include configured keys
45
+ params.merge! :app_name => AppReport.settings.app_name,
46
+ :expires => Time.now.to_i + AppReport.settings.expires_signed_url_after
47
+
48
+ # sign params
49
+ params.merge! :signature => sign_params(params),
50
+ :access_key => AppReport.settings.access_key
51
+
52
+ # include not signed params
53
+ @params.merge params
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,61 @@
1
+ =begin
2
+ This file is part of AppReport.
3
+
4
+ AppReport is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU Lesser General Public License as published by
6
+ the Free Software Foundation, version 3 of the License.
7
+
8
+ AppReport is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU Lesser General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Lesser General Public License
14
+ along with AppReport. If not, see <http://www.gnu.org/licenses/>.
15
+ =end
16
+
17
+ module AppReport
18
+ module API
19
+ class Jasper < AppReport::API::Base
20
+
21
+ def params_to_sign
22
+ [:app_name, :template_name, :expires]
23
+ end
24
+
25
+ def build! report
26
+
27
+ @report = report
28
+ validates_report! @report
29
+ @report.validates!
30
+
31
+ @params = @report.attributes
32
+
33
+ path = '/api/v1/factory/jasper/build.json'
34
+ response = AppReport::Client.post path, signed_params
35
+
36
+ decode_report! response.body
37
+ end
38
+
39
+ def decode_report! response_body
40
+ response_body = MultiJson.load response_body
41
+ report = response_body['report']
42
+
43
+ if report.blank?
44
+ raise AppReport::Errors::APIResponseError, "API returned a blank report!"
45
+ end
46
+
47
+ AppReport::Decoder.decode report['encoded'], report['encoding']
48
+ end
49
+
50
+ # validations
51
+
52
+ def validates_report! report
53
+ unless report.kind_of? AppReport::Report::Jasper
54
+ error_msg = "report must be a instance of AppReport::Report::Jasper not #{report.class.name}"
55
+ raise AppReport::Errors::ValidationError, error_msg
56
+ end
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,63 @@
1
+ =begin
2
+ This file is part of AppReport.
3
+
4
+ AppReport is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU Lesser General Public License as published by
6
+ the Free Software Foundation, version 3 of the License.
7
+
8
+ AppReport is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU Lesser General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Lesser General Public License
14
+ along with AppReport. If not, see <http://www.gnu.org/licenses/>.
15
+ =end
16
+
17
+ module AppReport
18
+ module Client
19
+
20
+ @@connection = nil
21
+ @@endpoint = 'http://reports.simpleservic.es'
22
+
23
+ mattr_accessor :endpoint
24
+
25
+ def self.post path, params = {}
26
+ response = connection.post do |request|
27
+ request.url path
28
+
29
+ request.headers['Content-Type'] = 'application/json'
30
+ request.body = MultiJson.dump params
31
+ end
32
+
33
+ raise_error_messages! response.body
34
+
35
+ response
36
+ end
37
+
38
+ def self.connection
39
+ if @@connection.nil?
40
+ @@connection = Faraday.new(:url => @@endpoint) { |faraday|
41
+ faraday.request :url_encoded
42
+ faraday.adapter Faraday.default_adapter # same as :net_http
43
+ }
44
+ end
45
+
46
+ @@connection
47
+ end
48
+
49
+ def self.raise_error_messages! response_body
50
+ response_body = MultiJson.load response_body
51
+
52
+ if response_body.try(:[], 'messages').try(:[], 'has_any_error')
53
+ error_messages = response_body['messages']['messages'].map { |m|
54
+ m['message']
55
+ }
56
+
57
+ raise AppReport::Errors::APIError, \
58
+ "AppReport API error: #{error_messages}"
59
+ end
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,53 @@
1
+ =begin
2
+ This file is part of AppReport.
3
+
4
+ AppReport is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU Lesser General Public License as published by
6
+ the Free Software Foundation, version 3 of the License.
7
+
8
+ AppReport is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU Lesser General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Lesser General Public License
14
+ along with AppReport. If not, see <http://www.gnu.org/licenses/>.
15
+ =end
16
+
17
+ module AppReport
18
+ module Configuration
19
+
20
+ @@config_keys = [
21
+ :app_name,
22
+ :access_key,
23
+ :secret_key,
24
+ :expires_signed_url_after
25
+ ]
26
+
27
+ mattr_accessor *@@config_keys
28
+
29
+ # default values
30
+
31
+ # expire urls after 10 minutes, by default.
32
+ @@expires_signed_url_after = 600
33
+
34
+ def self.expires_signed_url_after= value
35
+ unless value.kind_of? Integer and value > 0
36
+ raise AppReport::Errors::InvalidConfigurationError, "value must be an integer > 0, not #{value}"
37
+ end
38
+
39
+ @@expires_signed_url_after = value
40
+ end
41
+
42
+ def self.config_keys
43
+ @@config_keys.clone
44
+ end
45
+
46
+ def self.validates!
47
+ config_keys.each do |key|
48
+ raise AppReport::Errors::RequiredConfigurationError, "#{key} is required" if send(key).blank?
49
+ end
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,41 @@
1
+ =begin
2
+ This file is part of AppReport.
3
+
4
+ AppReport is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU Lesser General Public License as published by
6
+ the Free Software Foundation, version 3 of the License.
7
+
8
+ AppReport is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU Lesser General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Lesser General Public License
14
+ along with AppReport. If not, see <http://www.gnu.org/licenses/>.
15
+ =end
16
+
17
+ module AppReport
18
+ module Decoder
19
+
20
+ def self.decode encoded, encoding = 'base64'
21
+ supported = ['base64']
22
+
23
+ if encoded.blank?
24
+ raise AppReport::Errors::DecoderError, "Encoded can't be blank"
25
+
26
+ elsif encoding.blank?
27
+ raise AppReport::Errors::DecoderError, "Encoding can't be blank!"
28
+
29
+ elsif not supported.include? encoding
30
+ raise AppReport::Errors::DecoderError, "Encoding '#{encoding}' not supported, only #{supported}."
31
+ end
32
+
33
+ send "decode_#{encoding}", encoded
34
+ end
35
+
36
+ def self.decode_base64 encoded
37
+ Base64.decode64 encoded
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,56 @@
1
+ =begin
2
+ This file is part of AppReport.
3
+
4
+ AppReport is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU Lesser General Public License as published by
6
+ the Free Software Foundation, version 3 of the License.
7
+
8
+ AppReport is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU Lesser General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Lesser General Public License
14
+ along with AppReport. If not, see <http://www.gnu.org/licenses/>.
15
+ =end
16
+
17
+ module AppReport
18
+ module Errors
19
+ class AppReportError < StandardError
20
+ end
21
+
22
+
23
+ # validation
24
+
25
+ class ValidationError < AppReportError
26
+ end
27
+
28
+
29
+ # configuration
30
+
31
+ class ConfigurationError < AppReportError
32
+ end
33
+
34
+ class RequiredConfigurationError < ConfigurationError
35
+ end
36
+
37
+ class InvalidConfigurationError < ConfigurationError
38
+ end
39
+
40
+
41
+ # API
42
+
43
+ class APIError < AppReportError
44
+ end
45
+
46
+ class APIResponseError < APIError
47
+ end
48
+
49
+
50
+ # decoder
51
+
52
+ class DecoderError < AppReportError
53
+ end
54
+
55
+ end
56
+ end
@@ -0,0 +1,93 @@
1
+ =begin
2
+ This file is part of AppReport.
3
+
4
+ AppReport is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU Lesser General Public License as published by
6
+ the Free Software Foundation, version 3 of the License.
7
+
8
+ AppReport is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU Lesser General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Lesser General Public License
14
+ along with AppReport. If not, see <http://www.gnu.org/licenses/>.
15
+ =end
16
+
17
+ module AppReport
18
+ module Report
19
+
20
+ class Jasper
21
+
22
+ def initialize attributes = {}
23
+ attributes = {
24
+ :template_name => nil,
25
+ :data_type => 'empty',
26
+ :data => '',
27
+ :xpath_expression => '',
28
+ :args => {}
29
+ }.merge attributes
30
+
31
+ @attributes = attributes
32
+ end
33
+
34
+ # attributes
35
+
36
+ def attributes
37
+ @attributes.clone
38
+ end
39
+
40
+ def template_name
41
+ @attributes[:template_name]
42
+ end
43
+
44
+ def data_type
45
+ @attributes[:data_type]
46
+ end
47
+
48
+ def data
49
+ @attributes[:data]
50
+ end
51
+
52
+ def xpath_expression
53
+ @attributes[:xpath_expression]
54
+ end
55
+
56
+ def args
57
+ @attributes[:args]
58
+ end
59
+
60
+
61
+ # validations
62
+
63
+ def validates_all_attributes!
64
+ @attributes.each do |key, value|
65
+ send "validates_#{key}!"
66
+ end
67
+ end
68
+ alias validates! validates_all_attributes!
69
+
70
+ def validates_presence_of! option_name
71
+ raise AppReport::Errors::ValidationError, "#{option_name} is required" if send(option_name).blank?
72
+ end
73
+
74
+ def validates_template_name!
75
+ validates_presence_of! :template_name
76
+ end
77
+
78
+ def validates_data_type!
79
+ end
80
+
81
+ def validates_data!
82
+ end
83
+
84
+ def validates_xpath_expression!
85
+ end
86
+
87
+ def validates_args!
88
+ end
89
+
90
+ end
91
+
92
+ end
93
+ end
data/lib/app_report.rb ADDED
@@ -0,0 +1,48 @@
1
+ =begin
2
+ This file is part of AppReport.
3
+
4
+ AppReport is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU Lesser General Public License as published by
6
+ the Free Software Foundation, version 3 of the License.
7
+
8
+ AppReport is distributed in the hope that it will be useful,
9
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ GNU Lesser General Public License for more details.
12
+
13
+ You should have received a copy of the GNU Lesser General Public License
14
+ along with AppReport. If not, see <http://www.gnu.org/licenses/>.
15
+ =end
16
+
17
+ require 'active_support/core_ext/object/blank'
18
+ require 'active_support/core_ext/hash/except'
19
+ require 'active_support/core_ext/module/attribute_accessors'
20
+ require 'active_support/core_ext/object/try'
21
+
22
+ require 'simple_signer'
23
+ require 'multi_json'
24
+ require 'faraday'
25
+
26
+ require 'base64'
27
+
28
+ require 'app_report/errors'
29
+ require 'app_report/configuration'
30
+ require 'app_report/client'
31
+ require 'app_report/decoder'
32
+ require 'app_report/api/base'
33
+ require 'app_report/api/jasper'
34
+ require 'app_report/report/jasper'
35
+
36
+ module AppReport
37
+
38
+ def self.configure
39
+ yield AppReport::Configuration
40
+
41
+ AppReport::Configuration.validates!
42
+ AppReport::Configuration
43
+ end
44
+
45
+ def self.settings
46
+ AppReport::Configuration
47
+ end
48
+ end