smooth 2.0.1 → 2.0.2

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.
Files changed (116) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -0
  3. data/Gemfile +1 -2
  4. data/README.md +150 -5
  5. data/Rakefile +16 -0
  6. data/app/assets/javascripts/smooth/index.js +5152 -0
  7. data/bin/smooth +9 -0
  8. data/{app/assets/javascripts/smooth → developer-tools}/.keep +0 -0
  9. data/developer-tools/bower.json +8 -0
  10. data/developer-tools/config.ru +3 -0
  11. data/developer-tools/dist/08d606864d3ad3f0b98660d391f5a1c2.gif +0 -0
  12. data/developer-tools/dist/2d66bcdc27cd89f71068e98a7a929712.gif +0 -0
  13. data/developer-tools/dist/3e9816417b11485d454f9b3662b06e7b.eot +0 -0
  14. data/developer-tools/dist/47de617fd1d745ad120ccb9e2924b98c.gif +0 -0
  15. data/developer-tools/dist/5ae23ad29b67289a1375d2043e289c52.eot +0 -0
  16. data/developer-tools/dist/60c2a8500e63bf211b7df9608f7613ea.svg +450 -0
  17. data/developer-tools/dist/645f50ba6c1e56f078fa018855d97eb0.gif +0 -0
  18. data/developer-tools/dist/71ab514d1cedda303417ad7a06472fea.ttf +0 -0
  19. data/developer-tools/dist/8cca2f02b0af2da365ff4d1755f29146.ttf +0 -0
  20. data/developer-tools/dist/939cf252f0eb4efbd2d170c974411c49.gif +0 -0
  21. data/developer-tools/dist/9af25aaeb6ca6d08d213b04841813eb5.gif +0 -0
  22. data/developer-tools/dist/b683029bafe0305ac2234038a03e1541.woff +0 -0
  23. data/developer-tools/dist/c9dec22105ad9330c811599b8b6464f8.woff +0 -0
  24. data/developer-tools/dist/ca279c55a51ab2641c4712a333633581.gif +0 -0
  25. data/developer-tools/dist/client.js +5152 -0
  26. data/developer-tools/dist/f5b27137d3f5e9b1d91b16b37386dd03.gif +0 -0
  27. data/developer-tools/dist/f99a231ed57ee113b50b1c3e9f9fcdc3.svg +399 -0
  28. data/developer-tools/dist/index.html +18 -0
  29. data/developer-tools/dist/inspector.js +38432 -0
  30. data/developer-tools/dist/jquery.min.js +9190 -0
  31. data/developer-tools/package.json +39 -0
  32. data/developer-tools/server.js +14 -0
  33. data/developer-tools/src/client.coffee +21 -0
  34. data/developer-tools/src/client/collection.coffee +14 -0
  35. data/developer-tools/src/client/model.coffee +11 -0
  36. data/developer-tools/src/client/resource.coffee +132 -0
  37. data/{app/controllers/.keep → developer-tools/src/client/runner.coffee} +0 -0
  38. data/developer-tools/src/dependencies.coffee +7 -0
  39. data/developer-tools/src/inspector.cjsx +49 -0
  40. data/developer-tools/src/inspector/models/interface_collection.coffee +31 -0
  41. data/developer-tools/src/inspector/pages/index.cjsx +31 -0
  42. data/developer-tools/src/inspector/pages/resources.cjsx +5 -0
  43. data/developer-tools/src/inspector/views/grid_sort.cjsx +23 -0
  44. data/developer-tools/src/inspector/views/icon_heading.cjsx +15 -0
  45. data/developer-tools/src/inspector/views/resource_card.cjsx +34 -0
  46. data/developer-tools/src/inspector/views/sidebar.cjsx +12 -0
  47. data/developer-tools/src/inspector/views/toolbar.cjsx +17 -0
  48. data/developer-tools/src/styles/index.scss +136 -0
  49. data/developer-tools/src/styles/views.scss +13 -0
  50. data/developer-tools/src/util.coffee +48 -0
  51. data/developer-tools/webpack.config.js +56 -0
  52. data/developer-tools/webpack.hot.config.js +65 -0
  53. data/lib/smooth.rb +209 -28
  54. data/lib/smooth/active_record/adapter.rb +24 -0
  55. data/lib/smooth/api.rb +272 -18
  56. data/lib/smooth/api/policy.rb +2 -2
  57. data/lib/smooth/api/tracking.rb +4 -4
  58. data/lib/smooth/application.rb +66 -0
  59. data/lib/smooth/cache.rb +1 -1
  60. data/lib/smooth/command.rb +267 -18
  61. data/lib/smooth/command/async_worker.rb +27 -0
  62. data/lib/smooth/command/instrumented.rb +6 -4
  63. data/lib/smooth/command/run_proxy.rb +21 -0
  64. data/lib/smooth/configuration.rb +63 -8
  65. data/lib/smooth/documentation.rb +3 -6
  66. data/lib/smooth/dsl.rb +1 -36
  67. data/lib/smooth/dsl_adapter.rb +34 -0
  68. data/lib/smooth/event.rb +8 -4
  69. data/lib/smooth/event/proxy.rb +9 -0
  70. data/lib/smooth/event/relay.rb +38 -0
  71. data/lib/smooth/example.rb +1 -1
  72. data/lib/smooth/ext/core.rb +16 -0
  73. data/lib/smooth/model_adapter.rb +31 -0
  74. data/lib/smooth/query.rb +143 -13
  75. data/lib/smooth/resource.rb +227 -52
  76. data/lib/smooth/resource/router.rb +217 -0
  77. data/lib/smooth/resource/templating.rb +62 -0
  78. data/lib/smooth/resource/tracking.rb +1 -1
  79. data/lib/smooth/response.rb +73 -0
  80. data/lib/smooth/serializer.rb +102 -11
  81. data/lib/smooth/user_adapter.rb +83 -0
  82. data/lib/smooth/util.rb +17 -0
  83. data/lib/smooth/version.rb +1 -1
  84. data/smooth.gemspec +6 -2
  85. data/spec/acceptance/books_routes_spec.rb +50 -0
  86. data/spec/acceptance/embedded_relationships_spec.rb +26 -0
  87. data/spec/dummy/app/apis/application_api.rb +8 -3
  88. data/spec/dummy/app/commands/create_book.rb +5 -0
  89. data/spec/dummy/app/models/book.rb +1 -0
  90. data/spec/dummy/app/models/library.rb +2 -0
  91. data/spec/dummy/app/models/user.rb +2 -0
  92. data/spec/dummy/app/queries/book_query.rb +13 -0
  93. data/spec/dummy/app/resources/{books.rb → books_definition.rb} +37 -12
  94. data/spec/dummy/db/migrate/20140824215902_create_users.rb +10 -0
  95. data/spec/dummy/db/migrate/20140826193259_create_libraries.rb +10 -0
  96. data/spec/dummy/db/schema.rb +8 -1
  97. data/spec/lib/smooth/api/async_spec.rb +21 -0
  98. data/spec/lib/smooth/api_spec.rb +8 -0
  99. data/spec/lib/smooth/command_spec.rb +87 -6
  100. data/spec/lib/smooth/configuration_spec.rb +4 -0
  101. data/spec/lib/smooth/event/relay_spec.rb +33 -0
  102. data/spec/lib/smooth/event_spec.rb +5 -8
  103. data/spec/lib/smooth/query_spec.rb +42 -0
  104. data/spec/lib/smooth/resource/router_spec.rb +14 -0
  105. data/spec/lib/smooth/resource_spec.rb +33 -1
  106. data/spec/lib/smooth/serializer_spec.rb +20 -0
  107. data/spec/lib/smooth/templating_spec.rb +23 -0
  108. data/spec/lib/smooth/util_spec.rb +22 -0
  109. data/spec/spec_helper.rb +1 -1
  110. metadata +151 -17
  111. data/app/helpers/.keep +0 -0
  112. data/app/mailers/.keep +0 -0
  113. data/app/models/.keep +0 -0
  114. data/app/views/.keep +0 -0
  115. data/spec/dummy/db/development.sqlite3 +0 -0
  116. data/spec/dummy/db/test.sqlite3 +0 -0
@@ -1,17 +1,18 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe "The Smooth Command" do
4
- let(:command) { Smooth.current_api.resource("Books").fetch(:command, :like) }
5
-
6
- it "should allow for descriptions of the filters" do
7
- expect(command.input_descriptions[:like]).not_to be_blank
8
- expect(command.input_descriptions[:left_out]).to be_blank
9
- end
4
+ let(:books) { Smooth.current_api.resource("Books") }
5
+ let(:command) { books.fetch(:command, :like) }
6
+ let(:create_command) { books.fetch(:command, :create) }
10
7
 
11
8
  it "should know the resource name" do
12
9
  expect(command.resource_name).to eq("Books")
13
10
  end
14
11
 
12
+ it "should reference the parent resource" do
13
+ expect(command.parent_resource).to equal(books)
14
+ end
15
+
15
16
  it "should know the command action" do
16
17
  expect(command.command_action).to eq("like")
17
18
  end
@@ -20,6 +21,86 @@ describe "The Smooth Command" do
20
21
  expect(command.event_namespace).to eq("like.book")
21
22
  end
22
23
 
24
+ it "should know the model class" do
25
+ expect(command.model_class).to equal(Book)
26
+ end
27
+
28
+ it "should know its object path" do
29
+ expect(books.api.lookup(command.object_path)).to eq(LikeBook)
30
+ end
31
+
32
+ describe "Execution Patterns" do
33
+ it "should follow common execution patterns if specified" do
34
+ cmd = books.fetch(:command, :update)
35
+ expect(cmd.get_execution_pattern(:update)).to respond_to(:call)
36
+ end
37
+ end
38
+
39
+ describe "Interface Documentation" do
40
+ it "should document the interface" do
41
+ expect(command.interface_documentation).not_to be_empty
42
+ end
43
+
44
+ it "should allow me to supply faker templates for example data" do
45
+ example = create_command.interface_documentation.filters.title.example
46
+ expect(example).not_to be_nil
47
+ end
48
+
49
+ it "should allow for descriptions of the filters" do
50
+ expected = "You can manually pass true or false. If you leave it off, it will toggle the liking status"
51
+ expect(command.input_descriptions[:like]).to eq(expected)
52
+
53
+ # we didn't document this so it should be blank
54
+ expect(command.input_descriptions[:left_out]).to be_blank
55
+ end
56
+ end
57
+
58
+ describe "Automatic model scoping" do
59
+ it "should provide a reference to the model scope" do
60
+ class Book < ActiveRecord::Base
61
+ scope :published_after, ->(year) { where(year_published: year) }
62
+ scope :no_args, -> {all}
63
+ end
64
+
65
+ k = Class.new(Smooth::Command) do
66
+ self.model_class = Book
67
+
68
+ scope(:published_after)
69
+
70
+ required do
71
+ string :title
72
+ end
73
+
74
+ def execute
75
+ scope.where(title: title).first_or_create
76
+ end
77
+ end
78
+
79
+ # This is just laziness since i don't have a user model yet.
80
+ # I am just making sure that this value makes it to the scope anyway
81
+ book = k.as(2001).run(title:"sup").result
82
+
83
+ expect(book.year_published).to eq(2001)
84
+ expect(book.title).to eq("sup")
85
+ end
86
+ end
87
+
88
+ describe "Current user awareness" do
89
+ it "should be aware of who is running the command" do
90
+ k = Class.new(Smooth::Command) do
91
+ required do
92
+ integer :argument
93
+ end
94
+
95
+ def execute
96
+ argument + current_user
97
+ end
98
+ end
99
+
100
+ expect(k.as(1).run(argument: 2).result).to eq(3)
101
+ end
102
+ end
103
+
23
104
  describe "Event Tracking Integration" do
24
105
  it "should track events" do
25
106
  bucket = []
@@ -13,4 +13,8 @@ describe "Smooth Configuration" do
13
13
  it "should enable event tracking by default" do
14
14
  expect(Smooth.config.enable_event_tracking?).to eq(true)
15
15
  end
16
+
17
+ it "should enable loading app folders by default" do
18
+ expect(Smooth.config.eager_load_app_folders?).to eq(true)
19
+ end
16
20
  end
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ class EventRelayTester < Smooth::Event::Relay
4
+ class_attribute :bucket
5
+
6
+ self.bucket = []
7
+
8
+ def relay event, event_name=nil
9
+ self.class.bucket << {event: event, event_name: event_name}
10
+ end
11
+
12
+ def process event, event_name=nil
13
+ [event, "processed:#{event_name}"]
14
+ end
15
+ end
16
+
17
+ describe "The Smooth Event Relay" do
18
+ let(:events) { relay.system }
19
+ let(:relay) { EventRelayTester.new('relayed.event') }
20
+
21
+ it "should relay events" do
22
+ bucket = relay.class.bucket
23
+ events.track_event("relayed.event", val: "sup")
24
+ expect(bucket).not_to be_empty
25
+ end
26
+
27
+ it "should process the event before it relays it" do
28
+ bucket = relay.class.bucket
29
+ events.track_event("relayed.event", val: "sup")
30
+ success = bucket.map {|h| h[:event_name] }.any? {|s| s == 'processed:relayed.event' }
31
+ expect(success).to eq(true)
32
+ end
33
+ end
@@ -3,17 +3,14 @@ require "spec_helper"
3
3
  describe "The Smooth Event Tracking API" do
4
4
  let(:events) { Smooth::Event }
5
5
 
6
- it "should use the instrumentation system to implement a little pub sub" do
7
- bucket = []
6
+ it "should use the instrumentation system to implement a little pub sub dsl" do
7
+ needle = rand(46**8).to_s(36)
8
8
 
9
- events.subscribe_to "test.smooth" do |event|
10
- bucket << event
11
- end
9
+ events.subscribe_to "test.smooth", (bucket=[])
12
10
 
13
- needle = rand(46**8).to_s(36)
14
- events.track_event 'test.smooth', line: "what up #{ needle }?"
11
+ events.track_event 'test.smooth', val: needle
15
12
 
16
- got_event = bucket.any? {|e| e.payload.line.include?(needle) }
13
+ got_event = bucket.any? {|e| e.payload.val.include?(needle) }
17
14
 
18
15
  expect(got_event).to equal(true)
19
16
  end
@@ -1,5 +1,47 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe "The Smooth Query" do
4
+ let(:query) { BookQuery }
5
+ let(:user) { User.where(email:"jon@chicago.com",role:"user").first_or_create }
6
+ let(:books) { Smooth("Books") }
4
7
 
8
+ before(:each) do
9
+ Book.delete_all
10
+ end
11
+
12
+ it "should work when the class is defined directly, as well as when it is defined via the dsl" do
13
+ expect(BookQuery.developer_defined_method).to eq(true)
14
+ expect(BookQuery.new.inline_dsl_method).to eq(true)
15
+ end
16
+
17
+ it "should return some books" do
18
+ Book.where(title:"Animal Farm").first_or_create()
19
+ expect(query.run(title: "Animal Farm").result.count).to eq(1)
20
+ end
21
+
22
+ it "should query the books resource" do
23
+ Book.where(title:"Animal Farm").first_or_create()
24
+ expect(query.run(title: "Animal").result.count).to eq(1)
25
+ expect(query.run(title: "1984").result.count).to eq(0)
26
+ end
27
+
28
+ it "should tell me info about the query interface" do
29
+ description = query.interface_description.filters.year_published.description
30
+ expect(description).to include('published')
31
+ end
32
+
33
+ it "should track query events" do
34
+ bucket = []
35
+ Smooth.events.on("query.book", bucket)
36
+ query.as(user).run()
37
+ expect(bucket).not_to be_empty
38
+ end
39
+
40
+ it "should belong to the book resource" do
41
+ expect(BookQuery.parent_resource).to equal(books)
42
+ end
43
+
44
+ it "should belong to the api" do
45
+ expect(query.parent_api).to eq(books.api)
46
+ end
5
47
  end
@@ -0,0 +1,14 @@
1
+ require "spec_helper"
2
+
3
+ describe "The Smooth Router" do
4
+ let(:books) { Smooth("Books") }
5
+ let(:router) { books.router }
6
+
7
+ it "should have descriptions of the routes" do
8
+ expect(router.descriptions).not_to be_empty
9
+ end
10
+
11
+ it "should apply the routes to a sinatra app" do
12
+ expect(router.methods_table).to be_present
13
+ end
14
+ end
@@ -4,6 +4,22 @@ describe "The Smooth Resource" do
4
4
  let(:api) { Smooth.current_api }
5
5
  let(:books) { api.resource("Books") }
6
6
 
7
+ it "should do" do
8
+ end
9
+
10
+ it "should define scopes on its model" do
11
+ api.resource("Books") do
12
+ model do
13
+ scope :model_defined_scope, -> { where("id is whatup") }
14
+ end
15
+
16
+ scope :resource_defined_scope, -> { where("id is you know") }
17
+ end
18
+
19
+ expect(Book).to respond_to(:model_defined_scope)
20
+ expect(Book).to respond_to(:resource_defined_scope)
21
+ end
22
+
7
23
  it "should reference its parent api" do
8
24
  expect(books.api).to be_present
9
25
  end
@@ -12,7 +28,15 @@ describe "The Smooth Resource" do
12
28
  expect(books.name).to eq("Books")
13
29
  end
14
30
 
15
- it "should have a like command class" do
31
+ it "should have a route table" do
32
+ expect(books.route_table).not_to be_empty
33
+ end
34
+
35
+ it "should expand the route table with actual values" do
36
+ expect(books.expand_routes(id:1).values).to include("/books/1/like", "/books/1")
37
+ end
38
+
39
+ it "should have an arbitrary defined command class" do
16
40
  command = books.fetch(:command, :like)
17
41
  expect(command).to respond_to(:run)
18
42
  end
@@ -27,6 +51,14 @@ describe "The Smooth Resource" do
27
51
  expect(command).to respond_to(:run)
28
52
  end
29
53
 
54
+ it "should return a reference to the serializer class" do
55
+ expect(books.serializer_class).to equal(BookSerializer)
56
+ end
57
+
58
+ it "should return a reference to the query class" do
59
+ expect(books.query_class).to equal(BookQuery)
60
+ end
61
+
30
62
  it "should generate a default serializer" do
31
63
  expect(BookSerializer < Smooth::Serializer).to equal(true)
32
64
  end
@@ -10,6 +10,15 @@ describe "The Smooth Serializer" do
10
10
 
11
11
  it "should relate to the book model" do
12
12
  expect(Book.active_model_serializer).to equal(serializer)
13
+ expect(serializer.model_class).to equal(Book)
14
+ end
15
+
16
+ it "should relate to the books resource" do
17
+ expect(serializer.parent_resource).to equal(books)
18
+ end
19
+
20
+ it "should relate to the api" do
21
+ expect(serializer.parent_api).to equal(books.api)
13
22
  end
14
23
 
15
24
  it "should have documentation for its attributes" do
@@ -23,4 +32,15 @@ describe "The Smooth Serializer" do
23
32
  it "should have documentation for its computed properties" do
24
33
  expect(serializer.documentation_for_attribute(:computed_property).description).not_to be_blank
25
34
  end
35
+
36
+ it "should have documentation for its computed properties" do
37
+ expect(serializer.documentation_for_attribute(:another_computed_property).description).not_to be_blank
38
+ end
39
+
40
+ it "should serialize the object properly" do
41
+ book = Book.create(title:"Serialize This Man")
42
+ serialized = serializer.new(book).as_json
43
+ expect(serialized[:book]).not_to be_empty
44
+ expect(serialized[:book][:another_computed_property]).not_to be_nil
45
+ end
26
46
  end
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ describe "Resource Object Templates" do
4
+ let(:books) { Smooth("Books") }
5
+
6
+ it "should let me build templated book objects" do
7
+ expect(books.build_from_template().title).to be_present
8
+ expect(books.build_from_template(title:"Shit Homie").title).to eq("Shit Homie")
9
+ end
10
+
11
+ it "should let me create templated book objects" do
12
+ expect(books.create_from_template().title).to be_present
13
+ expect(books.create_from_template(title:"Shit Homie").title).to eq("Shit Homie")
14
+ end
15
+
16
+ it "should let me define custom templates" do
17
+ expect(books.build_from_template(:ancient).year_published).to eq(1776)
18
+ end
19
+
20
+ it "should know if a template has been registered" do
21
+ expect(books.template_registered?).to eq(true)
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ require "spec_helper"
2
+
3
+ describe "The Smooth Utils" do
4
+ it "should build a uri template parser" do
5
+ expect(Smooth.util.uri_template("/api/:version/:resource_name")).to respond_to(:extract)
6
+ end
7
+
8
+ it "should extract vars from a url template" do
9
+ template = Smooth.util.uri_template("/api/:version/:resource_name")
10
+ vars = Smooth.util.extract_url_vars(template, "/api/v1/books")
11
+
12
+ expect(vars[:version]).to eq("v1")
13
+ expect(vars[:resource_name]).to eq("books")
14
+ end
15
+
16
+ it "should expand a uri template" do
17
+ template = Smooth.util.uri_template("/api/:version/:resource_name")
18
+ expanded = Smooth.util.expand_url_template(template, version: "v1", resource_name: "books")
19
+
20
+ expect(expanded).to eq("/api/v1/books")
21
+ end
22
+ end
@@ -3,7 +3,7 @@ ENV['RAILS_ENV'] ||= 'test'
3
3
  require File.expand_path("../dummy/config/environment.rb", __FILE__)
4
4
 
5
5
  require 'rspec/rails'
6
- require 'faker'
6
+ require 'ffaker'
7
7
  require 'rack/test'
8
8
 
9
9
  Rails.backtrace_cleaner.remove_silencers!
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smooth
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Soeder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-23 00:00:00.000000000 Z
11
+ date: 2015-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -54,6 +54,20 @@ dependencies:
54
54
  version: 4.0.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: active_model_serializers
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.8.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.8.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: ffaker
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
@@ -67,7 +81,7 @@ dependencies:
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: faker
84
+ name: factory_girl
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
@@ -94,6 +108,48 @@ dependencies:
94
108
  - - ">="
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: sinatra
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: escape_utils
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: uri_template
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
97
153
  - !ruby/object:Gem::Dependency
98
154
  name: bundler
99
155
  requirement: !ruby/object:Gem::Requirement
@@ -209,7 +265,8 @@ dependencies:
209
265
  description: Smooth provides a simple DSL building powerful JSON APIs on top of ActiveRecord.
210
266
  email:
211
267
  - jonathan.soeder@gmail.com
212
- executables: []
268
+ executables:
269
+ - smooth
213
270
  extensions: []
214
271
  extra_rdoc_files: []
215
272
  files:
@@ -219,39 +276,96 @@ files:
219
276
  - README.md
220
277
  - Rakefile
221
278
  - app/assets/images/smooth/.keep
222
- - app/assets/javascripts/smooth/.keep
223
- - app/controllers/.keep
224
- - app/helpers/.keep
225
- - app/mailers/.keep
226
- - app/models/.keep
227
- - app/views/.keep
279
+ - app/assets/javascripts/smooth/index.js
280
+ - bin/smooth
228
281
  - config/routes.rb
282
+ - developer-tools/.keep
283
+ - developer-tools/bower.json
284
+ - developer-tools/config.ru
285
+ - developer-tools/dist/08d606864d3ad3f0b98660d391f5a1c2.gif
286
+ - developer-tools/dist/2d66bcdc27cd89f71068e98a7a929712.gif
287
+ - developer-tools/dist/3e9816417b11485d454f9b3662b06e7b.eot
288
+ - developer-tools/dist/47de617fd1d745ad120ccb9e2924b98c.gif
289
+ - developer-tools/dist/5ae23ad29b67289a1375d2043e289c52.eot
290
+ - developer-tools/dist/60c2a8500e63bf211b7df9608f7613ea.svg
291
+ - developer-tools/dist/645f50ba6c1e56f078fa018855d97eb0.gif
292
+ - developer-tools/dist/71ab514d1cedda303417ad7a06472fea.ttf
293
+ - developer-tools/dist/8cca2f02b0af2da365ff4d1755f29146.ttf
294
+ - developer-tools/dist/939cf252f0eb4efbd2d170c974411c49.gif
295
+ - developer-tools/dist/9af25aaeb6ca6d08d213b04841813eb5.gif
296
+ - developer-tools/dist/b683029bafe0305ac2234038a03e1541.woff
297
+ - developer-tools/dist/c9dec22105ad9330c811599b8b6464f8.woff
298
+ - developer-tools/dist/ca279c55a51ab2641c4712a333633581.gif
299
+ - developer-tools/dist/client.js
300
+ - developer-tools/dist/f5b27137d3f5e9b1d91b16b37386dd03.gif
301
+ - developer-tools/dist/f99a231ed57ee113b50b1c3e9f9fcdc3.svg
302
+ - developer-tools/dist/index.html
303
+ - developer-tools/dist/inspector.js
304
+ - developer-tools/dist/jquery.min.js
305
+ - developer-tools/package.json
306
+ - developer-tools/server.js
307
+ - developer-tools/src/client.coffee
308
+ - developer-tools/src/client/collection.coffee
309
+ - developer-tools/src/client/model.coffee
310
+ - developer-tools/src/client/resource.coffee
311
+ - developer-tools/src/client/runner.coffee
312
+ - developer-tools/src/dependencies.coffee
313
+ - developer-tools/src/inspector.cjsx
314
+ - developer-tools/src/inspector/models/interface_collection.coffee
315
+ - developer-tools/src/inspector/pages/index.cjsx
316
+ - developer-tools/src/inspector/pages/resources.cjsx
317
+ - developer-tools/src/inspector/views/grid_sort.cjsx
318
+ - developer-tools/src/inspector/views/icon_heading.cjsx
319
+ - developer-tools/src/inspector/views/resource_card.cjsx
320
+ - developer-tools/src/inspector/views/sidebar.cjsx
321
+ - developer-tools/src/inspector/views/toolbar.cjsx
322
+ - developer-tools/src/styles/index.scss
323
+ - developer-tools/src/styles/views.scss
324
+ - developer-tools/src/util.coffee
325
+ - developer-tools/webpack.config.js
326
+ - developer-tools/webpack.hot.config.js
229
327
  - lib/smooth.rb
328
+ - lib/smooth/active_record/adapter.rb
230
329
  - lib/smooth/api.rb
231
330
  - lib/smooth/api/policy.rb
232
331
  - lib/smooth/api/tracking.rb
332
+ - lib/smooth/application.rb
233
333
  - lib/smooth/cache.rb
234
334
  - lib/smooth/command.rb
335
+ - lib/smooth/command/async_worker.rb
235
336
  - lib/smooth/command/instrumented.rb
337
+ - lib/smooth/command/run_proxy.rb
236
338
  - lib/smooth/configuration.rb
237
339
  - lib/smooth/documentation.rb
238
340
  - lib/smooth/dsl.rb
341
+ - lib/smooth/dsl_adapter.rb
239
342
  - lib/smooth/event.rb
343
+ - lib/smooth/event/proxy.rb
344
+ - lib/smooth/event/relay.rb
240
345
  - lib/smooth/example.rb
241
346
  - lib/smooth/ext/core.rb
242
347
  - lib/smooth/ext/mutations.rb
348
+ - lib/smooth/model_adapter.rb
243
349
  - lib/smooth/query.rb
244
350
  - lib/smooth/resource.rb
351
+ - lib/smooth/resource/router.rb
352
+ - lib/smooth/resource/templating.rb
245
353
  - lib/smooth/resource/tracking.rb
354
+ - lib/smooth/response.rb
246
355
  - lib/smooth/serializer.rb
356
+ - lib/smooth/user_adapter.rb
357
+ - lib/smooth/util.rb
247
358
  - lib/smooth/version.rb
248
359
  - smooth.gemspec
360
+ - spec/acceptance/books_routes_spec.rb
361
+ - spec/acceptance/embedded_relationships_spec.rb
249
362
  - spec/dummy/README.rdoc
250
363
  - spec/dummy/Rakefile
251
364
  - spec/dummy/app/apis/application_api.rb
252
365
  - spec/dummy/app/assets/images/.keep
253
366
  - spec/dummy/app/assets/javascripts/application.js
254
367
  - spec/dummy/app/assets/stylesheets/application.css
368
+ - spec/dummy/app/commands/create_book.rb
255
369
  - spec/dummy/app/controllers/application_controller.rb
256
370
  - spec/dummy/app/controllers/concerns/.keep
257
371
  - spec/dummy/app/helpers/application_helper.rb
@@ -260,7 +374,10 @@ files:
260
374
  - spec/dummy/app/models/author.rb
261
375
  - spec/dummy/app/models/book.rb
262
376
  - spec/dummy/app/models/concerns/.keep
263
- - spec/dummy/app/resources/books.rb
377
+ - spec/dummy/app/models/library.rb
378
+ - spec/dummy/app/models/user.rb
379
+ - spec/dummy/app/queries/book_query.rb
380
+ - spec/dummy/app/resources/books_definition.rb
264
381
  - spec/dummy/app/views/layouts/application.html.erb
265
382
  - spec/dummy/bin/bundle
266
383
  - spec/dummy/bin/rails
@@ -284,27 +401,32 @@ files:
284
401
  - spec/dummy/config/locales/en.yml
285
402
  - spec/dummy/config/routes.rb
286
403
  - spec/dummy/config/secrets.yml
287
- - spec/dummy/db/development.sqlite3
288
404
  - spec/dummy/db/migrate/20140822065900_create_books.rb
289
405
  - spec/dummy/db/migrate/20140822065916_create_authors.rb
406
+ - spec/dummy/db/migrate/20140824215902_create_users.rb
407
+ - spec/dummy/db/migrate/20140826193259_create_libraries.rb
290
408
  - spec/dummy/db/schema.rb
291
- - spec/dummy/db/test.sqlite3
292
409
  - spec/dummy/lib/assets/.keep
293
410
  - spec/dummy/log/.keep
294
411
  - spec/dummy/public/404.html
295
412
  - spec/dummy/public/422.html
296
413
  - spec/dummy/public/500.html
297
414
  - spec/dummy/public/favicon.ico
415
+ - spec/lib/smooth/api/async_spec.rb
298
416
  - spec/lib/smooth/api/policy_spec.rb
299
417
  - spec/lib/smooth/api_spec.rb
300
418
  - spec/lib/smooth/cache_spec.rb
301
419
  - spec/lib/smooth/command_spec.rb
302
420
  - spec/lib/smooth/configuration_spec.rb
421
+ - spec/lib/smooth/event/relay_spec.rb
303
422
  - spec/lib/smooth/event_spec.rb
304
423
  - spec/lib/smooth/example_spec.rb
305
424
  - spec/lib/smooth/query_spec.rb
425
+ - spec/lib/smooth/resource/router_spec.rb
306
426
  - spec/lib/smooth/resource_spec.rb
307
427
  - spec/lib/smooth/serializer_spec.rb
428
+ - spec/lib/smooth/templating_spec.rb
429
+ - spec/lib/smooth/util_spec.rb
308
430
  - spec/spec_helper.rb
309
431
  homepage: http://smooth.io
310
432
  licenses:
@@ -326,18 +448,21 @@ required_rubygems_version: !ruby/object:Gem::Requirement
326
448
  version: '0'
327
449
  requirements: []
328
450
  rubyforge_project:
329
- rubygems_version: 2.1.11
451
+ rubygems_version: 2.2.2
330
452
  signing_key:
331
453
  specification_version: 4
332
454
  summary: Smooth provides a DSL for creating self-testing, self-documenting, highly
333
455
  inspectable API endpoints which are able to generate extendable client libraries.
334
456
  test_files:
457
+ - spec/acceptance/books_routes_spec.rb
458
+ - spec/acceptance/embedded_relationships_spec.rb
335
459
  - spec/dummy/README.rdoc
336
460
  - spec/dummy/Rakefile
337
461
  - spec/dummy/app/apis/application_api.rb
338
462
  - spec/dummy/app/assets/images/.keep
339
463
  - spec/dummy/app/assets/javascripts/application.js
340
464
  - spec/dummy/app/assets/stylesheets/application.css
465
+ - spec/dummy/app/commands/create_book.rb
341
466
  - spec/dummy/app/controllers/application_controller.rb
342
467
  - spec/dummy/app/controllers/concerns/.keep
343
468
  - spec/dummy/app/helpers/application_helper.rb
@@ -346,7 +471,10 @@ test_files:
346
471
  - spec/dummy/app/models/author.rb
347
472
  - spec/dummy/app/models/book.rb
348
473
  - spec/dummy/app/models/concerns/.keep
349
- - spec/dummy/app/resources/books.rb
474
+ - spec/dummy/app/models/library.rb
475
+ - spec/dummy/app/models/user.rb
476
+ - spec/dummy/app/queries/book_query.rb
477
+ - spec/dummy/app/resources/books_definition.rb
350
478
  - spec/dummy/app/views/layouts/application.html.erb
351
479
  - spec/dummy/bin/bundle
352
480
  - spec/dummy/bin/rails
@@ -370,25 +498,31 @@ test_files:
370
498
  - spec/dummy/config/locales/en.yml
371
499
  - spec/dummy/config/routes.rb
372
500
  - spec/dummy/config/secrets.yml
373
- - spec/dummy/db/development.sqlite3
374
501
  - spec/dummy/db/migrate/20140822065900_create_books.rb
375
502
  - spec/dummy/db/migrate/20140822065916_create_authors.rb
503
+ - spec/dummy/db/migrate/20140824215902_create_users.rb
504
+ - spec/dummy/db/migrate/20140826193259_create_libraries.rb
376
505
  - spec/dummy/db/schema.rb
377
- - spec/dummy/db/test.sqlite3
378
506
  - spec/dummy/lib/assets/.keep
379
507
  - spec/dummy/log/.keep
380
508
  - spec/dummy/public/404.html
381
509
  - spec/dummy/public/422.html
382
510
  - spec/dummy/public/500.html
383
511
  - spec/dummy/public/favicon.ico
512
+ - spec/lib/smooth/api/async_spec.rb
384
513
  - spec/lib/smooth/api/policy_spec.rb
385
514
  - spec/lib/smooth/api_spec.rb
386
515
  - spec/lib/smooth/cache_spec.rb
387
516
  - spec/lib/smooth/command_spec.rb
388
517
  - spec/lib/smooth/configuration_spec.rb
518
+ - spec/lib/smooth/event/relay_spec.rb
389
519
  - spec/lib/smooth/event_spec.rb
390
520
  - spec/lib/smooth/example_spec.rb
391
521
  - spec/lib/smooth/query_spec.rb
522
+ - spec/lib/smooth/resource/router_spec.rb
392
523
  - spec/lib/smooth/resource_spec.rb
393
524
  - spec/lib/smooth/serializer_spec.rb
525
+ - spec/lib/smooth/templating_spec.rb
526
+ - spec/lib/smooth/util_spec.rb
394
527
  - spec/spec_helper.rb
528
+ has_rdoc: