Files.com 1.4.184__tar.gz → 1.4.186__tar.gz

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 (114) hide show
  1. {Files.com-1.4.184 → Files.com-1.4.186}/Files.com.egg-info/PKG-INFO +1 -1
  2. {Files.com-1.4.184 → Files.com-1.4.186}/PKG-INFO +1 -1
  3. {Files.com-1.4.184 → Files.com-1.4.186}/README.md +73 -53
  4. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/__init__.py +1 -1
  5. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/error.py +15 -0
  6. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/user.py +1 -1
  7. {Files.com-1.4.184 → Files.com-1.4.186}/Files.com.egg-info/SOURCES.txt +0 -0
  8. {Files.com-1.4.184 → Files.com-1.4.186}/Files.com.egg-info/dependency_links.txt +0 -0
  9. {Files.com-1.4.184 → Files.com-1.4.186}/Files.com.egg-info/requires.txt +0 -0
  10. {Files.com-1.4.184 → Files.com-1.4.186}/Files.com.egg-info/top_level.txt +0 -0
  11. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/api.py +0 -0
  12. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/api_client.py +0 -0
  13. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/list_obj.py +0 -0
  14. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/__init__.py +0 -0
  15. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/account_line_item.py +0 -0
  16. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/action.py +0 -0
  17. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/action_notification_export.py +0 -0
  18. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/action_notification_export_result.py +0 -0
  19. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/api_key.py +0 -0
  20. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/api_request_log.py +0 -0
  21. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/app.py +0 -0
  22. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/as2_incoming_message.py +0 -0
  23. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/as2_outgoing_message.py +0 -0
  24. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/as2_partner.py +0 -0
  25. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/as2_station.py +0 -0
  26. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/auto.py +0 -0
  27. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/automation.py +0 -0
  28. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/automation_log.py +0 -0
  29. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/automation_run.py +0 -0
  30. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/bandwidth_snapshot.py +0 -0
  31. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/behavior.py +0 -0
  32. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/bundle.py +0 -0
  33. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/bundle_action.py +0 -0
  34. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/bundle_download.py +0 -0
  35. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/bundle_notification.py +0 -0
  36. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/bundle_path.py +0 -0
  37. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/bundle_recipient.py +0 -0
  38. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/bundle_registration.py +0 -0
  39. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/clickwrap.py +0 -0
  40. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/dns_record.py +0 -0
  41. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/email_incoming_message.py +0 -0
  42. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/email_log.py +0 -0
  43. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/errors.py +0 -0
  44. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/exavault_api_request_log.py +0 -0
  45. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/external_event.py +0 -0
  46. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/file.py +0 -0
  47. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/file_action.py +0 -0
  48. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/file_comment.py +0 -0
  49. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/file_comment_reaction.py +0 -0
  50. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/file_migration.py +0 -0
  51. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/file_migration_log.py +0 -0
  52. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/file_upload_part.py +0 -0
  53. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/folder.py +0 -0
  54. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/form_field.py +0 -0
  55. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/form_field_set.py +0 -0
  56. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/ftp_action_log.py +0 -0
  57. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/gpg_key.py +0 -0
  58. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/group.py +0 -0
  59. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/group_user.py +0 -0
  60. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/history.py +0 -0
  61. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/history_export.py +0 -0
  62. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/history_export_result.py +0 -0
  63. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/image.py +0 -0
  64. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/inbox_recipient.py +0 -0
  65. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/inbox_registration.py +0 -0
  66. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/inbox_upload.py +0 -0
  67. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/invoice.py +0 -0
  68. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/invoice_line_item.py +0 -0
  69. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/ip_address.py +0 -0
  70. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/lock.py +0 -0
  71. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/message.py +0 -0
  72. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/message_comment.py +0 -0
  73. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/message_comment_reaction.py +0 -0
  74. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/message_reaction.py +0 -0
  75. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/notification.py +0 -0
  76. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/outbound_connection_log.py +0 -0
  77. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/payment.py +0 -0
  78. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/payment_line_item.py +0 -0
  79. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/permission.py +0 -0
  80. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/preview.py +0 -0
  81. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/priority.py +0 -0
  82. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/project.py +0 -0
  83. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/public_hosting_request_log.py +0 -0
  84. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/public_ip_address.py +0 -0
  85. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/public_key.py +0 -0
  86. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/remote_bandwidth_snapshot.py +0 -0
  87. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/remote_server.py +0 -0
  88. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/remote_server_configuration_file.py +0 -0
  89. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/request.py +0 -0
  90. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/session.py +0 -0
  91. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/settings_change.py +0 -0
  92. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/sftp_action_log.py +0 -0
  93. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/sftp_host_key.py +0 -0
  94. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/share_group.py +0 -0
  95. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/share_group_member.py +0 -0
  96. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/siem_http_destination.py +0 -0
  97. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/site.py +0 -0
  98. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/snapshot.py +0 -0
  99. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/sso_strategy.py +0 -0
  100. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/status.py +0 -0
  101. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/style.py +0 -0
  102. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/sync_log.py +0 -0
  103. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/usage_daily_snapshot.py +0 -0
  104. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/usage_snapshot.py +0 -0
  105. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/user_cipher_use.py +0 -0
  106. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/user_request.py +0 -0
  107. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/user_sftp_client_use.py +0 -0
  108. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/web_dav_action_log.py +0 -0
  109. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/models/webhook_test.py +0 -0
  110. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/path_util.py +0 -0
  111. {Files.com-1.4.184 → Files.com-1.4.186}/files_sdk/util.py +0 -0
  112. {Files.com-1.4.184 → Files.com-1.4.186}/pyproject.toml +0 -0
  113. {Files.com-1.4.184 → Files.com-1.4.186}/setup.cfg +0 -0
  114. {Files.com-1.4.184 → Files.com-1.4.186}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: Files.com
3
- Version: 1.4.184
3
+ Version: 1.4.186
4
4
  Summary: Python bindings for the Files.com API
5
5
  Home-page: UNKNOWN
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: Files.com
3
- Version: 1.4.184
3
+ Version: 1.4.186
4
4
  Summary: Python bindings for the Files.com API
5
5
  Home-page: UNKNOWN
6
6
  License: MIT
@@ -354,6 +354,7 @@ files_sdk.error.FolderAdminPermissionRequiredError -> files_sdk.error.NotAuthori
354
354
  |`InvalidFilterAliasCombinationError`| `BadRequestError` |
355
355
  |`InvalidFilterFieldError`| `BadRequestError` |
356
356
  |`InvalidFilterParamError`| `BadRequestError` |
357
+ |`InvalidFilterParamFormatError`| `BadRequestError` |
357
358
  |`InvalidFilterParamValueError`| `BadRequestError` |
358
359
  |`InvalidInputEncodingError`| `BadRequestError` |
359
360
  |`InvalidInterfaceError`| `BadRequestError` |
@@ -508,116 +509,117 @@ files_sdk.error.FolderAdminPermissionRequiredError -> files_sdk.error.NotAuthori
508
509
  |`TrialLockedError`| `SiteConfigurationError` |
509
510
  |`UserRequestsEnabledRequiredError`| `SiteConfigurationError` |
510
511
 
511
- ## Mock Server
512
-
513
- Files.com publishes a Files.com API server, which is useful for testing your use of the Files.com
514
- SDKs and other direct integrations against the Files.com API in an integration test environment.
515
-
516
- It is a Ruby app that operates as a minimal server for the purpose of testing basic network
517
- operations and JSON encoding for your SDK or API client. It does not maintain state and it does not
518
- deeply inspect your submissions for correctness.
519
-
520
- Eventually we will add more features intended for integration testing, such as the ability to
521
- intentionally provoke errors.
522
-
523
- Download the server as a Docker image via [Docker Hub](https://hub.docker.com/r/filescom/files-mock-server).
524
-
525
- The Source Code is also available on [GitHub](https://github.com/Files-com/files-mock-server).
526
-
527
- A README is available on the GitHub link.
528
-
529
- ## File/Folder Operations
530
-
531
- This SDK allows both file-based transfer and data-based transfer. Please see the examples below.
512
+ ## Examples
532
513
 
533
514
  ### Upload
534
515
 
535
- The second parameter is optional and will simply use the local filename by default.
516
+ #### Upload a File
536
517
 
537
518
  ```python
538
- files_sdk.file.upload_file("local.txt", "/remote.txt")
519
+ files_sdk.file.upload_file("local.txt", "remote.txt")
539
520
  ```
540
521
 
541
522
  If the parent directories do not already exist, they can be automatically created by passing
542
523
  `mkdir_parents` in the `params`.
543
524
 
544
525
  ```python
545
- files_sdk.file.upload_file("local.txt", "/uploads/remote.txt", params={"mkdir_parents": True})
526
+ files_sdk.file.upload_file("local.txt", "uploads/remote.txt", params={"mkdir_parents": True})
546
527
  ```
547
528
 
548
- #### Writing a File Example (string)
529
+ #### Write File Data
549
530
 
550
531
  ```python
551
532
  with files_sdk.file.open("foo.txt", 'w') as f:
552
533
  f.write("contents")
553
534
  ```
554
535
 
555
- #### Writing a File Example (binary)
536
+ Or, for binary data:
556
537
 
557
538
  ```python
558
539
  with files_sdk.file.open("foo.txt", 'wb') as f:
559
540
  f.write(b"contents")
560
541
  ```
561
542
 
562
- ### Download
543
+ #### Create a Folder
544
+
545
+ ```python
546
+ files_sdk.folder.create("path/to/folder/to/be/created", params={"mkdir_parents": True})
547
+ ```
563
548
 
564
- #### File Download
549
+ ### Download
565
550
 
566
- The second parameter is optional and will simply use the remote filename by default.
551
+ #### Download a File
567
552
 
568
553
  ```python
569
- files_sdk.file.download_file("/remote.txt", "local.txt")
554
+ files_sdk.file.download_file("remote.txt", "local.txt")
570
555
  ```
571
556
 
572
- #### Reading a File Example (string)
557
+ #### Read File Data
573
558
 
574
559
  ```python
575
- with files_sdk.open("foo.txt", 'r') as f:
560
+ with files_sdk.file.open("foo.txt", 'r') as f:
576
561
  print(f.read())
577
562
  ```
578
563
 
579
- #### Reading a File Example (binary)
564
+ Or, for binary data:
580
565
 
581
566
  ```python
582
- with files_sdk.open("foo.txt", 'rb') as f:
567
+ with files_sdk.file.open("foo.txt", 'rb') as f:
583
568
  print(f.read())
584
569
  ```
585
570
 
586
571
  ### List
587
572
 
573
+ #### List Folder Contents
574
+
575
+ There are two ways to list folder contents:
576
+ 1. `auto_paging_iter` - automatically paginates and loads each page into memory
577
+ 2. `load_next_page/has_next_page` - manually paginates and loads each page into memory
578
+
588
579
  ```python
589
- for f in files_sdk.folder.list_for("/").auto_paging_iter():
590
- print(f.type, f.path)
580
+ for item in files_sdk.folder.list_for("remote/path/to/folder/").auto_paging_iter():
581
+ print(item.type, item.path)
591
582
  ```
592
583
 
593
- #### List Responses and Cursor Paging
584
+ ```python
585
+ list_obj = files_sdk.folder.list_for('remote/path/to/folder/')
586
+
587
+ while True:
588
+ for item in list_obj:
589
+ print(item.type, item.path)
590
+ if not list_obj.has_next_page:
591
+ break
592
+ list_obj.load_next_page()
593
+ ```
594
594
 
595
- List responses for APIs with cursor support will return an iterable object
596
- which contains a single page of records. It has a built-in `auto_paging_iter`
597
- method to iterate through the pages, making the additional API calls
598
- as needed.
595
+ ### Copy
599
596
 
600
- ##### Iterating with auto_paging_iter
597
+ The copy method works for both files and folders.
601
598
 
602
599
  ```python
603
- list_obj = files_sdk.folder.list_for('/')
600
+ files_sdk.file.copy("source/path", params={"destination": "destination/path"})
601
+ ```
602
+
603
+ ### Move
604
604
 
605
- for f in list_obj.auto_paging_iter():
606
- print(f.type, f.path)
605
+ The move method works for both files and folders.
606
+
607
+ ```python
608
+ files_sdk.file.move("source/path", params={"destination": "destination/path"})
607
609
  ```
608
610
 
609
- ##### Iterating Manually
611
+ ### Delete
612
+
613
+ The delete method works for both files and folders.
610
614
 
611
615
  ```python
612
- list_obj = files_sdk.folder.list_for('/')
616
+ files_sdk.file.delete("path/to/file/or/folder")
617
+ ```
613
618
 
614
- for f in list_obj:
615
- print(f.type, f.path)
619
+ In case the folder is not empty, you can use the `recursive` argument:
616
620
 
617
- while list_obj.has_next_page:
618
- list_obj.load_next_page()
619
- for f in list_obj:
620
- print(f.type, f.path)
621
+ ```python
622
+ files_sdk.file.delete("path/to/folder", params={"recursive": True})
621
623
  ```
622
624
 
623
625
  ### Comparing Case-Insensitive Files and Paths
@@ -628,3 +630,21 @@ For related documentation see [Case Sensitivity Documentation](https://www.files
628
630
  if files_sdk.path_util.is_same("Fïłèńämê.Txt", "filename.txt"):
629
631
  print("Paths are the same")
630
632
  ```
633
+
634
+ ## Mock Server
635
+
636
+ Files.com publishes a Files.com API server, which is useful for testing your use of the Files.com
637
+ SDKs and other direct integrations against the Files.com API in an integration test environment.
638
+
639
+ It is a Ruby app that operates as a minimal server for the purpose of testing basic network
640
+ operations and JSON encoding for your SDK or API client. It does not maintain state and it does not
641
+ deeply inspect your submissions for correctness.
642
+
643
+ Eventually we will add more features intended for integration testing, such as the ability to
644
+ intentionally provoke errors.
645
+
646
+ Download the server as a Docker image via [Docker Hub](https://hub.docker.com/r/filescom/files-mock-server).
647
+
648
+ The Source Code is also available on [GitHub](https://github.com/Files-com/files-mock-server).
649
+
650
+ A README is available on the GitHub link.
@@ -208,7 +208,7 @@ session_id = None
208
208
  source_ip = None
209
209
  base_url = "https://app.files.com"
210
210
  base_path = "api/rest/v1"
211
- version = "1.4.184"
211
+ version = "1.4.186"
212
212
 
213
213
  __version__ = version
214
214
 
@@ -337,6 +337,21 @@ class InvalidFilterParamError(BadRequestError):
337
337
  )
338
338
 
339
339
 
340
+ class InvalidFilterParamFormatError(BadRequestError):
341
+ def __init__(
342
+ self,
343
+ message=None,
344
+ http_body=None,
345
+ http_status=None,
346
+ json_body=None,
347
+ headers=None,
348
+ code=None,
349
+ ):
350
+ super().__init__(
351
+ message, http_body, http_status, json_body, headers, code
352
+ )
353
+
354
+
340
355
  class InvalidFilterParamValueError(BadRequestError):
341
356
  def __init__(
342
357
  self,
@@ -403,7 +403,7 @@ class User:
403
403
  # Parameters:
404
404
  # cursor - string - Used for pagination. When a list request has more records available, cursors are provided in the response headers `X-Files-Cursor-Next` and `X-Files-Cursor-Prev`. Send one of those cursor value here to resume an existing list from the next available record. Note: many of our SDKs have iterator methods that will automatically handle cursor-based pagination.
405
405
  # per_page - int64 - Number of records to show per page. (Max: 10,000, 1,000 or less is recommended).
406
- # sort_by - object - If set, sort records by the specified field in either `asc` or `desc` direction. Valid fields are `site_id`, `authenticate_until`, `email`, `last_desktop_login_at`, `last_login_at`, `username`, `name`, `company`, `site_admin`, `password_validity_days` or `ssl_required`.
406
+ # sort_by - object - If set, sort records by the specified field in either `asc` or `desc` direction. Valid fields are `site_id`, `authenticate_until`, `email`, `last_desktop_login_at`, `last_login_at`, `name`, `company`, `password_validity_days`, `ssl_required` or `username`.
407
407
  # filter - object - If set, return records where the specified field is equal to the supplied value. Valid fields are `username`, `name`, `email`, `company`, `site_admin`, `password_validity_days`, `ssl_required`, `last_login_at`, `authenticate_until` or `not_site_admin`. Valid field combinations are `[ not_site_admin, username ]` and `[ company, name ]`.
408
408
  # filter_gt - object - If set, return records where the specified field is greater than the supplied value. Valid fields are `password_validity_days`, `last_login_at` or `authenticate_until`.
409
409
  # filter_gteq - object - If set, return records where the specified field is greater than or equal the supplied value. Valid fields are `password_validity_days`, `last_login_at` or `authenticate_until`.
File without changes
File without changes
File without changes