tessa 0.9.2 → 1.0.0.pre.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +5 -5
  2. data/.babelrc +8 -0
  3. data/.circleci/config.yml +42 -0
  4. data/.eslintrc +19 -0
  5. data/.gitignore +5 -0
  6. data/.ruby-version +1 -1
  7. data/Rakefile +8 -0
  8. data/app/assets/javascripts/.keep +0 -0
  9. data/app/assets/javascripts/tessa.esm.js +672 -0
  10. data/app/assets/javascripts/tessa.js +662 -0
  11. data/app/javascript/activestorage/file_checksum.js +53 -0
  12. data/app/javascript/tessa/index.js.coffee +183 -0
  13. data/config/routes.rb +3 -0
  14. data/lib/tessa/active_storage/asset_wrapper.rb +24 -0
  15. data/lib/tessa/engine.rb +5 -0
  16. data/lib/tessa/model/dynamic_extensions.rb +151 -0
  17. data/lib/tessa/model.rb +27 -36
  18. data/lib/tessa/rack_upload_proxy.rb +18 -10
  19. data/lib/tessa/version.rb +1 -1
  20. data/lib/tessa/view_helpers.rb +4 -2
  21. data/lib/tessa.rb +30 -0
  22. data/package.json +43 -0
  23. data/rollup.config.js +44 -0
  24. data/spec/dummy/.gitignore +27 -0
  25. data/spec/dummy/README.md +24 -0
  26. data/spec/dummy/Rakefile +6 -0
  27. data/spec/dummy/app/assets/config/manifest.js +2 -0
  28. data/spec/dummy/app/assets/images/.keep +0 -0
  29. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  30. data/spec/dummy/app/controllers/application_controller.rb +2 -0
  31. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  32. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  33. data/spec/dummy/app/jobs/application_job.rb +2 -0
  34. data/spec/dummy/app/models/concerns/.keep +0 -0
  35. data/spec/dummy/app/models/multiple_asset_model.rb +8 -0
  36. data/spec/dummy/app/models/single_asset_model.rb +5 -0
  37. data/spec/dummy/app/models/single_asset_model_form.rb +25 -0
  38. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  39. data/spec/dummy/bin/bundle +3 -0
  40. data/spec/dummy/bin/rails +4 -0
  41. data/spec/dummy/bin/rake +4 -0
  42. data/spec/dummy/bin/setup +28 -0
  43. data/spec/dummy/bin/update +28 -0
  44. data/spec/dummy/bin/yarn +11 -0
  45. data/spec/dummy/config/application.rb +33 -0
  46. data/spec/dummy/config/boot.rb +3 -0
  47. data/spec/dummy/config/credentials.yml.enc +1 -0
  48. data/spec/dummy/config/database.yml +25 -0
  49. data/spec/dummy/config/environment.rb +5 -0
  50. data/spec/dummy/config/environments/development.rb +47 -0
  51. data/spec/dummy/config/environments/production.rb +76 -0
  52. data/spec/dummy/config/environments/test.rb +43 -0
  53. data/spec/dummy/config/initializers/application_controller_renderer.rb +8 -0
  54. data/spec/dummy/config/initializers/assets.rb +14 -0
  55. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  56. data/spec/dummy/config/initializers/content_security_policy.rb +25 -0
  57. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  58. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  59. data/spec/dummy/config/initializers/inflections.rb +16 -0
  60. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  61. data/spec/dummy/config/initializers/wrap_parameters.rb +9 -0
  62. data/spec/dummy/config/locales/en.yml +33 -0
  63. data/spec/dummy/config/puma.rb +37 -0
  64. data/spec/dummy/config/routes.rb +3 -0
  65. data/spec/dummy/config/storage.yml +3 -0
  66. data/spec/dummy/config.ru +5 -0
  67. data/spec/dummy/db/migrate/20220606221557_create_active_storage_tables.active_storage.rb +27 -0
  68. data/spec/dummy/db/migrate/20220606221900_create_single_asset_models.rb +10 -0
  69. data/spec/dummy/db/migrate/20220607191519_create_multiple_asset_models.rb +10 -0
  70. data/spec/dummy/db/schema.rb +50 -0
  71. data/spec/dummy/lib/assets/.keep +0 -0
  72. data/spec/dummy/lib/tasks/.keep +0 -0
  73. data/spec/dummy/log/.keep +0 -0
  74. data/spec/dummy/package.json +5 -0
  75. data/spec/dummy/public/404.html +67 -0
  76. data/spec/dummy/public/422.html +67 -0
  77. data/spec/dummy/public/500.html +66 -0
  78. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  79. data/spec/dummy/public/apple-touch-icon.png +0 -0
  80. data/spec/dummy/public/favicon.ico +0 -0
  81. data/spec/dummy/public/robots.txt +1 -0
  82. data/spec/dummy/tmp/.keep +0 -0
  83. data/spec/dummy/vendor/.keep +0 -0
  84. data/spec/rails_helper.rb +14 -0
  85. data/spec/tessa/model_spec.rb +195 -262
  86. data/spec/tessa/rack_upload_proxy_spec.rb +23 -81
  87. data/tessa.gemspec +7 -2
  88. data/yarn.lock +1661 -0
  89. metadata +179 -16
  90. data/circle.yml +0 -3
@@ -16,28 +16,29 @@ RSpec.describe Tessa::RackUploadProxy do
16
16
  }
17
17
  let(:params) { {} }
18
18
  let(:session) { {} }
19
- let(:upload) {
20
- Tessa::Upload.new(
21
- asset_id: 123,
22
- upload_url: "a-url",
23
- upload_method: "a-method",
24
- )
25
- }
19
+
20
+ let(:blob) { ActiveStorage::Blob.last }
21
+
26
22
  before do
27
- allow(Tessa::Upload).to receive(:create).and_return(upload)
23
+ allow(ActiveStorage.verifier).to receive(:generate)
24
+ .and_return('some-consistent-token')
28
25
  end
29
26
 
30
27
  shared_examples_for "proper json return" do
31
28
  it "returns asset_id" do
32
- expect(result.json['asset_id']).to eq(123)
29
+ expect(result.json['asset_id']).to eq(blob.signed_id)
33
30
  end
34
31
 
35
32
  it "returns upload_url" do
36
- expect(result.json['upload_url']).to eq("a-url")
33
+ expect(result.json['upload_url']).to eq('https://www.example.com/rails/active_storage/disk/some-consistent-token')
37
34
  end
38
35
 
39
36
  it "returns upload_method" do
40
- expect(result.json['upload_method']).to eq("a-method")
37
+ expect(result.json['upload_method']).to eq('PUT')
38
+ end
39
+
40
+ it "returns upload_method" do
41
+ expect(result.json['upload_headers']).to eq(blob.service_headers_for_direct_upload)
41
42
  end
42
43
 
43
44
  it "returns a 200 response" do
@@ -47,38 +48,12 @@ RSpec.describe Tessa::RackUploadProxy do
47
48
  it "sets the mime type to application/json" do
48
49
  expect(result.headers).to include("Content-Type" => "application/json")
49
50
  end
50
-
51
- context "when Tessa::Upload.create raises RequestFailed" do
52
- before do
53
- allow(Tessa::Upload).to receive(:create).and_raise(Tessa::RequestFailed)
54
- end
55
-
56
- it "returns a proper 500" do
57
- expect(result.status).to eq(500)
58
- end
59
-
60
- it "sets the mime type to application/json" do
61
- expect(result.headers).to include("Content-Type" => "application/json")
62
- end
63
-
64
- it "includes an error message in JSON response" do
65
- expect(result.json['error']).to be_truthy
66
- end
67
- end
68
51
  end
69
52
 
70
53
  context "with no params and no session" do
71
- it "calls Tessa::Upload.create" do
72
- expect(Tessa::Upload).to receive(:create).and_return(upload)
73
- result
74
- end
75
-
76
- it "pushes the asset_id onto session" do
77
- result
78
- expect(session[:tessa_upload_asset_ids]).to eq([123])
54
+ it "raises a bad request error" do
55
+ expect(result.status).to eq(400)
79
56
  end
80
-
81
- it_behaves_like "proper json return"
82
57
  end
83
58
 
84
59
  context "with params" do
@@ -86,53 +61,20 @@ RSpec.describe Tessa::RackUploadProxy do
86
61
  {
87
62
  "name" => "my-name",
88
63
  "size" => 456,
89
- "date" => "2020-01-01",
90
64
  "mime_type" => "plain/text",
65
+ "checksum" => '1234'
91
66
  }
92
67
  }
93
68
 
94
- it "calls Tessa::Upload.create with 'name'" do
95
- expect(Tessa::Upload).to receive(:create).with(hash_including(name: "my-name"))
96
- result
97
- end
98
-
99
- it "calls Tessa::Upload.create with 'size'" do
100
- expect(Tessa::Upload).to receive(:create).with(hash_including(size: 456))
101
- result
102
- end
103
-
104
- it "calls Tessa::Upload.create with 'date'" do
105
- expect(Tessa::Upload).to receive(:create).with(hash_including(date: "2020-01-01"))
106
- result
107
- end
108
-
109
- it "calls Tessa::Upload.create with 'mime_type'" do
110
- expect(Tessa::Upload).to receive(:create).with(hash_including(mime_type: "plain/text"))
111
- result
112
- end
113
-
114
- it_behaves_like "proper json return"
115
- end
116
-
117
- context "with no date param" do
118
- let(:params) { {} }
119
-
120
- it "calls Tessa::Upload.create without 'date'" do
121
- expect(Tessa::Upload).to_not receive(:create).with(hash_including(:date))
122
- result
123
- end
124
- end
125
-
126
- context "with existing session" do
127
- let(:session) {
128
- {
129
- tessa_upload_asset_ids: [:existing_id],
130
- }
131
- }
69
+ it "creates the ActiveStorage blob" do
70
+ expect {
71
+ described_class.call(env)
72
+ }.to change { ActiveStorage::Blob.count }.by(1)
132
73
 
133
- it "does not remove existing ids" do
134
- result
135
- expect(session[:tessa_upload_asset_ids]).to eq([:existing_id, 123])
74
+ expect(blob.filename).to eq('my-name')
75
+ expect(blob.byte_size).to eq(456)
76
+ expect(blob.content_type).to eq('plain/text')
77
+ expect(blob.checksum).to eq('1234')
136
78
  end
137
79
 
138
80
  it_behaves_like "proper json return"
data/tessa.gemspec CHANGED
@@ -15,7 +15,10 @@ Gem::Specification.new do |spec|
15
15
 
16
16
  spec.required_ruby_version = '~> 2.3'
17
17
 
18
- spec.files = `git ls-files -z`.split("\x0")
18
+ spec.files = `git ls-files -z`.split("\x0").push(
19
+ 'app/assets/javascripts/tessa.js',
20
+ 'app/assets/javascripts/tessa.esm.js',
21
+ )
19
22
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
23
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
24
  spec.require_paths = ["lib"]
@@ -23,8 +26,10 @@ Gem::Specification.new do |spec|
23
26
  spec.add_dependency "faraday", "<1"
24
27
  spec.add_dependency "virtus", "~>1.0.4"
25
28
 
26
- spec.add_development_dependency "bundler", "~> 1.7"
27
29
  spec.add_development_dependency "rake", "~> 10.0"
28
30
  spec.add_development_dependency "rspec", "~> 3.1"
31
+ spec.add_development_dependency "rspec_junit_formatter", "~> 0.4"
29
32
  spec.add_development_dependency "simplecov", "~> 0.15.1"
33
+ spec.add_development_dependency "rails", "~> 5"
34
+ spec.add_development_dependency 'sqlite3', '~> 1.3.6'
30
35
  end