cloudinary 1.9.1 → 1.20.0

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 (72) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +42 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +21 -0
  4. data/.github/pull_request_template.md +24 -0
  5. data/.gitignore +7 -1
  6. data/.travis.yml +15 -8
  7. data/CHANGELOG.md +261 -0
  8. data/README.md +3 -0
  9. data/Rakefile +3 -45
  10. data/cloudinary.gemspec +27 -20
  11. data/lib/active_storage/blob_key.rb +20 -0
  12. data/lib/active_storage/service/cloudinary_service.rb +249 -0
  13. data/lib/cloudinary.rb +53 -63
  14. data/lib/cloudinary/account_api.rb +231 -0
  15. data/lib/cloudinary/account_config.rb +30 -0
  16. data/lib/cloudinary/api.rb +228 -71
  17. data/lib/cloudinary/auth_token.rb +10 -4
  18. data/lib/cloudinary/base_api.rb +79 -0
  19. data/lib/cloudinary/base_config.rb +70 -0
  20. data/lib/cloudinary/cache.rb +38 -0
  21. data/lib/cloudinary/cache/breakpoints_cache.rb +31 -0
  22. data/lib/cloudinary/cache/key_value_cache_adapter.rb +25 -0
  23. data/lib/cloudinary/cache/rails_cache_adapter.rb +34 -0
  24. data/lib/cloudinary/cache/storage/rails_cache_storage.rb +5 -0
  25. data/lib/cloudinary/carrier_wave.rb +4 -2
  26. data/lib/cloudinary/carrier_wave/remote.rb +3 -2
  27. data/lib/cloudinary/carrier_wave/storage.rb +2 -1
  28. data/lib/cloudinary/{controller.rb → cloudinary_controller.rb} +3 -5
  29. data/lib/cloudinary/config.rb +43 -0
  30. data/lib/cloudinary/helper.rb +77 -7
  31. data/lib/cloudinary/migrator.rb +3 -1
  32. data/lib/cloudinary/railtie.rb +7 -3
  33. data/lib/cloudinary/responsive.rb +111 -0
  34. data/lib/cloudinary/uploader.rb +67 -15
  35. data/lib/cloudinary/utils.rb +324 -54
  36. data/lib/cloudinary/version.rb +1 -1
  37. data/lib/cloudinary/video_helper.rb +96 -22
  38. data/lib/tasks/cloudinary/fetch_assets.rake +48 -0
  39. data/lib/tasks/{cloudinary.rake → cloudinary/sync_static.rake} +0 -0
  40. data/tools/allocate_test_cloud.sh +9 -0
  41. data/tools/get_test_cloud.sh +9 -0
  42. data/tools/update_version +220 -0
  43. data/vendor/assets/javascripts/cloudinary/jquery.cloudinary.js +51 -13
  44. data/vendor/assets/javascripts/cloudinary/jquery.fileupload.js +24 -4
  45. data/vendor/assets/javascripts/cloudinary/jquery.ui.widget.js +741 -561
  46. data/vendor/assets/javascripts/cloudinary/load-image.all.min.js +1 -1
  47. metadata +92 -67
  48. data/spec/access_control_spec.rb +0 -99
  49. data/spec/api_spec.rb +0 -545
  50. data/spec/archive_spec.rb +0 -129
  51. data/spec/auth_token_spec.rb +0 -79
  52. data/spec/cloudinary_helper_spec.rb +0 -190
  53. data/spec/cloudinary_spec.rb +0 -32
  54. data/spec/data/sync_static/app/assets/javascripts/1.coffee +0 -1
  55. data/spec/data/sync_static/app/assets/javascripts/1.js +0 -1
  56. data/spec/data/sync_static/app/assets/stylesheets/1.css +0 -3
  57. data/spec/docx.docx +0 -0
  58. data/spec/favicon.ico +0 -0
  59. data/spec/logo.png +0 -0
  60. data/spec/rake_spec.rb +0 -160
  61. data/spec/sample_asset_file.tsv +0 -4
  62. data/spec/search_spec.rb +0 -109
  63. data/spec/spec_helper.rb +0 -245
  64. data/spec/storage_spec.rb +0 -44
  65. data/spec/streaminig_profiles_api_spec.rb +0 -74
  66. data/spec/support/helpers/temp_file_helpers.rb +0 -22
  67. data/spec/support/shared_contexts/rake.rb +0 -19
  68. data/spec/uploader_spec.rb +0 -363
  69. data/spec/utils_methods_spec.rb +0 -54
  70. data/spec/utils_spec.rb +0 -906
  71. data/spec/video_tag_spec.rb +0 -251
  72. data/spec/video_url_spec.rb +0 -164
data/spec/archive_spec.rb DELETED
@@ -1,129 +0,0 @@
1
- require 'spec_helper'
2
- require 'cloudinary'
3
- require 'rest_client'
4
- require 'zip'
5
-
6
- RSpec.shared_context 'archive' do
7
-
8
- before :all do
9
- Cloudinary::Uploader.upload(
10
- "http://res.cloudinary.com/demo/image/upload/sample.jpg",
11
- :public_id => 'tag_samplebw',
12
- :tags => [TEST_TAG, TIMESTAMP_TAG],
13
- :transformation => {
14
- :effect => :blackwhite
15
- }
16
- )
17
- Cloudinary::Uploader.upload(
18
- "http://res.cloudinary.com/demo/image/upload/sample.jpg",
19
- :public_id => 'tag_sample',
20
- :tags => [TEST_TAG, TIMESTAMP_TAG],
21
- :transformation => {
22
- :effect => :blackwhite
23
- }
24
- )
25
- Cloudinary::Uploader.upload(
26
- "http://res.cloudinary.com/demo/image/upload/sample.jpg",
27
- :public_id => 'tag_sample_raw.jpg',
28
- :resource_type => 'raw',
29
- :tags => [TEST_TAG, TIMESTAMP_TAG],
30
- )
31
- end
32
- include_context "cleanup", TIMESTAMP_TAG
33
- end
34
-
35
- describe Cloudinary::Utils do
36
- include_context 'archive'
37
-
38
- describe '.generate_zip_download_url' do
39
- let(:options) { {} }
40
- let!(:archive_result) {
41
- Cloudinary::Utils.download_zip_url(
42
- {
43
- :target_public_id => 'gem_archive_test',
44
- :public_ids => %w(tag_sample tag_samplebw),
45
- :target_tags => [TEST_TAG, TIMESTAMP_TAG]
46
- }.merge(options))
47
- }
48
-
49
- describe 'public_ids' do
50
- it 'should generate a valid url' do
51
- expect(archive_result).not_to be_empty
52
- end
53
- it 'should include two files' do
54
- Zip::File.open_buffer(RestClient.get(archive_result)) do |zip_file|
55
- list = zip_file.glob('*').map(&:name)
56
- expect(list.length).to be(2)
57
- expect(list).to include('tag_sample.jpg', 'tag_samplebw.jpg')
58
- end
59
- end
60
- end
61
- end
62
- end
63
-
64
- describe Cloudinary::Uploader do
65
- include_context 'archive'
66
-
67
- let(:options) { {} }
68
-
69
- describe '.create_archive' do
70
- let!(:target_public_id) {
71
- "gem_test#{ SUFFIX}"
72
- }
73
- expected_keys = %w(
74
- resource_type
75
- type
76
- public_id
77
- version
78
- url
79
- secure_url
80
- created_at
81
- tags
82
- signature
83
- bytes
84
- etag
85
- resource_count
86
- file_count
87
- )
88
- let!(:archive_result) {
89
- Cloudinary::Uploader.create_archive(
90
- {
91
- :target_public_id => target_public_id,
92
- :public_ids => %w(tag_sample tag_samplebw),
93
- :tags => [TEST_TAG, TIMESTAMP_TAG],
94
- :transformations => [{width: 100, height: 100, crop: "fill"},{effect: "grayscale"}],
95
- :skip_transformation_name => true
96
- }.merge(options))
97
- }
98
- let(:options) { { :mode => :create } }
99
- it 'should return a Hash with suitable set of keys' do
100
- expect(archive_result).to be_a(Hash)
101
- expect(archive_result.keys).to include(*expected_keys)
102
- end
103
- end
104
- describe 'create archive based on raw resources and missing public IDs' do
105
- let!(:target_public_id) {
106
- "gem_test#{ SUFFIX}"
107
- }
108
- let!(:archive_result) {
109
- Cloudinary::Uploader.create_archive(
110
- {
111
- :target_public_id => target_public_id,
112
- :public_ids => %w(tag_sample_raw.jpg non-wxisting-resource),
113
- :resource_type => 'raw',
114
- :allow_missing => true
115
- }.merge(options))
116
- }
117
- let(:options) { { :mode => :create } }
118
- it 'should skip missing public IDs and successfully generate the archive containing raw resources' do
119
- expect(archive_result).to be_a(Hash)
120
- expect(archive_result["resource_count"]).to equal(1)
121
- end
122
- end
123
- describe '.create_zip' do
124
- it 'should call create_archive with "zip" format' do
125
- expect(Cloudinary::Uploader).to receive(:create_archive).with({ :tags => TEST_TAG }, "zip")
126
- Cloudinary::Uploader.create_zip({ :tags => TEST_TAG })
127
- end
128
- end
129
- end
@@ -1,79 +0,0 @@
1
- require 'rspec'
2
- require 'spec_helper'
3
- require 'cloudinary'
4
-
5
- describe 'auth_token' do
6
- before :all do
7
- @url_backup = ENV["CLOUDINARY_URL"]
8
- end
9
- before do
10
- Cloudinary.config_from_url "cloudinary://a:b@test123"
11
- Cloudinary.config.auth_token = { :key => KEY, :duration => 300, :start_time => 11111111 }
12
- end
13
- after do
14
- ENV["CLOUDINARY_URL"] = @url_backup
15
- Cloudinary::config_from_url @url_backup
16
- end
17
- it "should generate with start and duration" do
18
- token = Cloudinary::Utils.generate_auth_token :start_time => 1111111111, :acl => "/image/*", :duration => 300
19
- expect(token).to eq '__cld_token__=st=1111111111~exp=1111111411~acl=%2fimage%2f*~hmac=1751370bcc6cfe9e03f30dd1a9722ba0f2cdca283fa3e6df3342a00a7528cc51'
20
- end
21
-
22
- describe "authenticated url" do
23
- before do
24
- Cloudinary.config :private_cdn => true
25
-
26
- end
27
- it "should add token if authToken is globally set and signed = true" do
28
- url = Cloudinary::Utils.cloudinary_url "sample.jpg", :sign_url => true, :resource_type => "image", :type => "authenticated", :version => "1486020273"
29
- expect(url).to eq("http://test123-res.cloudinary.com/image/authenticated/v1486020273/sample.jpg?__cld_token__=st=11111111~exp=11111411~hmac=8db0d753ee7bbb9e2eaf8698ca3797436ba4c20e31f44527e43b6a6e995cfdb3")
30
-
31
- end
32
- it "should add token for 'public' resource" do
33
- url = Cloudinary::Utils.cloudinary_url "sample.jpg", :sign_url => true, :resource_type => "image", :type => "public", :version => "1486020273"
34
- expect(url).to eq("http://test123-res.cloudinary.com/image/public/v1486020273/sample.jpg?__cld_token__=st=11111111~exp=11111411~hmac=c2b77d9f81be6d89b5d0ebc67b671557e88a40bcf03dd4a6997ff4b994ceb80e")
35
-
36
- end
37
- it "should not add token if signed is false" do
38
- url = Cloudinary::Utils.cloudinary_url "sample.jpg", :type => "authenticated", :version => "1486020273"
39
- expect(url).to eq("http://test123-res.cloudinary.com/image/authenticated/v1486020273/sample.jpg")
40
-
41
- end
42
- it "should not add token if authToken is globally set but null auth token is explicitly set and signed = true" do
43
- url = Cloudinary::Utils.cloudinary_url "sample.jpg", :auth_token => false, :sign_url => true, :type => "authenticated", :version => "1486020273"
44
- expect(url).to eq("http://test123-res.cloudinary.com/image/authenticated/s--v2fTPYTu--/v1486020273/sample.jpg")
45
-
46
- end
47
- it "explicit authToken should override global setting" do
48
- url = Cloudinary::Utils.cloudinary_url "sample.jpg", :sign_url => true, :auth_token => { :key => ALT_KEY, :start_time => 222222222, :duration => 100 }, :type => "authenticated", :transformation => { :crop => "scale", :width => 300 }
49
- expect(url).to eq("http://test123-res.cloudinary.com/image/authenticated/c_scale,w_300/sample.jpg?__cld_token__=st=222222222~exp=222222322~hmac=55cfe516530461213fe3b3606014533b1eca8ff60aeab79d1bb84c9322eebc1f")
50
-
51
- end
52
- it "should compute expiration as start time + duration" do
53
- token = { :key => KEY, :start_time => 11111111, :duration => 300 }
54
- url = Cloudinary::Utils.cloudinary_url "sample.jpg", :sign_url => true, :auth_token => token, :resource_type => "image", :type => "authenticated", :version => "1486020273"
55
- expect(url).to eq("http://test123-res.cloudinary.com/image/authenticated/v1486020273/sample.jpg?__cld_token__=st=11111111~exp=11111411~hmac=8db0d753ee7bbb9e2eaf8698ca3797436ba4c20e31f44527e43b6a6e995cfdb3")
56
-
57
- end
58
- it "should raise if key is not provided" do
59
- Cloudinary.config.auth_token[:key] = nil
60
- token = { :expiration => 111111, :duration => 0 }
61
- expect{Cloudinary::Utils.generate_auth_token(token)}.to raise_error(/Missing auth token key configuration/)
62
- end
63
- it "should raise if expiration and duration are not provided" do
64
- token = { :key => KEY, :expiration => 0, :duration => 0 }
65
- expect{Cloudinary::Utils.generate_auth_token(token)}.to raise_error(/Must provide either expiration or duration/)
66
- end
67
- end
68
- describe "authentication token" do
69
- it "should generate token string" do
70
- user = "foobar" # we can't rely on the default "now" value in tests
71
- tokenOptions = { :key => KEY, :duration => 300, :acl => "/*/t_#{user}" }
72
- tokenOptions[:start_time] = 222222222 # we can't rely on the default "now" value in tests
73
- cookieToken = Cloudinary::Utils.generate_auth_token tokenOptions
74
- expect(cookieToken).to eq("__cld_token__=st=222222222~exp=222222522~acl=%2f*%2ft_foobar~hmac=8e39600cc18cec339b21fe2b05fcb64b98de373355f8ce732c35710d8b10259f")
75
-
76
- end
77
- end
78
- end
79
-
@@ -1,190 +0,0 @@
1
- require 'rspec'
2
- require 'spec_helper'
3
- require 'cloudinary'
4
- require 'action_view'
5
- require 'cloudinary/helper'
6
-
7
- helper_class = Class.new do
8
- include CloudinaryHelper
9
- end
10
-
11
- RSpec.describe CloudinaryHelper do
12
- let(:helper) { helper_class.new }
13
- let(:options) { {} }
14
- before :each do
15
- Cloudinary.config({})
16
- end
17
- context "#cl_image_upload_tag" do
18
- let(:options) {{:multiple => true}}
19
- before do
20
- if defined? allow
21
- allow(Cloudinary::Utils).to receive_messages :cloudinary_api_url => '', :sign_request => Hash.new
22
- allow(helper).to receive(:build_callback_url).and_return('')
23
- else
24
- Cloudinary::Utils.should_receive(:cloudinary_api_url).and_return('')
25
- Cloudinary::Utils.should_receive(:sign_request).and_return(Hash.new)
26
- helper.should_receive(:build_callback_url).and_return('')
27
- end
28
- end
29
- let(:test_tag) { TestTag.new( helper.cl_image_upload_tag('image_id', options)) }
30
-
31
- it "allow multiple upload" do
32
- expect(test_tag['data-cloudinary-field']).to eq('image_id[]')
33
- expect(test_tag['multiple']).to eq('multiple')
34
- end
35
- end
36
- context "#cl_upload_tag" do
37
- let(:options) {{:multiple => true}}
38
- before do
39
- if defined? allow
40
- allow(Cloudinary::Utils).to receive_messages :cloudinary_api_url => '', :sign_request => Hash.new
41
- allow(helper).to receive(:build_callback_url).and_return('')
42
- else
43
- Cloudinary::Utils.should_receive(:cloudinary_api_url).and_return('')
44
- Cloudinary::Utils.should_receive(:sign_request).and_return(Hash.new)
45
- helper.should_receive(:build_callback_url).and_return('')
46
- end
47
- end
48
- let(:test_tag) { TestTag.new( helper.cl_upload_tag('image_id', options)) }
49
-
50
- it "allow multiple upload" do
51
- expect(test_tag['data-cloudinary-field']).to eq('image_id[]')
52
- expect(test_tag['multiple']).to eq('multiple')
53
- end
54
- end
55
-
56
- context "#cl_image_tag" do
57
- let(:test_tag) { TestTag.new( helper.cl_image_tag('sample.jpg', options)) }
58
-
59
- context ":responsive_width" do
60
- let(:options) { {:responsive_width => true, :cloud_name => "test"} }
61
- it "should use data-src for responsive_width" do
62
- expect(test_tag.name).to match( 'img')
63
- expect(test_tag['class']).to eq("cld-responsive")
64
- expect(test_tag['data-src']).to eq( "http://res.cloudinary.com/test/image/upload/c_limit,w_auto/sample.jpg")
65
- end
66
- end
67
-
68
- context ":dpr_auto" do
69
- let(:options) { {:dpr => :auto, :cloud_name => "test"} }
70
- it "should use data-src for dpr auto" do
71
- expect(test_tag.name).to match( 'img')
72
- expect(test_tag['class']).to eq( 'cld-hidpi')
73
- expect(test_tag['data-src']).to eq( "http://res.cloudinary.com/test/image/upload/dpr_auto/sample.jpg")
74
- end
75
- end
76
-
77
- context ":client_hints" do
78
- shared_examples "client_hints" do
79
- it "should not use data-src or set responsive class" do
80
- expect(test_tag.name).to match( 'img')
81
- expect(test_tag['class']).to be_nil
82
- expect(test_tag['data-src']).to be_nil
83
- expect(test_tag['src']).to eq( "http://res.cloudinary.com/test/image/upload/dpr_auto,w_auto/sample.jpg")
84
- end
85
- it "should override :responsive" do
86
- Cloudinary.config.responsive = true
87
- expect(test_tag.name).to match( 'img')
88
- expect(test_tag['class']).to be_nil
89
- expect(test_tag['data-src']).to be_nil
90
- expect(test_tag['src']).to eq( "http://res.cloudinary.com/test/image/upload/dpr_auto,w_auto/sample.jpg")
91
- end
92
- end
93
- context "as option" do
94
- let(:options) { {:dpr => :auto, :cloud_name => "test", :width => "auto", :client_hints => true} }
95
- include_examples "client_hints"
96
- end
97
- context "as global configuration" do
98
- before do
99
- Cloudinary.config.client_hints = true
100
- end
101
- let(:options) { {:dpr => :auto, :cloud_name => "test", :width => "auto"} }
102
- include_examples "client_hints"
103
- end
104
-
105
- context "false" do
106
- let(:options) { {:width => :auto, :cloud_name => "test", :client_hints => false} }
107
- it "should use normal responsive behaviour" do
108
- expect(test_tag.name).to match( 'img')
109
- expect(test_tag['class']).to eq( 'cld-responsive')
110
- expect(test_tag['data-src']).to eq( "http://res.cloudinary.com/test/image/upload/w_auto/sample.jpg")
111
- end
112
- end
113
- context "width" do
114
- let(:options) { {:dpr => :auto, :cloud_name => "test", :width => "auto:breakpoints", :client_hints => true}}
115
- it "supports auto width" do
116
- expect(test_tag['src']).to eq( "http://res.cloudinary.com/test/image/upload/dpr_auto,w_auto:breakpoints/sample.jpg")
117
- end
118
- end
119
- end
120
- end
121
-
122
- context "#cl_client_hints_meta_tag" do
123
- it "should create a meta tag" do
124
- tag = TestTag.new( helper.cl_client_hints_meta_tag)
125
- expect(tag.name).to match('meta')
126
- expect(tag['content']).to eq('DPR, Viewport-Width, Width')
127
- expect(tag['http-equiv']).to eq('Accept-CH')
128
- end
129
- end
130
-
131
- context "auth_token" do
132
- it "should add token to an image tag url" do
133
- tag = helper.cl_image_tag "sample.jpg",
134
- :cloud_name => 'test123',
135
- :sign_url => true,
136
- :type => "authenticated",
137
- :version => "1486020273",
138
- :auth_token => {key: KEY, start_time: 11111111, duration: 300}
139
- expect(tag).to match /<img.*src="http:\/\/res.cloudinary.com\/test123\/image\/authenticated\/v1486020273\/sample.jpg\?__cld_token__=st=11111111~exp=11111411~hmac=9bd6f41e2a5893da8343dc8eb648de8bf73771993a6d1457d49851250caf3b80.*>/
140
-
141
- end
142
-
143
- end
144
- describe "image_path" do
145
-
146
- before :all do
147
- class Cloudinary::Static
148
- class << self
149
- def reset_metadata
150
- @metadata = nil
151
- @static_file_config = nil
152
- @public_prefixes = nil
153
- end
154
- end
155
- end
156
- end
157
-
158
- before :each do
159
- @static_support = Cloudinary.config.static_image_support
160
- @static_file = Cloudinary::Static::METADATA_FILE
161
- Cloudinary::Static.reset_metadata
162
- end
163
-
164
- after :each do
165
- Cloudinary.config.static_image_support = @static_support
166
- Kernel::silence_warnings { Cloudinary::Static::METADATA_FILE = @static_file }
167
- Cloudinary::Static.reset_metadata
168
- end
169
-
170
- context 'type=="asset"' do
171
- it "should not transform images staring with /" do
172
- expect(helper.image_path('/bar')).to eq('/bar')
173
- end
174
- it "should not transform images staring with /images unless asset is found and static_support is true" do
175
- Cloudinary.config.static_image_support = false
176
- expect(helper.image_path('/images/foo.jpg')).to eq('/images/foo.jpg')
177
- expect(helper.image_path('some-folder/foo.gif')).to eq("/images/some-folder/foo.gif")
178
- Kernel::silence_warnings { Cloudinary::Static::METADATA_FILE = "spec/sample_asset_file.tsv"}
179
- Cloudinary::Static.reset_metadata
180
- expect(helper.image_path('/images/foo.jpg'))
181
- .to eq("/images/foo.jpg")
182
- expect(helper.image_path('some-folder/foo.gif')).to eq("/images/some-folder/foo.gif")
183
- Cloudinary.config.static_image_support = true
184
- expect(helper.image_path('/images/foo.jpg')).to eq("http://res.cloudinary.com/sdk-test/image/asset/images-foo.jpg")
185
- expect(helper.image_path('foo.jpg')).to eq("http://res.cloudinary.com/sdk-test/image/asset/images-foo.jpg")
186
- expect(helper.image_path('some-folder/foo.gif')).to eq('/images/some-folder/foo.gif')
187
- end
188
- end
189
- end
190
- end
@@ -1,32 +0,0 @@
1
- require 'spec_helper'
2
- require 'cloudinary'
3
-
4
- describe Cloudinary do
5
- before :all do
6
- @user_platform = Cloudinary.user_platform
7
- end
8
- after :all do
9
- Cloudinary.user_platform = @user_platform
10
- end
11
-
12
- it 'should add a user platform to USER_AGENT' do
13
- Cloudinary.user_platform = "Spec/1.0 (Test)"
14
- expect(Cloudinary.USER_AGENT).to match( %r"Spec\/1.0 \(Test\) CloudinaryRuby/[\d.]+")
15
-
16
- end
17
-
18
- describe 'config' do
19
- before do
20
- @url_backup = ENV["CLOUDINARY_URL"]
21
- end
22
- after do
23
- ENV["CLOUDINARY_URL"] = @url_backup
24
- Cloudinary::config_from_url @url_backup
25
- end
26
- it "should allow nested values in CLOUDINARY_URL" do
27
- ENV["CLOUDINARY_URL"] = "cloudinary://key:secret@test123?foo[bar]=value"
28
- Cloudinary::config_from_url ENV["CLOUDINARY_URL"]
29
- expect(Cloudinary::config.foo.bar).to eq 'value'
30
- end
31
- end
32
- end
@@ -1 +0,0 @@
1
- coffeescript = true
@@ -1 +0,0 @@
1
- { alert("I am javascript!");}
@@ -1,3 +0,0 @@
1
- p#css {
2
- color: red;
3
- }
data/spec/docx.docx DELETED
Binary file