mind_meister_client 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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0fc68e40add70b4b0e5e9a7ef1ce6c241c893cc5
4
+ data.tar.gz: ec3d39648ce2466c105b69fa0c4dee3afefe1c30
5
+ SHA512:
6
+ metadata.gz: 1ca17f57879cc32210dbc53ecce416709d4a8eae8802895343c6be3429ff0d4b3982c36c44da3411aa5030aaf3df7dfddb3b82bcfe4e379332fe284767e17253
7
+ data.tar.gz: 3431383f4b731e75ccfefd0e34124abcf6423af43cf24dd1c228d3d23015a938a923020aba45e5a595190f34c82e91e444c572b04658246b1689f58a78a604c6
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mind_meister_client.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Mailo Svetel
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # Mind Meister Ruby client
2
+
3
+ Client for API of web based and mobile mind mapping app -- [MindMeister](https://www.mindmeister.com)
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'mind_meister_client'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install mind_meister_client
20
+
21
+ ## Usage
22
+
23
+ I've maid one testing Rails app, and the usage was as follows.
24
+
25
+ app/controllers/application_controller.rb
26
+ ~~~ruby
27
+ before_action :setup_mm_client
28
+
29
+ private
30
+
31
+ def setup_mm_client
32
+ @mm_client = MindMeisterClient::Requester.new '1625a1388f512a203faa43e8685bcdde',
33
+ '2d845879a2f2a3b1'
34
+
35
+ @mm_client.auth_token= current_user.mm_auth_token if current_user
36
+ end
37
+ ~~~
38
+ (current_user comes from [devise](https://github.com/plataformatec/devise))
39
+
40
+ app/controllers/welcome_controller.rb
41
+
42
+ ~~~ruby
43
+ def index
44
+ begin
45
+ @maps = @mm_client.maps_get_list
46
+ rescue MindMeisterClient::ApiCallRequiredError => e
47
+ redirect_to e.api_call_url
48
+ end
49
+
50
+ end
51
+
52
+ # MindMeister will point user to this url after successful authorization
53
+ def callback
54
+ auth_data = @mm_client.callback params[:frob]
55
+
56
+ user = User.find_or_create_by email: auth_data[:auth][:user][:email] do |user|
57
+ user.mm_auth_token = auth_data[:auth][:token]
58
+ user.full_name = auth_data[:auth][:user][:fullname]
59
+ end
60
+
61
+ sign_in(:user, user)
62
+
63
+ redirect_to 'index'
64
+ end
65
+ ~~~
66
+
67
+ config/routes.rb
68
+ ~~~ruby
69
+ root 'welcome#index'
70
+ get 'welcome/callback'
71
+
72
+ devise_for :users
73
+ ~~~
74
+
75
+ app/views/welcome/index.html.erb
76
+ ~~~erb
77
+ My maps
78
+
79
+ <ul>
80
+ <% @maps[:maps][:map].each do |map_data| %>
81
+ <li><%= map_data[:title] %> (ID: <%= map_data[:id] %>)</li>
82
+ <% end %>
83
+ </ul>
84
+ ~~~
85
+
86
+ And also there was needed migration to adjust scheme for User model
87
+ ~~~ruby
88
+ def change
89
+ change_table :users do |t|
90
+ t.column :mm_auth_token, :string
91
+ t.column :full_name, :string
92
+ end
93
+ end
94
+ ~~~
95
+
96
+ This implementation is very far from production-ready, but I hope it'll help as a quick start.
97
+
98
+ ## Contributing
99
+
100
+ 1. [Fork it](https://github.com/roolo/mind_meister_client/fork) ( https://github.com/roolo/mind_meister_client/fork )
101
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
102
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
103
+ 4. Push to the branch (`git push origin my-new-feature`)
104
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,29 @@
1
+ module MindMeisterClient
2
+ class ApiCallRequiredError < Exception
3
+ attr_accessor :msg
4
+ attr_accessor :template
5
+ attr_accessor :api_call_url
6
+
7
+ # @param [String] msg
8
+ # @param [String] api_call_url
9
+ def initialize msg, api_call_url
10
+ @msg = msg
11
+ @api_call_url = api_call_url
12
+ end
13
+
14
+ def to_s
15
+ setup_template unless @template
16
+
17
+ data = {
18
+ api_call_url: @api_call_url,
19
+ msg: @msg
20
+ }
21
+
22
+ @template%data
23
+ end
24
+
25
+ def setup_template
26
+ @template = '%{msg}: %{api_call_url}'
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,57 @@
1
+ module MindMeisterClient
2
+ class RequestError < Exception
3
+ # Object not found
4
+ MM_ERROR_OBJECT_NOT_FOUND = 20
5
+ # Well...
6
+ MM_ERROR_REQUIRED_PARAMETER_MISSING = 23
7
+ # The passed signature was invalid.
8
+ MM_ERROR_INVALID_SIGNATURE = 96
9
+ # The call required signing but no signature was sent.
10
+ MM_ERROR_MISSING_SIGNATURE = 97
11
+ # The login details or auth token passed were invalid.
12
+ MM_ERROR_LOGIN_FAILED = 98
13
+ # The API key passed was not valid or has expired.
14
+ MM_ERROR_INVALID_API_KEY = 100
15
+ # The specified frob does not exist or has already been used.
16
+ MM_ERROR_INVALID_FROB = 108
17
+ #The requested method was not found.
18
+ MM_ERROR_METHOD_NOT_FOUND = 112
19
+
20
+ attr_accessor :code
21
+ attr_accessor :msg
22
+ attr_accessor :provided_data
23
+ attr_accessor :template
24
+
25
+ # @param [String] code
26
+ # @param [String] msg
27
+ # @param [Hash] provided_data
28
+ def initialize code, msg, provided_data
29
+ @code = code
30
+ @msg = msg
31
+ @provided_data = provided_data
32
+ end
33
+
34
+ def to_s
35
+ setup_template unless @template
36
+
37
+ data = @provided_data.dup
38
+ data[:code] = @code
39
+ data[:msg] = @msg
40
+
41
+ @template%data
42
+ end
43
+
44
+ def setup_template
45
+ @template = '%{code}: %{method} -- %{msg}'
46
+ case @code.to_i
47
+ when MM_ERROR_METHOD_NOT_FOUND
48
+ @template += ' (method name between >s: >%{method}<)'
49
+ when MM_ERROR_REQUIRED_PARAMETER_MISSING
50
+ @template += @provided_data.inspect
51
+ when MM_ERROR_INVALID_FROB
52
+ @template += ' (provided frob between >s: >%{frob}<)'
53
+ else
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ module MindMeisterClient
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,164 @@
1
+ require 'json'
2
+ require 'mind_meister_client/version'
3
+ require 'mind_meister_client/request_error'
4
+ require 'mind_meister_client/api_call_required_error'
5
+
6
+
7
+ # Before using this client you need to register your app at https://www.mindmeister.com/api -- API Keys
8
+ # For list of all available methods refer to https://www.mindmeister.com/developers/explore
9
+ module MindMeisterClient
10
+ class Requester
11
+ MM_API_SCOPES = %w( auth boundaries connections files folders ideas images maps people realtime reflection tasks
12
+ test themes user)
13
+ SERVER_ADDRESS = 'www.mindmeister.com'
14
+
15
+ attr_accessor :api_key
16
+ attr_accessor :auth_token
17
+ attr_accessor :http_client
18
+
19
+ def initialize api_key, secret_key, auth_token = nil
20
+ @api_key = api_key
21
+ @auth_token = auth_token
22
+ @secret_key = secret_key
23
+
24
+ init_http_client
25
+ end
26
+
27
+ def init_http_client
28
+ @http_client = Net::HTTP.new SERVER_ADDRESS, 443
29
+ @http_client.use_ssl = true
30
+ end
31
+
32
+ # Handles callback call after user of MMC acquired frob
33
+ #
34
+ # @param [String] frob
35
+ #
36
+ # @return [Hash]
37
+ def callback frob
38
+ # Calling MM API to get actual auth_token
39
+ auth_get_token frob: frob
40
+ end
41
+
42
+ # When calling MM API method, it is expected to be underscore separated and without the initial mm_
43
+ #
44
+ # @param [Symbol] id Name of method originally called
45
+ def method_missing id, *args
46
+ if api_scope? id
47
+ api_method_name = prepare_api_method id
48
+ request api_method_name, *args
49
+ else
50
+ super
51
+ end
52
+ end
53
+
54
+ # Detects if method name seems to be from MM API
55
+ #
56
+ # @param [Symbol] ruby_method_name
57
+ #
58
+ # @return [TrueClass]
59
+ def api_scope? ruby_method_name
60
+ ruby_method_scope = ruby_method_name.to_s.split('_')[0]
61
+
62
+ ruby_method_scope && MM_API_SCOPES.include?(ruby_method_scope)
63
+ end
64
+
65
+
66
+ # Makes the actual call to MM API
67
+ #
68
+ # @raise [MindMeisterClient::ApiCallRequiredError] When no auth_token has been set up
69
+ # @raise [MindMeisterClient::RequestError] When MM API returns an error
70
+ #
71
+ # @param [String] api_method_name
72
+ #
73
+ # @return [Hash]
74
+ def request api_method_name, *args
75
+ unless @auth_token || api_method_name =~ /auth/
76
+ raise_auth_token_request
77
+ end
78
+
79
+ if args[0]
80
+ api_call_params = args[0].merge(api_default_params)
81
+ else
82
+ api_call_params = api_default_params
83
+ end
84
+
85
+ api_call_params[:method] = api_method_name
86
+
87
+ api_data = JSON.parse http_client.get('/services/rest?' + signed_query_string(api_call_params)).body,
88
+ symbolize_names: true
89
+
90
+ if api_data[:rsp][:stat] == 'fail'
91
+ raise RequestError.new api_data[:rsp][:err][:code].to_i,
92
+ api_data[:rsp][:err][:msg],
93
+ api_call_params
94
+ else
95
+ api_data[:rsp]
96
+ end
97
+
98
+ end
99
+
100
+ # @raise [ApiCallRequiredError] Every day'n'night!
101
+ def raise_auth_token_request
102
+ api_call_params = {
103
+ api_key: @api_key,
104
+ method: 'mm.auth.getToken',
105
+ perms: 'read'
106
+ }
107
+ raise ApiCallRequiredError.new 'Authentication token missing',
108
+ 'https://%s/services/auth/?%s'%[
109
+ SERVER_ADDRESS,
110
+ signed_query_string(api_call_params)
111
+ ]
112
+ end
113
+
114
+ # Bare minimum to send to MM API
115
+ #
116
+ # @return [Hash]
117
+ def api_default_params
118
+ { api_key: @api_key,
119
+ auth_token: @auth_token,
120
+ response_format: 'json'
121
+ }
122
+ end
123
+
124
+ # maps_new_from_template -> mm.maps.newFromTemplate
125
+ #
126
+ # This is helper for method_missing method of this class
127
+ #
128
+ # @param [Symbol] ruby_method_name
129
+ # @return [String]
130
+ def prepare_api_method ruby_method_name
131
+ rmn_parts = ruby_method_name.to_s.split('_')
132
+
133
+ 'mm.%s.%s%s'%[
134
+ rmn_parts[0],
135
+ rmn_parts[1],
136
+ rmn_parts[2..rmn_parts.length].map(&:capitalize).join('')
137
+ ]
138
+
139
+ end
140
+
141
+ # From hash, this methods creates query parameters for API call. This method also appends signature, required by
142
+ # most of MindMeister API calls.
143
+ #
144
+ # More about signing MM API calls at https://www.mindmeister.com/developers/authentication
145
+ #
146
+ # @param [Hash] params
147
+ #
148
+ # @return [String]
149
+ def signed_query_string params
150
+ query_params_joined = params.sort.inject('') { |memo, key|
151
+ memo += key[0].to_s + key[1].to_s
152
+ memo
153
+ }
154
+
155
+ signature_data = @secret_key + query_params_joined
156
+
157
+ query_string_params = URI.encode_www_form(params)
158
+
159
+ signature = Digest::MD5.hexdigest(signature_data)
160
+
161
+ query_string_params + '&api_sig=' + signature
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mind_meister_client/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'mind_meister_client'
8
+ spec.version = MindMeisterClient::VERSION
9
+ spec.authors = ['Mailo Svetel']
10
+ spec.email = ['development@rooland.cz']
11
+ spec.summary = 'Client for API of web based mind mapping app -- MindMeister'
12
+ # spec.description = %q{TODO: Write a longer description. Optional.}
13
+ spec.homepage = 'https://github.com/roolo/mind_meister_client'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.7'
22
+ spec.add_development_dependency 'rake', '~> 10.0'
23
+ spec.add_development_dependency 'rspec', '~> 3.3.0'
24
+ end
@@ -0,0 +1,58 @@
1
+ describe MindMeisterClient::Requester do
2
+ subject { MindMeisterClient::Requester.new('1625a1388f512a203faa43e8685bcdde', '2d845879a2f2a3b1') }
3
+
4
+ describe '#prepare_api_method' do
5
+ it 'prepares mm.maps.getList' do
6
+ expect(subject.prepare_api_method(:maps_get_list)).to eq 'mm.maps.getList'
7
+ end
8
+
9
+ it 'prepares mm.auth.getToken' do
10
+ expect(subject.prepare_api_method(:auth_get_token)).to eq 'mm.auth.getToken'
11
+ end
12
+
13
+ it 'prepares mm.maps.newFromTemplate' do
14
+ expect(subject.prepare_api_method(:maps_new_from_template)).to eq 'mm.maps.newFromTemplate'
15
+ end
16
+ end
17
+
18
+
19
+ describe '#api_scope?' do
20
+ describe 'MM API scopes' do
21
+ it 'detects MM API scope for maps_get_list' do
22
+ expect(subject.api_scope?(:maps_get_list)).to be_truthy
23
+ end
24
+
25
+ it 'detects MM API scope for auth_get_token' do
26
+ expect(subject.api_scope?(:auth_get_token)).to be_truthy
27
+ end
28
+
29
+ it 'detects MM API scope for maps_new_from_template' do
30
+ expect(subject.api_scope?(:maps_new_from_template)).to be_truthy
31
+ end
32
+ end
33
+
34
+ describe 'Ruby methods' do
35
+ it 'does not detect MM API scope for each_index' do
36
+ expect(subject.api_scope?(:each_index)).to be_falsey
37
+ end
38
+
39
+ it 'does not detect MM API scope for to_i' do
40
+ expect(subject.api_scope?(:to_i)).to be_falsey
41
+ end
42
+ end
43
+ end
44
+
45
+
46
+ describe '#signed_query_string' do
47
+ it 'creates correct query string' do
48
+ new_params = {
49
+ x: 4,
50
+ h: 6,
51
+ a: 10
52
+ }
53
+ signed_query = subject.signed_query_string(new_params)
54
+
55
+ expect(signed_query).to eq 'x=4&h=6&a=10&api_sig=3d9576c5e7068213a40354db62f9fbc3'
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,103 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'mind_meister_client'
5
+
6
+ Dir['spec/support/*.rb'].each {|file| load file}
7
+
8
+ # This file was generated by the `rspec --init` command. Conventionally, all
9
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
10
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
11
+ # this file to always be loaded, without a need to explicitly require it in any
12
+ # files.
13
+ #
14
+ # Given that it is always loaded, you are encouraged to keep this file as
15
+ # light-weight as possible. Requiring heavyweight dependencies from this file
16
+ # will add to the boot time of your test suite on EVERY test run, even for an
17
+ # individual file that may not need all of that loaded. Instead, consider making
18
+ # a separate helper file that requires the additional dependencies and performs
19
+ # the additional setup, and require it from the spec files that actually need
20
+ # it.
21
+ #
22
+ # The `.rspec` file also contains a few flags that are not defaults but that
23
+ # users commonly want.
24
+ #
25
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
26
+ RSpec.configure do |config|
27
+ # rspec-expectations config goes here. You can use an alternate
28
+ # assertion/expectation library such as wrong or the stdlib/minitest
29
+ # assertions if you prefer.
30
+ config.expect_with :rspec do |expectations|
31
+ # This option will default to `true` in RSpec 4. It makes the `description`
32
+ # and `failure_message` of custom matchers include text for helper methods
33
+ # defined using `chain`, e.g.:
34
+ # be_bigger_than(2).and_smaller_than(4).description
35
+ # # => "be bigger than 2 and smaller than 4"
36
+ # ...rather than:
37
+ # # => "be bigger than 2"
38
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
39
+ end
40
+
41
+ # rspec-mocks config goes here. You can use an alternate test double
42
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
43
+ config.mock_with :rspec do |mocks|
44
+ # Prevents you from mocking or stubbing a method that does not exist on
45
+ # a real object. This is generally recommended, and will default to
46
+ # `true` in RSpec 4.
47
+ mocks.verify_partial_doubles = true
48
+ end
49
+
50
+ # The settings below are suggested to provide a good initial experience
51
+ # with RSpec, but feel free to customize to your heart's content.
52
+ =begin
53
+ # These two settings work together to allow you to limit a spec run
54
+ # to individual examples or groups you care about by tagging them with
55
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
56
+ # get run.
57
+ config.filter_run :focus
58
+ config.run_all_when_everything_filtered = true
59
+
60
+ # Allows RSpec to persist some state between runs in order to support
61
+ # the `--only-failures` and `--next-failure` CLI options. We recommend
62
+ # you configure your source control system to ignore this file.
63
+ config.example_status_persistence_file_path = "spec/examples.txt"
64
+
65
+ # Limits the available syntax to the non-monkey patched syntax that is
66
+ # recommended. For more details, see:
67
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
68
+ # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
69
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
70
+ config.disable_monkey_patching!
71
+
72
+ # This setting enables warnings. It's recommended, but in some cases may
73
+ # be too noisy due to issues in dependencies.
74
+ config.warnings = true
75
+
76
+ # Many RSpec users commonly either run the entire suite or an individual
77
+ # file, and it's useful to allow more verbose output when running an
78
+ # individual spec file.
79
+ if config.files_to_run.one?
80
+ # Use the documentation formatter for detailed output,
81
+ # unless a formatter has already been configured
82
+ # (e.g. via a command-line flag).
83
+ config.default_formatter = 'doc'
84
+ end
85
+
86
+ # Print the 10 slowest examples and example groups at the
87
+ # end of the spec run, to help surface which specs are running
88
+ # particularly slow.
89
+ config.profile_examples = 10
90
+
91
+ # Run specs in random order to surface order dependencies. If you find an
92
+ # order dependency and want to debug it, you can fix the order by providing
93
+ # the seed, which is printed after each run.
94
+ # --seed 1234
95
+ config.order = :random
96
+
97
+ # Seed global randomization in this process using the `--seed` CLI option.
98
+ # Setting this allows you to use `--seed` to deterministically reproduce
99
+ # test failures related to randomization by passing the same `--seed` value
100
+ # as the one that triggered the failure.
101
+ Kernel.srand config.seed
102
+ =end
103
+ end
File without changes
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mind_meister_client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Mailo Svetel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-19 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: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.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: 3.3.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 3.3.0
55
+ description:
56
+ email:
57
+ - development@rooland.cz
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - ".gitignore"
63
+ - ".rspec"
64
+ - Gemfile
65
+ - LICENSE.txt
66
+ - README.md
67
+ - Rakefile
68
+ - lib/mind_meister_client.rb
69
+ - lib/mind_meister_client/api_call_required_error.rb
70
+ - lib/mind_meister_client/request_error.rb
71
+ - lib/mind_meister_client/version.rb
72
+ - mind_meister_client.gemspec
73
+ - spec/mind_meister_client/requester_spec.rb
74
+ - spec/spec_helper.rb
75
+ - spec/support/.gitkeep
76
+ homepage: https://github.com/roolo/mind_meister_client
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.4.6
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Client for API of web based mind mapping app -- MindMeister
100
+ test_files:
101
+ - spec/mind_meister_client/requester_spec.rb
102
+ - spec/spec_helper.rb
103
+ - spec/support/.gitkeep