Liu Song’s Projects


~/Projects/mqtt-ios

git clone https://code.lsong.org/mqtt-ios

Commit

Commit
6effb7d43cd25245ed88c21a757c71523c3d1798
Author
Philipp Arndt <[email protected]>
Date
2020-03-06 15:37:43 +0100 +0100
Diffstat
 src/MQTTAnalyzer.xcodeproj/project.pbxproj | 16 
 src/MQTTAnalyzer.xcodeproj/xcshareddata/xcschemes/MQTTAnalyzer.xcscheme | 16 
 src/MQTTAnalyzer/extensions/StringUtils.swift | 4 
 src/MQTTAnalyzer/model/timeseries/DiagramPath.swift | 40 
 src/MQTTAnalyzer/model/timeseries/TimeSeriesModel.swift | 58 
 src/MQTTAnalyzer/model/timeseries/TimeSeriesValue.swift | 32 
 src/MQTTAnalyzerTests/DiagramPathTests.swift | 45 

Merge pull request #32 from philipparndt/issue-31

https://github.com/philipparndt/mqtt-analyzer/issues/31


diff --git a/src/MQTTAnalyzer/extensions/StringUtils.swift b/src/MQTTAnalyzer/extensions/StringUtils.swift
index 738247d93d4e6a40e05b5e57bbd1a44638871be9..8902853a2408b891324f55aaced6bc3a1780d8eb 100644
--- a/src/MQTTAnalyzer/extensions/StringUtils.swift
+++ b/src/MQTTAnalyzer/extensions/StringUtils.swift
@@ -20,8 +20,8 @@ 	func truncate(length: Int, trailing: String = "…") -> String {
 		return (self.count > length) ? self.prefix(length) + trailing : self
 	}
 	
-	func pathUp() -> String {
+	func pathUp(_ separator: String = "/") -> String {
-		if let range = self.range(of: "/", options: .backwards ) {
+		if let range = self.range(of: separator, options: .backwards ) {
 			if range.lowerBound.utf16Offset(in: self) == 0 {
 				return self
 			}




diff --git a/src/MQTTAnalyzer/model/timeseries/DiagramPath.swift b/src/MQTTAnalyzer/model/timeseries/DiagramPath.swift
new file mode 100644
index 0000000000000000000000000000000000000000..3e1f435935c6f0e78fee89205bd7505635ae971b
--- /dev/null
+++ b/src/MQTTAnalyzer/model/timeseries/DiagramPath.swift
@@ -0,0 +1,40 @@
+//
+//  DiagramPath.swift
+//  MQTTAnalyzer
+//
+//  Created by Philipp Arndt on 2020-03-06.
+//  Copyright © 2020 Philipp Arndt. All rights reserved.
+//
+
+import Foundation
+
+class DiagramPath: Hashable, Identifiable {
+	let path: String
+	var lastSegment: String {
+		if let idx = path.lastIndex(of: ".") {
+			let start = path.index(after: idx)
+			return String(path[start...])
+		}
+		return path
+	}
+	
+	var parentPath: String {
+		return path.pathUp(".")
+	}
+	
+	var hasSubpath: Bool {
+		return path.contains(".")
+	}
+	
+	init(_ path: String) {
+		self.path = path
+	}
+	
+	static func == (lhs: DiagramPath, rhs: DiagramPath) -> Bool {
+		return lhs.path == rhs.path
+	}
+	
+	func hash(into hasher: inout Hasher) {
+		hasher.combine(path)
+	}
+}




diff --git a/src/MQTTAnalyzer/model/timeseries/TimeSeriesModel.swift b/src/MQTTAnalyzer/model/timeseries/TimeSeriesModel.swift
index 6ef89abf7d2691bf022207eaf19653411bb2f854..3c8bf9366effff8c8faa7ce41f65deb71e3767df 100644
--- a/src/MQTTAnalyzer/model/timeseries/TimeSeriesModel.swift
+++ b/src/MQTTAnalyzer/model/timeseries/TimeSeriesModel.swift
@@ -17,64 +17,6 @@ struct MTimeSeriesMeanValue {
 	let meanValue: Int?
 }
 
-class TimeSeriesValue: Hashable, Identifiable {
-	let value: AnyHashable
-	let valueString: String
-	
-	let date: Date
-	let dateString: String
-	
-	init(value: AnyHashable, at date: Date, dateFormatted: String) {
-		self.value = value
-		self.valueString = TimeSeriesValueUtil.createStringValue(value: value)
-		self.date = date
-		self.dateString = dateFormatted
-	}
-	
-	static func == (lhs: TimeSeriesValue, rhs: TimeSeriesValue) -> Bool {
-		return lhs.value == rhs.value
-	}
-	
-	func hash(into hasher: inout Hasher) {
-		hasher.combine(valueString)
-	}
-}
-
-class DiagramPath: Hashable, Identifiable {
-	let path: String
-	var lastSegment: String {
-		if let idx = path.lastIndex(of: ".") {
-			let start = path.index(after: idx)
-			return String(path[start...])
-		}
-		return path
-	}
-	
-	var parentPath: String {
-		if let idx = path.lastIndex(of: ".") {
-			let end = path.index(before: idx)
-			return String(path[...end])
-		}
-		return ""
-	}
-	
-	var hasSubpath: Bool {
-		return path.contains(".")
-	}
-	
-	init(_ path: String) {
-		self.path = path
-	}
-	
-	static func == (lhs: DiagramPath, rhs: DiagramPath) -> Bool {
-		return lhs.path == rhs.path
-	}
-	
-	func hash(into hasher: inout Hasher) {
-		hasher.combine(path)
-	}
-}
-
 class MTimeSeriesModel {
 	var values: [MTimeSeriesValue] = []
 }




diff --git a/src/MQTTAnalyzer/model/timeseries/TimeSeriesValue.swift b/src/MQTTAnalyzer/model/timeseries/TimeSeriesValue.swift
new file mode 100644
index 0000000000000000000000000000000000000000..2a1280cbe0c5fc3ec024d56fa729077ffc7ae8ab
--- /dev/null
+++ b/src/MQTTAnalyzer/model/timeseries/TimeSeriesValue.swift
@@ -0,0 +1,32 @@
+//
+//  TimeSeriesValue.swift
+//  MQTTAnalyzer
+//
+//  Created by Philipp Arndt on 2020-03-06.
+//  Copyright © 2020 Philipp Arndt. All rights reserved.
+//
+
+import Foundation
+
+class TimeSeriesValue: Hashable, Identifiable {
+	let value: AnyHashable
+	let valueString: String
+	
+	let date: Date
+	let dateString: String
+	
+	init(value: AnyHashable, at date: Date, dateFormatted: String) {
+		self.value = value
+		self.valueString = TimeSeriesValueUtil.createStringValue(value: value)
+		self.date = date
+		self.dateString = dateFormatted
+	}
+	
+	static func == (lhs: TimeSeriesValue, rhs: TimeSeriesValue) -> Bool {
+		return lhs.value == rhs.value
+	}
+	
+	func hash(into hasher: inout Hasher) {
+		hasher.combine(valueString)
+	}
+}




diff --git a/src/MQTTAnalyzer.xcodeproj/project.pbxproj b/src/MQTTAnalyzer.xcodeproj/project.pbxproj
index b86e2b1b3e4746067cb8088943acf4b934830ddd..6afad0914193096abc4895a0e2b22235644c61a5 100644
--- a/src/MQTTAnalyzer.xcodeproj/project.pbxproj
+++ b/src/MQTTAnalyzer.xcodeproj/project.pbxproj
@@ -44,6 +44,9 @@ 		22A386FD2409440F00DF8F94 /* InfoBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A386FC2409440F00DF8F94 /* InfoBox.swift */; };
 		22A387052409768100DF8F94 /* HostModelPersistenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A387042409768100DF8F94 /* HostModelPersistenceTests.swift */; };
 		22A38707240BD9E600DF8F94 /* TimeSeriesValueUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A38706240BD9E600DF8F94 /* TimeSeriesValueUtil.swift */; };
 		22A38709240BE7D100DF8F94 /* MQTTCertificateFiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22A38708240BE7D100DF8F94 /* MQTTCertificateFiles.swift */; };
+		22AE64342412636300C2C4FE /* DiagramPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AE64332412636300C2C4FE /* DiagramPath.swift */; };
+		22AE64362412637A00C2C4FE /* TimeSeriesValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AE64352412637A00C2C4FE /* TimeSeriesValue.swift */; };
+		22AE643824126A7500C2C4FE /* DiagramPathTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AE643724126A7500C2C4FE /* DiagramPathTests.swift */; };
 		22AF3AE72388858B001D9F87 /* NewHostFormModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AF3AE62388858B001D9F87 /* NewHostFormModalView.swift */; };
 		22AF3AE9238885AF001D9F87 /* EditHostFormModalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AF3AE8238885AF001D9F87 /* EditHostFormModalView.swift */; };
 		22AF3AEB23891267001D9F87 /* HostSettingExamples.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22AF3AEA23891267001D9F87 /* HostSettingExamples.swift */; };
@@ -152,6 +155,9 @@ 		22A386FC2409440F00DF8F94 /* InfoBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoBox.swift; sourceTree = ""; };
 		22A387042409768100DF8F94 /* HostModelPersistenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostModelPersistenceTests.swift; sourceTree = "<group>"; };
 		22A38706240BD9E600DF8F94 /* TimeSeriesValueUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeSeriesValueUtil.swift; sourceTree = "<group>"; };
 		22A38708240BE7D100DF8F94 /* MQTTCertificateFiles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MQTTCertificateFiles.swift; sourceTree = "<group>"; };
+		22AE64332412636300C2C4FE /* DiagramPath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiagramPath.swift; sourceTree = "<group>"; };
+		22AE64352412637A00C2C4FE /* TimeSeriesValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeSeriesValue.swift; sourceTree = "<group>"; };
+		22AE643724126A7500C2C4FE /* DiagramPathTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiagramPathTests.swift; sourceTree = "<group>"; };
 		22AF3AE62388858B001D9F87 /* NewHostFormModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewHostFormModalView.swift; sourceTree = "<group>"; };
 		22AF3AE8238885AF001D9F87 /* EditHostFormModalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditHostFormModalView.swift; sourceTree = "<group>"; };
 		22AF3AEA23891267001D9F87 /* HostSettingExamples.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostSettingExamples.swift; sourceTree = "<group>"; };
@@ -301,6 +307,7 @@ 				22D236F623FEFA970003D87F /* TopicModelTests.swift */,
 				22D236F823FEFBA10003D87F /* HostFormValidatorTests.swift */,
 				22D236FA23FF00E10003D87F /* StringUtilsTests.swift */,
 				22A387042409768100DF8F94 /* HostModelPersistenceTests.swift */,
+				22AE643724126A7500C2C4FE /* DiagramPathTests.swift */,
 			);
 			path = MQTTAnalyzerTests;
 			sourceTree = "<group>";
@@ -411,6 +418,8 @@ 			isa = PBXGroup;
 			children = (
 				22E8971622CFBFED00A4B8A3 /* TimeSeriesModel.swift */,
 				22A38706240BD9E600DF8F94 /* TimeSeriesValueUtil.swift */,
+				22AE64332412636300C2C4FE /* DiagramPath.swift */,
+				22AE64352412637A00C2C4FE /* TimeSeriesValue.swift */,
 			);
 			path = timeseries;
 			sourceTree = "<group>";
@@ -809,11 +818,13 @@ 				22F6057B23D4911000E6338B /* DataMigration.swift in Sources */,
 				228104952381779000112F24 /* TopicToolsView.swift in Sources */,
 				2205E5E1238A7EE2001638DF /* ButtonStyle.swift in Sources */,
 				22AF3AE9238885AF001D9F87 /* EditHostFormModalView.swift in Sources */,
+				22AE64342412636300C2C4FE /* DiagramPath.swift in Sources */,
 				2281047623816FD800112F24 /* QuickFilterView.swift in Sources */,
 				22F8BEEC23C7871F00422BFF /* LoginDialog.swift in Sources */,
 				22A38709240BE7D100DF8F94 /* MQTTCertificateFiles.swift in Sources */,
 				22E469E423814CEF00D72BD6 /* JsonFormatString.swift in Sources */,
 				2291424C23BF78000086C251 /* AboutView.swift in Sources */,
+				22AE64362412637A00C2C4FE /* TimeSeriesValue.swift in Sources */,
 				22C9F73723B79A1300892C4B /* MessageTextView.swift in Sources */,
 				22E469DB23801CA000D72BD6 /* ArrayUtils.swift in Sources */,
 				2291424923BF6ECE0086C251 /* KeyboardResponsiveModifier.swift in Sources */,
@@ -831,6 +842,7 @@ 				22D236F323FEF86E0003D87F /* MultimapTests.swift in Sources */,
 				22D236F523FEF9C50003D87F /* ReadstateTests.swift in Sources */,
 				22D236FB23FF00E10003D87F /* StringUtilsTests.swift in Sources */,
 				22D236F923FEFBA10003D87F /* HostFormValidatorTests.swift in Sources */,
+				22AE643824126A7500C2C4FE /* DiagramPathTests.swift in Sources */,
 				2253F8F022C8C008007E35A2 /* MQTTAnalyzerTests.swift in Sources */,
 				22D236F723FEFA970003D87F /* TopicModelTests.swift in Sources */,
 			);
@@ -992,7 +1004,7 @@ 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CODE_SIGN_ENTITLEMENTS = MQTTAnalyzer/MQTTAnalyzer.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 35;
+				CURRENT_PROJECT_VERSION = 36;
 				DEAD_CODE_STRIPPING = NO;
 				DEVELOPMENT_ASSET_PATHS = "MQTTAnalyzer/Preview\\ Content";
 				DEVELOPMENT_TEAM = 643R6YSRER;
@@ -1017,7 +1029,7 @@ 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				CODE_SIGN_ENTITLEMENTS = MQTTAnalyzer/MQTTAnalyzer.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 35;
+				CURRENT_PROJECT_VERSION = 36;
 				DEAD_CODE_STRIPPING = NO;
 				DEVELOPMENT_ASSET_PATHS = "MQTTAnalyzer/Preview\\ Content";
 				DEVELOPMENT_TEAM = 643R6YSRER;




diff --git a/src/MQTTAnalyzer.xcodeproj/xcshareddata/xcschemes/MQTTAnalyzer.xcscheme b/src/MQTTAnalyzer.xcodeproj/xcshareddata/xcschemes/MQTTAnalyzer.xcscheme
index 7ac4665b1de7500202bd817a2a68de74aef4c7b0..e79cfa5aa5af668395ab31ff1cb7a002751db058 100644
--- a/src/MQTTAnalyzer.xcodeproj/xcshareddata/xcschemes/MQTTAnalyzer.xcscheme
+++ b/src/MQTTAnalyzer.xcodeproj/xcshareddata/xcschemes/MQTTAnalyzer.xcscheme
@@ -27,7 +27,21 @@       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       shouldUseLaunchSchemeArgsEnv = "YES"
+      enableAddressSanitizer = "YES"
+      enableASanStackUseAfterReturn = "YES"
       codeCoverageEnabled = "YES">
+      <AdditionalOptions>
+         <AdditionalOption
+            key = "NSZombieEnabled"
+            value = "YES"
+            isEnabled = "YES">
+         </AdditionalOption>
+         <AdditionalOption
+            key = "MallocScribble"
+            value = ""
+            isEnabled = "YES">
+         </AdditionalOption>
+      </AdditionalOptions>
       <Testables>
          <TestableReference
             skipped = "NO">
@@ -55,6 +69,8 @@           buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      enableAddressSanitizer = "YES"
+      enableASanStackUseAfterReturn = "YES"
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       ignoresPersistentStateOnLaunch = "NO"




diff --git a/src/MQTTAnalyzerTests/DiagramPathTests.swift b/src/MQTTAnalyzerTests/DiagramPathTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..1c8eb8588f0b672d7d51138e38ea82d1247359cf
--- /dev/null
+++ b/src/MQTTAnalyzerTests/DiagramPathTests.swift
@@ -0,0 +1,45 @@
+//
+//  DiagramPathTests.swift
+//  MQTTAnalyzerTests
+//
+//  Created by Philipp Arndt on 2020-03-06.
+//  Copyright © 2020 Philipp Arndt. All rights reserved.
+//
+
+import Foundation
+import XCTest
+@testable import MQTTAnalyzer
+
+class DiagramPathTests: XCTestCase {
+
+	func testStandardUsecase() {
+		let path = DiagramPath("foo.bar")
+		XCTAssertEqual("bar", path.lastSegment)
+		XCTAssertEqual("foo", path.parentPath)
+	}
+	
+	func testEndWithDot() {
+		let path = DiagramPath("foo.bar.")
+		XCTAssertEqual("", path.lastSegment)
+		XCTAssertEqual("foo.bar", path.parentPath)
+	}
+
+	func testStartEndWithDot() {
+		let path = DiagramPath(".foo.bar.")
+		XCTAssertEqual("", path.lastSegment)
+		XCTAssertEqual(".foo.bar", path.parentPath)
+	}
+
+	func testOnlyDot() {
+		let path = DiagramPath(".")
+		XCTAssertEqual("", path.lastSegment)
+		XCTAssertEqual(".", path.parentPath)
+	}
+
+	func testEmpty() {
+		let path = DiagramPath("")
+		XCTAssertEqual("", path.lastSegment)
+		XCTAssertEqual("", path.parentPath)
+	}
+
+}