search-kit 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +159 -9
  3. data/lib/search_kit/cli/search.rb +1 -1
  4. data/lib/search_kit/clients/documents.rb +4 -4
  5. data/lib/search_kit/clients/search.rb +1 -1
  6. data/lib/search_kit/models/document.rb +10 -0
  7. data/lib/search_kit/version.rb +1 -1
  8. data/search-kit.gemspec +3 -2
  9. data/spec/search_kit/cli/search_spec.rb +3 -3
  10. data/spec/search_kit/clients/search_spec.rb +2 -2
  11. data/spec/search_kit/models/document_spec.rb +11 -1
  12. metadata +2 -45
  13. data/Gemfile +0 -4
  14. data/Gemfile.lock +0 -88
  15. data/LICENSE.txt +0 -21
  16. data/Rakefile +0 -6
  17. data/config/locales/en.yml +0 -113
  18. data/coverage/assets/0.10.0/application.css +0 -799
  19. data/coverage/assets/0.10.0/application.js +0 -1707
  20. data/coverage/assets/0.10.0/colorbox/border.png +0 -0
  21. data/coverage/assets/0.10.0/colorbox/controls.png +0 -0
  22. data/coverage/assets/0.10.0/colorbox/loading.gif +0 -0
  23. data/coverage/assets/0.10.0/colorbox/loading_background.png +0 -0
  24. data/coverage/assets/0.10.0/favicon_green.png +0 -0
  25. data/coverage/assets/0.10.0/favicon_red.png +0 -0
  26. data/coverage/assets/0.10.0/favicon_yellow.png +0 -0
  27. data/coverage/assets/0.10.0/loading.gif +0 -0
  28. data/coverage/assets/0.10.0/magnify.png +0 -0
  29. data/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  30. data/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  31. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  32. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  33. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  34. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  35. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  36. data/coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  37. data/coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
  38. data/coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  39. data/coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
  40. data/coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
  41. data/coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  42. data/coverage/index.html +0 -26500
  43. data/demo/videos +0 -112
  44. data/demo/videos.json +0 -14292
  45. data/log/search-kit-development.log +0 -53
  46. data/log/search-kit-test.log +0 -74
  47. data/log/service-layer-development.log +0 -282
  48. data/log/service-layer-test.log +0 -2874
  49. data/pkg/search-kit-0.0.3.gem +0 -0
  50. data/pkg/search-kit-0.0.4.gem +0 -0
  51. data/pkg/search-kit-0.0.5.gem +0 -0
  52. data/pkg/search-kit-0.0.6.gem +0 -0
  53. data/scripts/console +0 -7
  54. data/tmp/modeling.rb +0 -22
  55. data/tmp/vidya.json +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15db1362c1d79c7ec4580c019952b4292f53977e
4
- data.tar.gz: 56008480e65b1da0791b2ff4f7611c337bc228fd
3
+ metadata.gz: 1e88f01855db98a5cfca7a2495d41db74a5e1c41
4
+ data.tar.gz: 36fbbf38dfdc51d4b678c84655fb871df6938cba
5
5
  SHA512:
6
- metadata.gz: 93e1eef4d91c3ce6f4147467b5c97deca380809f9b481195a538415fdf503c9a13292ba53f2a46df618922e91d17806bf558cf0f6b1c7e7f1e967758e5d55b7e
7
- data.tar.gz: f030af5547d2120e5fc9091cb6881d5e452ab476dc237028462daf88b9dd286e411c3cf12d9ccfe328a6288c15cca1f57a94b89fc841eb824f543077e4bf3c2c
6
+ metadata.gz: f16ab3ea6602464d5f5e190004b6eb2fabd662f2bca19000e64ce51f4e734d9d422c0eaa3052fc5471d51e14902b294dae0d5680bb44d22d9f0d12d0f38aa10b
7
+ data.tar.gz: 75654d3e93280299cf3261b8cec6358815173bb0d0fc0864f520ac7df6787ff75406b97c8d1ac8c3b43fd23c5240088094550e81c8274389029388615150c418
data/README.md CHANGED
@@ -4,18 +4,168 @@ Welcome to your new gem! In this directory, you'll find the files you need to be
4
4
 
5
5
  ## Installation
6
6
 
7
- * Notes about pulling, renaming, and spots to rename.
7
+ You can start by [installing the ruby CLI tools](https://github.com/qbox-io/search-kit), which requires Ruby 2.0 or later:
8
8
 
9
- ## Usage
9
+ gem install search-kit
10
10
 
11
- * Details about configuration and ENV variables.
12
- * APP_ENV / app_env
13
- * APP_DIR / app_dir
14
- * APP_URI / app_uri
15
- * LOG_DIR / log_dir
11
+ Now set it up, by creating a SearchKit account:
16
12
 
17
- ## Development
13
+ ```
14
+ $ search-kit setup
15
+ --> [ development ]: Setting up a new SearchKit account
16
+ --> [ development ]:
17
+ --> [ development ]: Email:
18
+ --> [ development ]: Password:
19
+ ```
20
+
21
+ Put in a name and password which you'd like to use. Afterward, your
22
+ kit will be automatically configured with an API key:
23
+
24
+ ```
25
+ --> [ development ]: Set app_token: <token>
26
+ --> [ development ]: Alright! Your search-kit install has been set up.
27
+ ```
28
+
29
+ This gives you a subscriber account for SearchKit, and an access token which can be used to access the API. This first token is a creator token, which has universal permissions - don't worry, you can make a consumer (read-only) key later if you're concerned about security.
30
+
31
+ ## Getting Started: Search in five minutes
32
+
33
+ Building an index is your first major step. Let's assume you have a collection of documents which look a bit like this:
34
+
35
+ ```json
36
+ {
37
+ "body": "Some lorem ipsum",
38
+ "id": "document_1",
39
+ "title": "Blog post"
40
+ }
41
+ ```
42
+ ### Anatomy and document schema
43
+
44
+ The `id` field, here, is important. SearchKit requires the `id` field for all documents, or it will throw a bad request at you. On the other hand, the `id` isn't necessarily a number - it's stored on our end as a string, and it can be any unique value you can think of.
45
+
46
+ As far as anatomy goes, a flat, universal representation of what you expect to create is important. It's easier to understand and navigate through flat JSON than an elaborate nested structure.
47
+
48
+ Finally, SearchKit has no knowledge of relationships between documents. Because of that, we recommend that you have a clear idea of what you want use you're going to put a particular index to.
49
+
50
+ ### Scaffolding
51
+
52
+ To quickly create a searchable index using the CLI:
53
+
54
+ ```
55
+ $ search-kit scaffolds create "My Blog Posts" '[{
56
+ "body": "Some lorem ipsum",
57
+ "id": "document_1",
58
+ "title": "Blog post"
59
+ }]'
60
+ ```
61
+
62
+ Here, we're submitting in the form of a raw JSON array - SearchKit will parse the JSON, build an index named "My Blog Posts", and populate it with the given document.
63
+
64
+ Or, if you just want to use the Ruby client:
65
+
66
+ ```ruby
67
+ documents = [{
68
+ body: "Some lorem ipsum",
69
+ id: "document_1",
70
+ title: "Blog post"
71
+ }]
72
+
73
+ scaffold = SearchKit::Clients::Scaffold.new
74
+ scaffold.create("My Blog Posts", documents)
75
+ ```
76
+
77
+ In most cases, the Ruby client attempts to coerce API responses into [Virtus](https://github.com/solnic/virtus) models, so that you'll have access to some nice ruby [barewords](http://devblog.avdi.org/2012/10/01/barewords/) on your response objects.
78
+
79
+ ### Index identity
80
+
81
+ If you don't want to create and populate an index in one fell stroke, you can do it programmatically or through the CLI.
82
+
83
+ #### CLI:
84
+
85
+ ```
86
+ search-kit indices create "My Blog Posts"
87
+ ```
88
+
89
+ #### Ruby
90
+
91
+ ```ruby
92
+ indices = SearchKit::Clients::Indices.new
93
+ indices.create("My Blog Posts")
94
+ ```
95
+
96
+ So you've created an index. You've given it the name "My Blog Posts". Now it's out there, linked to your account, accessable by your api token, and it's also been given a distinct uri by turning the name into a `slug`. A slug is derived from an Index name, and is turned into a uri-friendly string. It's always given back in the response body of a successful index creation.
97
+
98
+ In this case, the slug would be `my-blog-posts`. From here on out, you will pass the slug into SearchKit clients to access that index and its child resources (Documents, Populate, Scaffold, Search).
99
+
100
+ In other words, to search the index, we want to use its slug:
101
+
102
+ #### CLI - Searching an index
103
+
104
+ ```
105
+ $ search-kit search create my-blog-posts post
106
+ ```
107
+
108
+ This gives you back a set of results that look a bit like this:
109
+
110
+ ```
111
+ --> [ development ]: Searching `my-blog-psts` for titles matching `post`:
112
+ --> [ development ]: - Found 1 titles in 9ms
113
+ --> [ development ]: -- document_1 | score: 0.8637942
114
+ ```
115
+
116
+ Not too helpful just to get the ID/score back. Let's get some more information:
117
+
118
+ ```
119
+ $ search-kit search create my-blog-posts post -d title
120
+ --> [ development ]: Searching `my-blog-psts` for titles matching `post`:
121
+ --> [ development ]: - Found 1 titles in 9ms
122
+ --> [ development ]: -- Blog post | score: 0.8637942
123
+ ```
124
+
125
+ Better!
126
+
127
+ #### Ruby - Searching an index
128
+
129
+ ```ruby
130
+ search = SearchKit::Clients::Search.new
131
+ search.create("my-blog-posts", phrase: "post")
132
+ ```
133
+
134
+ This one is a great deal friendlier, if you know how to script in Ruby, because it returns a helpful Search model with child document models.
135
+
136
+ ## Overview
137
+
138
+ From there on out, you have a ton of options - whether through the Ruby CLI, the Ruby bindings which power it, or the raw API, itself.
139
+
140
+ You have individual, atomic document control with the Document client:
141
+
142
+ ```ruby
143
+ # Atomic CRUD on individual documents
144
+ #
145
+ documents = SearchKit::Clients::Documents.new
146
+ documents.create('my-blog-posts', blog_post)
147
+ documents.show('my-blog-posts', blog_post_id)
148
+ documents.update('my-blog-posts', blog_post_id, blog_post)
149
+ documents.delete('my-blog-posts', blog_post)
150
+ ```
151
+
152
+ You have batch control with the Populate client:
153
+
154
+ ```ruby
155
+ # Batch CRUD
156
+ #
157
+ populate = SearchKit::Clients::Populate.new
158
+ populate.create('my-blog-posts', blog_posts)
159
+ populate.update('my-blog-posts', blog_posts)
160
+ populate.delete('my-blog-posts', blog_post_ids)
161
+ ```
162
+
163
+ And so on. The various domains of the API will be explained in depth soon.
164
+
165
+ ## One last thing
166
+
167
+ SearchKit is heavily influenced by the [jsonapi spec](http://jsonapi.org). All response bodies follow this hypermedia representation, contain resource links, and exist in a data namespace. It isn't 100% compliant yet, but it is _close_, and it does recognize the API format. So in other words, if you know how to use or design hypermedia clients, you're in luck.
18
168
 
19
169
  ## Contributing
20
170
 
21
- Bug reports and pull requests are welcome on GitHub at https://github.com/esmevane/service-layer.
171
+ Bug reports and pull requests are welcome on GitHub at https://github.com/qbox-io/search-kit - please don't hesitate!
@@ -21,7 +21,7 @@ module SearchKit
21
21
  document :create
22
22
  option :display, aliases: ['-d'], type: :array, required: false
23
23
  def create(slug, phrase)
24
- search = client.search(slug, phrase: phrase)
24
+ search = client.create(slug, phrase: phrase)
25
25
  head_path = 'cli.search.create.success.headline'
26
26
  info_path = 'cli.search.create.success.info'
27
27
  headline = I18n.t(head_path, slug: slug, phrase: phrase)
@@ -12,10 +12,10 @@ module SearchKit
12
12
  @token = SearchKit.config.app_token
13
13
  end
14
14
 
15
- def create(slug, options)
15
+ def create(slug, document)
16
16
  document = {
17
17
  token: token,
18
- data: { type: "documents", attributes: options }
18
+ data: { type: "documents", attributes: document }
19
19
  }
20
20
 
21
21
  response = connection.post(slug, document)
@@ -49,10 +49,10 @@ module SearchKit
49
49
  body
50
50
  end
51
51
 
52
- def update(slug, id, options)
52
+ def update(slug, id, document)
53
53
  document = {
54
54
  token: token,
55
- data: { type: "documents", id: id, attributes: options }
55
+ data: { type: "documents", id: id, attributes: document }
56
56
  }
57
57
 
58
58
  response = connection.patch("#{slug}/#{id}", document)
@@ -12,7 +12,7 @@ module SearchKit
12
12
  @token = SearchKit.config.app_token
13
13
  end
14
14
 
15
- def search(slug, options)
15
+ def create(slug, options)
16
16
  params = {
17
17
  token: token, data: { type: "searches", attributes: options }
18
18
  }
@@ -23,6 +23,16 @@ module SearchKit
23
23
  fail AttributeNotFound, field
24
24
  end
25
25
 
26
+ def respond_to_missing?(method_name, include_private = false)
27
+ source.has_key?(method_name) || super(method_name, include_private)
28
+ end
29
+
30
+ def method_missing(method_name, *arguments, &block)
31
+ get(method_name)
32
+ rescue AttributeNotFound
33
+ super(method_name, *arguments, &block)
34
+ end
35
+
26
36
  end
27
37
  end
28
38
  end
@@ -12,7 +12,7 @@ module SearchKit
12
12
  module VERSION
13
13
  MAJOR = 0
14
14
  MINOR = 0
15
- TINY = 7
15
+ TINY = 8
16
16
  PRE = nil
17
17
 
18
18
  STRING = [ MAJOR, MINOR, TINY, PRE ].compact.join(".")
@@ -14,8 +14,9 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = "https://github.com/qbox-io/search-kit"
15
15
  spec.license = "MIT"
16
16
 
17
- spec.files = Dir.glob('**/*')
18
- spec.test_files = Dir.glob('spec/**/*')
17
+ spec.files = %w[search-kit.gemspec]
18
+ spec.files += Dir['*.md', 'bin/*', 'lib/**/*.rb']
19
+ spec.test_files = Dir['spec/**/*.rb']
19
20
  spec.require_paths = ["lib"]
20
21
 
21
22
  spec.executables << 'search-kit'
@@ -10,12 +10,12 @@ describe SearchKit::CLI::Search do
10
10
  subject { cli }
11
11
 
12
12
  describe '#create' do
13
- before { allow(cli.client).to receive(:search).and_return(response) }
13
+ before { allow(cli.client).to receive(:create).and_return(response) }
14
14
 
15
15
  subject { cli.create(slug, phrase) }
16
16
 
17
17
  it "calls client.search with the slug, and phrase" do
18
- expect(cli.client).to receive(:search).with(slug, phrase: phrase)
18
+ expect(cli.client).to receive(:create).with(slug, phrase: phrase)
19
19
  subject
20
20
  end
21
21
 
@@ -25,7 +25,7 @@ describe SearchKit::CLI::Search do
25
25
  end
26
26
 
27
27
  context 'error handling' do
28
- before { allow(cli.client).to receive(:search).and_raise(*error) }
28
+ before { allow(cli.client).to receive(:create).and_raise(*error) }
29
29
 
30
30
  context 'unauthorized error' do
31
31
  let(:error) { SearchKit::Errors::Unauthorized }
@@ -23,7 +23,7 @@ describe SearchKit::Clients::Search do
23
23
  it { is_expected.to be_instance_of Faraday::Connection }
24
24
  end
25
25
 
26
- describe '#search' do
26
+ describe '#create' do
27
27
  let(:filters) { { size: 10.5, width: "Wide", gender: "Mens" } }
28
28
  let(:options) { { phrase: phrase, filters: filters } }
29
29
  let(:phrase) { "red boots" }
@@ -36,7 +36,7 @@ describe SearchKit::Clients::Search do
36
36
  }
37
37
  end
38
38
 
39
- subject { client.search(slug, options) }
39
+ subject { client.create(slug, options) }
40
40
 
41
41
  it { is_expected.to be_instance_of SearchKit::Models::Search }
42
42
 
@@ -17,11 +17,16 @@ describe SearchKit::Models::Document do
17
17
 
18
18
  context 'when the source has the available content' do
19
19
  let(:content) { :key_content }
20
- let(:document_data) { { attributes: { key => content } } }
20
+ let(:document_data) { { source: { key => content } } }
21
21
 
22
22
  it "returns the content" do
23
23
  expect(subject).to eq content
24
24
  end
25
+
26
+ context 'method missing coverage' do
27
+ it { expect(document).to respond_to :a_key }
28
+ it { expect(document.a_key).to eq content }
29
+ end
25
30
  end
26
31
 
27
32
  context 'otherwise' do
@@ -29,6 +34,11 @@ describe SearchKit::Models::Document do
29
34
  expect { subject }
30
35
  .to raise_exception(described_class::AttributeNotFound)
31
36
  end
37
+
38
+ context 'method missing coverage' do
39
+ it { expect(document).not_to respond_to :a_key }
40
+ it { expect { document.a_key }.to raise_exception(NoMethodError) }
41
+ end
32
42
  end
33
43
  end
34
44
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: search-kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joseph McCormick
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-30 00:00:00.000000000 Z
11
+ date: 2015-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ansi
@@ -215,40 +215,8 @@ extensions: []
215
215
  extra_rdoc_files: []
216
216
  files:
217
217
  - CODE_OF_CONDUCT.md
218
- - Gemfile
219
- - Gemfile.lock
220
- - LICENSE.txt
221
218
  - README.md
222
- - Rakefile
223
219
  - bin/search-kit
224
- - config/locales/en.yml
225
- - coverage/assets/0.10.0/application.css
226
- - coverage/assets/0.10.0/application.js
227
- - coverage/assets/0.10.0/colorbox/border.png
228
- - coverage/assets/0.10.0/colorbox/controls.png
229
- - coverage/assets/0.10.0/colorbox/loading.gif
230
- - coverage/assets/0.10.0/colorbox/loading_background.png
231
- - coverage/assets/0.10.0/favicon_green.png
232
- - coverage/assets/0.10.0/favicon_red.png
233
- - coverage/assets/0.10.0/favicon_yellow.png
234
- - coverage/assets/0.10.0/loading.gif
235
- - coverage/assets/0.10.0/magnify.png
236
- - coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
237
- - coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
238
- - coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
239
- - coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
240
- - coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png
241
- - coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
242
- - coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
243
- - coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
244
- - coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png
245
- - coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png
246
- - coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png
247
- - coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png
248
- - coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png
249
- - coverage/index.html
250
- - demo/videos
251
- - demo/videos.json
252
220
  - lib/search_kit.rb
253
221
  - lib/search_kit/cli.rb
254
222
  - lib/search_kit/cli/all.rb
@@ -285,15 +253,6 @@ files:
285
253
  - lib/search_kit/polling/process.rb
286
254
  - lib/search_kit/thor.rb
287
255
  - lib/search_kit/version.rb
288
- - log/search-kit-development.log
289
- - log/search-kit-test.log
290
- - log/service-layer-development.log
291
- - log/service-layer-test.log
292
- - pkg/search-kit-0.0.3.gem
293
- - pkg/search-kit-0.0.4.gem
294
- - pkg/search-kit-0.0.5.gem
295
- - pkg/search-kit-0.0.6.gem
296
- - scripts/console
297
256
  - search-kit.gemspec
298
257
  - spec/integrations/subscriber_model_spec.rb
299
258
  - spec/search_kit/cli/documents_spec.rb
@@ -323,8 +282,6 @@ files:
323
282
  - spec/search_kit/polling_spec.rb
324
283
  - spec/search_kit_spec.rb
325
284
  - spec/spec_helper.rb
326
- - tmp/modeling.rb
327
- - tmp/vidya.json
328
285
  homepage: https://github.com/qbox-io/search-kit
329
286
  licenses:
330
287
  - MIT
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in service-layer.gemspec
4
- gemspec
@@ -1,88 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- search-kit (0.0.6)
5
- ansi (~> 1.5)
6
- faraday (~> 0.9)
7
- highline (~> 1.7)
8
- i18n (~> 0.7)
9
- thor (~> 0.19)
10
- user_config (~> 0.0)
11
- virtus (~> 1.0)
12
-
13
- GEM
14
- remote: https://rubygems.org/
15
- specs:
16
- ansi (1.5.0)
17
- axiom-types (0.1.1)
18
- descendants_tracker (~> 0.0.4)
19
- ice_nine (~> 0.11.0)
20
- thread_safe (~> 0.3, >= 0.3.1)
21
- coderay (1.1.0)
22
- coercible (1.0.0)
23
- descendants_tracker (~> 0.0.1)
24
- descendants_tracker (0.0.4)
25
- thread_safe (~> 0.3, >= 0.3.1)
26
- diff-lcs (1.2.5)
27
- docile (1.1.5)
28
- equalizer (0.0.11)
29
- faraday (0.9.2)
30
- multipart-post (>= 1.2, < 3)
31
- highline (1.7.8)
32
- i18n (0.7.0)
33
- ice_nine (0.11.1)
34
- json (1.8.3)
35
- method_source (0.8.2)
36
- multipart-post (2.0.0)
37
- pry (0.10.3)
38
- coderay (~> 1.1.0)
39
- method_source (~> 0.8.1)
40
- slop (~> 3.4)
41
- rack (1.6.4)
42
- rack-test (0.6.3)
43
- rack (>= 1.0)
44
- rake (10.4.2)
45
- rspec (3.4.0)
46
- rspec-core (~> 3.4.0)
47
- rspec-expectations (~> 3.4.0)
48
- rspec-mocks (~> 3.4.0)
49
- rspec-core (3.4.0)
50
- rspec-support (~> 3.4.0)
51
- rspec-expectations (3.4.0)
52
- diff-lcs (>= 1.2.0, < 2.0)
53
- rspec-support (~> 3.4.0)
54
- rspec-mocks (3.4.0)
55
- diff-lcs (>= 1.2.0, < 2.0)
56
- rspec-support (~> 3.4.0)
57
- rspec-support (3.4.0)
58
- ruby-prof (0.15.8)
59
- simplecov (0.10.0)
60
- docile (~> 1.1.0)
61
- json (~> 1.8)
62
- simplecov-html (~> 0.10.0)
63
- simplecov-html (0.10.0)
64
- slop (3.6.0)
65
- thor (0.19.1)
66
- thread_safe (0.3.5)
67
- user_config (0.0.4)
68
- virtus (1.0.5)
69
- axiom-types (~> 0.1)
70
- coercible (~> 1.0)
71
- descendants_tracker (~> 0.0, >= 0.0.3)
72
- equalizer (~> 0.0, >= 0.0.9)
73
-
74
- PLATFORMS
75
- ruby
76
-
77
- DEPENDENCIES
78
- bundler (~> 1.8)
79
- pry (~> 0.10)
80
- rack-test (~> 0.6)
81
- rake (~> 10.0)
82
- rspec (~> 3.3)
83
- ruby-prof (~> 0.15)
84
- search-kit!
85
- simplecov (~> 0.10)
86
-
87
- BUNDLED WITH
88
- 1.10.6